5

Python 2.7.3のmp3ファイルからスペクトログラムを直接プロットしようとしています(ubuntuを使用)。私は次のようにwavファイルからそれを行うことができます。

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

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

wavの代わりにmp3ファイルから同じことをする最もクリーンな方法は何ですか?回避できるのであれば、すべてのmp3ファイルをwavに変換したくありません。

4

2 に答える 2

8

Debian / Ubuntuパッケージlibav-toolsavconvをインストールし、mp3を一時的なwavファイルにデコードするために呼び出します。


編集:あなたの他の質問は閉じられたので、ここで私の答えを簡単なバンドパスフィルタリングの例で少し拡張します。リンクしたファイルでは、ほとんどの鳥の鳴き声が4 kHz〜5.5kHzに集中しているように見えます。

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)

鳥の鳴き声のスペクトル

于 2013-03-09T17:07:27.567 に答える
6

mp3ファイルのスペクトログラムをプロットするもう1つの非常に簡単な方法。

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

ここに画像の説明を入力してください

于 2020-03-04T15:16:30.027 に答える