私は現在、機械学習で分類する必要があるオーディオクリップを数千個持っています。オーディオスペクトログラムを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")
を、出力は次のとおりです:
コードが動作するには、しかし、私は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")
私は色のほとんど目に見えない列を取得します。私が取り組んでいる音は呼吸音なので、周波数は非常に低いです。多分、それは視覚化が色の非常に薄い列である理由です。