質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

941閲覧

protの構文について

atena

総合スコア20

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/09/28 10:40

###質問したい事
MFCCのリフタリング機能の作成中にエラーが起きたので解決策を教えてほしいです。

###エラー文

Traceback (most recent call last): File "MFCC2.py", line 188, in <module> File "MFCC2.py", line 135, in mfcc File "C:\Program Files\Python36\lib\site-packages\matplotlib\pyplot.py", line 3317, in plot ret = ax.plot(*args, **kwargs) File "C:\Program Files\Python36\lib\site-packages\matplotlib\__init__.py", line 1898, in inner return func(ax, *args, **kwargs) File "C:\Program Files\Python36\lib\site-packages\matplotlib\axes\_axes.py", line 1406, in plot for line in self._get_lines(*args, **kwargs): File "C:\Program Files\Python36\lib\site-packages\matplotlib\axes\_base.py", line 407, in _grab_next_args for seg in self._plot_args(remaining, kwargs): File "C:\Program Files\Python36\lib\site-packages\matplotlib\axes\_base.py", line 385, in _plot_args x, y = self._xy_from_xy(x, y) File "C:\Program Files\Python36\lib\site-packages\matplotlib\axes\_base.py", line 244, in _xy_from_xy "have shapes {} and {}".format(x.shape, y.shape)) ValueError: x and y must have same first dimension, but have shapes (1024,) and (20,)

###ソースコード

#coding:utf-8 import wave import numpy as np import scipy.signal import scipy.fftpack import scipy.fftpack.realtransforms from pylab import * def wavread(filename): wf = wave.open(filename, "r") fs = wf.getframerate() x = wf.readframes(wf.getnframes()) x = np.frombuffer(x, dtype="int16") / 32768.0 # (-1, 1)に正規化 wf.close() return x, float(fs) def preEmphasis(signal, p): # 係数 (1.0, -p) のFIRフィルタを作成 return scipy.signal.lfilter([1.0, -p], 1, signal) def hz2mel(f): # Hzをmelに変換 return 1127.01048 * np.log(f / 700.0 + 1.0) def mel2hz(m): # melをhzに変換 return 700.0 * (np.exp(m / 1127.01048) - 1.0) def melFilterBank(fs, nfft, numChannels): # メルフィルタバンクを作成 # ナイキスト周波数(Hz) fmax = fs / 2 # ナイキスト周波数(mel) melmax = hz2mel(fmax) # 周波数インデックスの最大数 nmax = nfft / 2 # 周波数解像度(周波数インデックス1あたりのHz幅) df = fs / nfft # メル尺度における各フィルタの中心周波数を求める dmel = melmax / (numChannels + 1) melcenters = np.arange(1, numChannels + 1) * dmel # 各フィルタの中心周波数をHzに変換 fcenters = mel2hz(melcenters) # 各フィルタの中心周波数を周波数インデックスに変換 indexcenter = np.round(fcenters / df) # 各フィルタの開始位置のインデックス indexstart = np.hstack(([0], indexcenter[0:numChannels - 1])) # 各フィルタの終了位置のインデックス indexstop = np.hstack((indexcenter[1:numChannels], [nmax])) filterbank = np.zeros((numChannels, int(nmax))) for c in np.arange(0, numChannels): # 三角フィルタの左の直線の傾きから点を求める increment= 1.0 / (indexcenter[c] - indexstart[c]) for i in np.arange(indexstart[c], indexcenter[c]): filterbank[c, int(i)] = (i - indexstart[c]) * increment # 三角フィルタの右の直線の傾きから点を求める decrement = 1.0 / (indexstop[c] - indexcenter[c]) for i in np.arange(indexcenter[c], indexstop[c]): filterbank[c, int(i)] = 1.0 - ((i - indexcenter[c]) * decrement) return filterbank, fcenters def mfcc(signal, nfft, fs, nceps): # プリエンファシスフィルタをかける p = 0.97 # プリエンファシス係数 signal = preEmphasis(signal, p) # ハミング窓をかける hammingWindow = np.hamming(len(signal)) signal = signal * hammingWindow # 振幅スペクトルを求める nfft = 2048 # FFTのサンプル数 spec = np.abs(np.fft.fft(signal, nfft))[:nfft//2] fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft//2] # プロット # plot(fscale, spec) # xlabel("frequency [Hz]") # ylabel("amplitude spectrum") # savefig("spectrum.png") # show() # メルフィルタバンクを作成 numChannels = 20 # メルフィルタバンクのチャネル数 df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅) filterbank, fcenters = melFilterBank(fs, nfft, numChannels) # メルフィルタバンクのプロット # for c in np.arange(0, numChannels): # plot(np.arange(0, nfft / 2) * df, filterbank[c]) # savefig("melfilterbank.png") # show() # 振幅スペクトルにメルフィルタバンクを適用 mspec = np.log10(np.dot(spec, filterbank.T)) # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示 # subplot(211) # plot(fscale, np.log10(spec)) # xlabel("frequency") # xlim(0, 25000) # subplot(212) # plot(fcenters, mspec, "o-") # xlabel("frequency") # xlim(0, 25000) # savefig("result_melfilter3.png") # show() # 離散コサイン変換 ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1) # ローパスリフタ # ケプストラムの高次成分を0にして微細構造を除去し、 # 緩やかなスペクトル包絡のみ抽出 cepCoef = nceps # ケプストラム次数 cpsLif = np.array(ceps) # arrayをコピー cpsLif_P = np.array(ceps) # arrayをコピー # 高周波成分を除く(左右対称なので注意) cpsLif[cepCoef:len(cpsLif) - cepCoef + 1] = 0 # 低周波成分を除く(左右対称なので注意) cpsLif_P[1:cepCoef] = 0 cpsLif_P[len(cpsLif)-(cepCoef-1):len(cpsLif)-1] = 0 # ケプストラム領域をフーリエ変換してスペクトル領域に戻す # リフタリング後の対数スペクトル dftSpc = np.fft.fft(cpsLif, nfft)[:nfft//2] dftSpc_P = np.fft.fft(cpsLif_P, nfft)[:nfft//2] # オリジナルの対数スペクトルを描画 subplot(211) plot(fscale, mspec, "o-") xlabel("frequency [Hz]") ylabel("log amplitude spectrum") xlim(0, 5000) # 高周波成分を除いた声道特性のスペクトル包絡を重ねて描画 subplot(212) plot(fscale, dftSpc, "o-") xlabel("frequency [Hz]") ylabel("log amplitude spectrum") xlim(0, 5000) savefig("spectral1.png") show() # オリジナルの対数スペクトルを描画 subplot(211) plot(fscale, mspec, "o-") xlabel("frequency [Hz]") ylabel("log amplitude spectrum") xlim(0, 5000) # 低周波成分を除いた音源特性のスペクトル包絡を重ねて描画 subplot(212) plot(fscale, dftSpc_P, "o-") xlabel("frequency [Hz]") ylabel("log amplitude spectrum") xlim(0, 5000) savefig("spectral2.png") show() # 低次成分からnceps個の係数を返す return ceps[:nceps] if __name__ == "__main__": # 音声をロード wav, fs = wavread("a_1.wav") t = np.arange(0.0, len(wav) / fs, 1/fs) # 音声波形の中心部分を切り出す center = len(wav) / 2 # 中心のサンプル番号 cuttime = 0.04 # 切り出す長さ [s] wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)] time = t[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)] # 波形をプロット # plot(time * 1000, wavdata) # xlabel("time [ms]") # ylabel("amplitude") # savefig("waveform.png") # show() nfft = 2048 # FFTのサンプル数 nceps = 12 # MFCCの次元数 ceps = mfcc(wavdata, nfft, fs, nceps) print ('mfcc:', ceps)

###詳細
python36
windows10 64bit
ソース元1:http://aidiary.hatenablog.com/entry/20120225/1330179868(大本)
ソース元2:http://aidiary.hatenablog.com/entry/20120211/1328964624(リフタリング:声道特性)
ソース元3:http://speechresearch.fiw-web.net/66.html#o8763891(リフタリング:音源特性改良の参考)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

matplotlib にて plot() する際の、縦軸と横軸の整合が取れていないことが原因かと思います。

エラーを引き起こしているのは

Python

1plot(fscale, mspec, "o-")

と記述している箇所(2箇所)で、縦軸(mspec)はメルフィルタバンクにより20次元に圧縮されたデータですが、横軸(fscale)は振幅スペクトルを表示する為の1024分割された周波数のbinデータになっております。
メルフィルタバンクを表示するときは、横軸をメルフィルタバンク用のbinデータ(fcenters) にして

Python

1plot(fcenters, mspec, "o-")

とする必要があるのではないでしょうか。

投稿2017/09/28 12:24

編集2017/09/28 12:25
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atena

2017/09/29 07:07

なるほど。ありがとうございます。無事解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問