如何解释 mp3/wav 文件的 matplotlib 图中的各种颜色

Posted

技术标签:

【中文标题】如何解释 mp3/wav 文件的 matplotlib 图中的各种颜色【英文标题】:How to interpret various colors in matplotlib plot of a mp3/wav file 【发布时间】:2017-10-25 21:00:17 【问题描述】:

我是 python 新手和音频分析新手。如果这不是这个问题的正确位置,请指出我正确的位置。

我有一个只有静音的 mp3 音频文件。 使用 sox 转换为 .wav sox input.mp3 output.wav

from scipy.io.wavfile import read
import matplotlib.pyplot as plt
(fs,x)=read('/home/vivek/Documents/VivekProjects/Silence/silence.wav')
##plt.rcParams['agg.path.chunksize'] = 5000 # for preventing overflow error. 
fs
x.size/float(fs)
plt.plot(x) 

生成此图像:

我也用过这个问题的解决方案:How to plot a wav file

    from scipy.io.wavfile import read
    import matplotlib.pyplot as plt

    # read audio samples
    from scipy.io.wavfile import read
import matplotlib.pyplot as plt

# read audio samples
input_data = read("/home/vivek/Documents/VivekProjects/Silence/silence.wav")
audio = input_data[1]
# plot the first 1024 samples
plt.plot(audio)
# label the axes
plt.ylabel("Amplitude")
plt.xlabel("Time")
# set the title  
plt.title("Sample Wav")
# display the plot
plt.show()

生成此图像:

问题: 我想知道如何解释图表中不同的颜色条(蓝绿色,黄色)。如果你听文件,它只是沉默,如果有的话,我预计只会看到一条平线。

我的mp3文件可以从here下载。 sox转换后的wav文件可以在here找到。

即使文件是静默的,即使 Dropbox 也在生成波形。我似乎无法弄清楚为什么。

【问题讨论】:

你什么都听不见并不意味着它是完全沉默? 【参考方案1】:

首先,在绘图之前始终检查数据的形状。

x.shape
## (3479040, 2)

所以这里的 2 表示您的 .wav 文件中有两个通道,matplotlib 默认情况下以不同的颜色绘制它们。在这种情况下,您需要逐行分割矩阵。

import matplotlib.pyplot as plt
ind = int(fs * 0.5) ## plot first 500ms
### plot as time series
plt.plot(x[:ind,:])
plt.figure()

#### Visualise distribution
plt.hist(x[:ind,0],bins = 10)
plt.gca().set_yscale('log')

##### 
print x.min(),x.max()
#### -3 3

从图中可以看出,信号的绝对值非常低(-3,3)。根据 .wav 文件的编码(整数或浮点数),它将被转换为振幅(但可能是非常低的振幅,这就是它静音的原因)。

我自己不熟悉精确的编码。但是这个页面可能会有所帮助:http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

    对于除 PCM 之外的所有格式,格式块必须有一个扩展部分。扩展可以是零长度,但大小 字段(值为 0)必须存在。 对于浮点数据,满量程为 1。比特/样本通常为 32 或 64。 对于 log-PCM 格式(µ-law 和 A-law),Rev. 3 文档指出比特/样本字段 (wBitsPerSample) 应设置为 8 位。 非 PCM 格式必须有一个事实块。

PS:如果您想开始一些更高级的音频分析,请查看workshop,我发现它非常实用,尤其是能量部分和 FFT 部分。

【讨论】:

对不起,我不明白。在high frequency 绘制是什么意思。我想知道为什么图中会有多色峰。此外,如果您查看 Dropbox 上的文件,它们也会生成波形。关于为什么会发生这种情况的任何提示。 很好地使用直方图来显示分布,+1。您可能应该删除 ---old answer --- 部分 建议采纳@DavidG【参考方案2】:

我怀疑您的 silence.mp3 文件中的音频非常低(低于人类听力),因为即使我以最大扬声器声音播放时也听不到它。

所以,我遇到了从mp3 和here 绘制音频

首先我们将mp3 音频转换为wav。由于父文件是立体声,转换后的wav 文件也是立体声。为了证明有音频,我们只需要单声道。 一旦我们有了单通道wav 音频,我们就可以简单地绘制frequencytime 索引,颜色条为dB 功率水平。

import scipy.io.wavfile
from pydub import Audiosegment
import matplotlib.pyplot as plt
import numpy as np
from numpy import fft as fft

#read mp3 file
mp3 = AudioSegment.from_mp3("silence.mp3")
#convert to wav
mp3.export("silence.wav", format="wav")
#read wav file
rate,audData=scipy.io.wavfile.read("silence.wav")


#if stereo grab both channels
channel1=audData[:,0] #left
#channel2=audData[:,1] #right channel, we dont need here


#create a time variable in seconds
time = np.arange(0, float(audData.shape[0]), 1) / rate

#Plot spectrogram of frequency vs time
plt.figure(1, figsize=(8,6))
plt.subplot(211)
Pxx, freqs, bins, im = plt.specgram(channel1, Fs=rate, NFFT=1024, cmap=plt.get_cmap('autumn_r'))
cbar=plt.colorbar(im)
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
cbar.set_label('Intensity dB')
plt.show()

正如您在图片中看到的那样,silence.mp3 确实包含可能具有 -30 到 -45 dB 功率水平的音频频率。

【讨论】:

那么audData 中保存了什么? 音频样本作为 numpy 数组保存在 audData 中。您可以检查为 type(audData) -> array([[ 0, 0], [ 0, 0], [ 0, 0], ..., [-1, 0 ], [ 0, 0], [ 0, 0]], dtype=int16) 先生,我的意思是幅度、分贝或功率.. audData 中存储的“特征”是什么? 以上都不是。 Wav 文件以线性脉冲编码调制 (LPCM) 格式存储数据。它们由 numpy 数组指示的数据类型是“int16”,表示“16 位 PCM”。查看 docs.scipy.org/doc/scipy/reference/generated/… 以及 wav 上的 WIKI en.wikipedia.org/wiki/WAV

以上是关于如何解释 mp3/wav 文件的 matplotlib 图中的各种颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 脚本停止/关闭音频文件(mp3/.wav)

如何在没有关联应用程序的情况下直接播放声音文件(mp3、wav 等)?

MP3/wav 音频文件的持续时间

从 mp3/wav 文件生成声波图像?

从内存流播放 mp3/wav 文件到网页

Python播放mp3/wav文件音频(Pygame混音器)