2016-04-27 16 views
1

私は現在、機械学習で分類する必要があるオーディオクリップを数千個持っています。オーディオスペクトログラムをPythonでプロットする

私は、オーディオを短時間フーリエ変換すると2次元画像に変わるので、オーディオファイル自体ではなく、これらの画像でさまざまな画像分類アルゴリズムを使用できることがわかりました。

この目的のために、STFTを行うpython packageが見つかりました。私が必要とするのは、画像を得るためにプロットすることだけです。プロットすると、私はthis 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") 

を、出力は次のとおりです:

最後に私のコードは、このよう終わった enter image description here

コードが動作するには、しかし、私はprint X.shape行が実行されたとき、私は(513L, 943L, 2L)を得ることを観察しました。結果は3次元です。だから私はX[:][:][0]またはX[:][:][1]と書くだけでイメージが得られます。

私はこの「冗長性」を読んでいます.STFTには、必要がないために半分を削除することができます。その3次元は冗長性ですか、私はここで何か非常に間違っていますか?もしそうなら、私はそれを適切にプロットするのですか?

ありがとうございます。

編集: だから、新しいコードと出力は次のようになります。左側に

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") 

enter image description here

私は色のほとんど目に見えない列を取得します。私が取り組んでいる音は呼吸音なので、周波数は非常に低いです。多分、それは視覚化が色の非常に薄い列である理由です。

答えて

1

おそらくステレオオーディオファイルがありますか?したがって、X[:][:][0]X[:][:][1]は各チャンネルに対応します。

scipy.mean(audio, axis=1)でマルチチャンネルをモノラルに変換できます。

関連する問題