Python 从mp3绘制spectrogram图
我试图直接从Python2.7.3(使用ubuntu)中的mp3文件中绘制一个spectrogram。我可以从一个wav文件中执行它,如下所示Python 从mp3绘制spectrogram图,python,audio,signal-processing,Python,Audio,Signal Processing,我试图直接从Python2.7.3(使用ubuntu)中的mp3文件中绘制一个spectrogram。我可以从一个wav文件中执行它,如下所示 #!/usr/bin/python from scikits.audiolab import wavread from pylab import * signal, fs, enc = wavread('XC124158.wav') specgram(signal) show() 用mp3文件而不是wav文件做同样的事情,最干净的方法是什么?如果可以
#!/usr/bin/python
from scikits.audiolab import wavread
from pylab import *
signal, fs, enc = wavread('XC124158.wav')
specgram(signal)
show()
用mp3文件而不是wav文件做同样的事情,最干净的方法是什么?如果可以避免的话,我不想将所有mp3文件都转换成wav。我会安装Debian/Ubuntu软件包并调用
avconv
将mp3解码为临时wav文件:
编辑:你的另一个问题已经结束了,所以我将在这里用一个简单的带通滤波示例来扩展我的答案。在您链接的文件中,看起来大部分鸟鸣集中在4 kHz-5.5 kHz
import os
from subprocess import check_call
from tempfile import mktemp
from scikits.audiolab import wavread, play
from scipy.signal import remez, lfilter
from pylab import *
# convert mp3, read wav
mp3filename = 'XC124158.mp3'
wname = mktemp('.wav')
check_call(['avconv', '-i', mp3filename, wname])
sig, fs, enc = wavread(wname)
os.unlink(wname)
# bandpass filter
bands = array([0,3500,4000,5500,6000,fs/2.0]) / fs
desired = [0, 1, 0]
b = remez(513, bands, desired)
sig_filt = lfilter(b, 1, sig)
sig_filt /= 1.05 * max(abs(sig_filt)) # normalize
subplot(211)
specgram(sig, Fs=fs, NFFT=1024, noverlap=0)
axis('tight'); axis(ymax=8000)
title('Original')
subplot(212)
specgram(sig_filt, Fs=fs, NFFT=1024, noverlap=0)
axis('tight'); axis(ymax=8000)
title('Filtered')
show()
play(sig_filt, fs)
另一种绘制mp3文件频谱图的非常简单的方法
from pydub import AudioSegment
import matplotlib.pyplot as plt
from scipy.io import wavfile
from tempfile import mktemp
mp3_audio = AudioSegment.from_file('speech.mp3', format="mp3") # read mp3
wname = mktemp('.wav') # use temporary file
mp3_audio.export(wname, format="wav") # convert to wav
FS, data = wavfile.read(wname) # read wav file
plt.specgram(data, Fs=FS, NFFT=128, noverlap=0) # plot
plt.show()
这使用了pydub
库,与调用外部命令相比更方便。
这样,您可以迭代所有.mp3
文件,而无需在打印之前将其转换为.wav
谢谢。这是可行的,但它给出的光谱图略有不同。原来的mp3在。除了x轴的标签不同之外,主要区别在于使用原始mp3和代码的版本在图像的末尾和顶部都有一个空白段。我制作wav版本只是通过对XC124158.mp3进行lame解码。我只是看到你可能也知道。如果你对此也有任何看法,那就太好了。我将其简化为只使用
mktemp
(结果表明avconv无法在管道中写入正确的wav头),并在FFT中添加了更多的容器,没有重叠。轴(“紧”)去除空白部分。您可能还需要使用轴(ymax=8000),因为大部分功率低于8 kHz。欢迎使用。滤波器并不是一个完美的解决方案,但就其简单性而言,它提供的效果相当不错。典型的音频不是频谱稳定的,所以通常需要自适应滤波。@erykson,谢谢。现在我有一个小任务,就是在所有的噪音中寻找鸟的声音。你知道在你的python代码播放的版本中,嗡嗡声/噼啪声是从哪里来的吗?这应该是公认的答案,最简单,可以直接从python在一个脚本中完成。