プログラミングにふれてまだ1か月ほどの初心者です。
このブログと、このGithubサイトを参考にしながら、Python3でコードを組みました。
目的は、a.wavという音声の振幅スペクトルの表示です。
jupyterを使い、コードを保存したディレクトリと同じディレクトリにa.wavを保存してあります。
以下が、振幅スペクトルの表示までを目的として組んだコードです。
python
1#http://aidiary.hatenablog.com/entry/20120225/1330179868 2 3#coding:utf-8 4import wave 5import numpy as np 6import scipy.signal 7import scipy.fftpack 8import scipy.fftpack.realtransforms 9from pylab import * 10 11def wavread(filename): 12 wf = wave.open(filename, "r") 13 fs = wf.getframerate() 14 x = wf.readframes(wf.getnframes()) 15 x = np.frombuffer(x, dtype="int16") / 32768.0 # (-1, 1)に正規化 16 wf.close() 17 return x, float(fs) 18 19if __name__ == "__main__": 20# 音声をロード 21 wav, fs = wavread("a.wav") 22t = np.arange(0.0, len(wav) / fs, 1/fs) 23 24# 音声波形の中心部分を切り出す 25center = len(wav) / 2 # 中心のサンプル番号 26cuttime = 0.04 # 切り出す長さ [s] 27z = center-cuttime / 2*fs 28q = center + cuttime / 2*fs 29wavdata = wav[int(z):int(q)] 30time = t[int(z):int(q)] 31 32""" 33# 波形をプロット 34plot(time * 1000, wavdata) 35xlabel("time [ms]") 36ylabel("amplitude") 37savefig("waveform.png") 38show() 39""" 40 41 42#プリエンファシスフィルタ 43import scipy.signal 44 45def preEmphasis(signal, p): 46 """プリエンファシスフィルタ""" 47 # 係数 (1.0, -p) のFIRフィルタを作成 48 return scipy.signal.lfilter([1.0, -p], 1, signal) 49 50def mfcc(signal, nfft, fs, nceps): 51# プリエンファシスフィルタをかける 52 p = 0.97 # プリエンファシス係数 53 signal = preEmphasis(signal, p) 54 55 # ハミング窓をかける 56 hammingWindow = np.hamming(len(signal)) 57 signal = signal * hammingWindow 58 59 # 振幅スペクトルを求める 60 nfft = 2048 # FFTのサンプル数 61 spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2] 62 fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2] 63 64 # プロット 65 plot(fscale, spec) 66 xlabel("frequency [Hz]") 67 ylabel("amplitude spectrum") 68 savefig("spectrum.png") 69 show()
しかし、これを動作させてもjupyterは無反応でした。
途中の「"""」で囲った「#波形をプロット」項を動作させるとそこまでは動くのですが、振幅スペクトルのプロットができない状態です。
どこをどのように直せばよいか、コードも含め具体的に教えてください。
また、もし振幅スペクトルの表示ができる、動作確認がなされたコードをお持ちの方がいらっしゃいましたら、共有していただけると幸いです。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。