2013-03-09 43 views
2

我想直接從python 2.7.3(使用ubuntu)的mp3文件中繪製一個譜圖。我可以從wav文件中做到如下。來自mp3的劇情譜圖

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

signal, fs, enc = wavread('XC124158.wav') 
specgram(signal) 
show() 

什麼是從一個MP3文件,而不是一個WAV做同樣的事情最乾淨的方法?如果我能避免它,我不想將所有的mp3文件轉換爲wav。

回答

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) 

Bird Song Spectrgrams

+0

感謝。這有效,但它給出了略有不同的譜。原始的mp3在http://www.xeno-canto.org/download.php?XC=124158。與x軸標記不同的主要區別在於,使用原始mp3和您的代碼的版本在結尾處以及在圖像的頂部都包含空白時段。我只是做了跛腳版本的wav版本 - 解碼XC124158.mp3。 – Majid 2013-03-09 18:09:09

+0

我剛纔看到你也可能知道http://stackoverflow.com/questions/15309155/extract-faint-bird-song-from-background-noise。如果你對此也有任何意見,那將是非常棒的。 – Majid 2013-03-09 18:42:37

+0

我將其簡化爲只使用'mktemp'(事實證明,avconv無法在管道中編寫正確的wav頭文件)並向FFT中添加了更多的bin,並且沒有重疊。軸('緊')擺脫空白部分。您可能也想使用'axis(ymax = 8000)',因爲大部分功率都低於8 kHz。 – eryksun 2013-03-09 20:10:46