[英]Plotting audio spectrogram in python
我目前有幾千個音頻剪輯需要用機器學習進行分類。
經過一番挖掘,我發現如果對音頻進行短時間傅立葉變換,它會變成二維圖像,因此我可以對這些圖像使用各種圖像分類算法,而不是音頻文件本身。
為此,我找到了一個執行 STFT 的python 包,我所需要的只是繪制它,以便我可以獲得圖像。 對於繪圖,我發現這個 github repo非常有用。
最后我的代碼變成了這樣:
import stft
import scipy
import scipy.io.wavfile as wav
import matplotlib.pylab as pylab
def save_stft_image(source_filename, destination_filename):
fs, audio = wav.read(source_filename)
X = stft.spectrogram(audio)
print X.shape
fig = pylab.figure()
ax = pylab.Axes(fig, [0,0,1,1])
ax.set_axis_off()
fig.add_axes(ax)
pylab.imshow(scipy.absolute(X[:][:][0].T), origin='lower', aspect='auto', interpolation='nearest')
pylab.savefig(destination_filename)
save_stft_image("Example.wav","Example.png")
代碼有效,但是我觀察到當print X.shape
line 執行時我得到(513L, 943L, 2L)
。 所以結果是3維的。 因此,當我只寫X[:][:][0]
或X[:][:][1]
我會得到一個圖像。
我一直在閱讀這個“冗余”STFT,你可以刪除一半,因為你不需要它。 那個第三維是冗余還是我在這里做錯了什么? 如果是這樣,我如何正確地繪制它?
謝謝你。
編輯:所以新的代碼和輸出是:
import stft
import os
import scipy
import scipy.io.wavfile as wav
import matplotlib.pylab as pylab
def save_stft_image(source_filename, destination_filename):
fs, audio = wav.read(source_filename)
audio = scipy.mean(audio, axis = 1)
X = stft.spectrogram(audio)
print X.shape
fig = pylab.figure()
ax = pylab.Axes(fig, [0,0,1,1])
ax.set_axis_off()
fig.add_axes(ax)
pylab.imshow(scipy.absolute(X.T), origin='lower', aspect='auto', interpolation='nearest')
pylab.savefig(destination_filename)
save_stft_image("Example.wav","Example.png")
在左邊,我得到一列幾乎不可見的顏色。 我正在研究的聲音是呼吸音,所以它們的頻率非常低。 也許這就是為什么可視化是一個非常細的顏色列。
你可能有一個立體聲音頻文件? 所以X[:][:][0]
和X[:][:][1]
對應每個通道。
您可以通過scipy.mean(audio, axis=1)
將多聲道轉換為單聲道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.