如何解释 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
音频,我们就可以简单地绘制frequency
与time
索引,颜色条为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)
-> 以上是关于如何解释 mp3/wav 文件的 matplotlib 图中的各种颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 脚本停止/关闭音频文件(mp3/.wav)