簡體   English   中英

在python中繪制音頻頻譜圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM