从mp3剧情画

Maj*_*jid 2 python audio signal-processing

我试图直接从python 2.7.3(使用ubuntu)中的mp3文件绘制一个视频.我可以从wav文件中执行以下操作.

#!/usr/bin/python
from scikits.audiolab import wavread
from pylab import *

signal, fs, enc = wavread('XC124158.wav')
specgram(signal)
show()
Run Code Online (Sandbox Code Playgroud)

从mp3文件而不是wav做同样事情最干净的方法是什么?如果我可以避免它,我不想将所有mp3文件转换为wav.

Ery*_*Sun 7

我将安装Debian/Ubuntu软件包libav-tools并调用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)
Run Code Online (Sandbox Code Playgroud)

鸟歌谱


dsa*_*laj 6

另一种非常简单的绘制 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()
Run Code Online (Sandbox Code Playgroud)

这使用了pydub比调用外部命令更方便的库。通过这种方式,您可以遍历所有.mp3文件,而无需.wav在绘图之前将它们转换为 。

在此处输入图片说明

  • 应该是公认的答案,最简单,可以直接从 python 在单个脚本中完成。 (2认同)