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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

解決済

エラー分の解決をお願いしたいです

atena
atena

総合スコア20

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

2回答

0リアクション

0クリップ

1932閲覧

投稿2017/09/28 01:38

編集2017/09/28 02:26

###前提・実現したいこと
MFCCの機能を実装したいと思っています.
実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

エラーメッセージ
Traceback (most recent call last):
File "MFCC.py", line 138, in <module>
ceps = mfcc(wavdata, nfft, fs, nceps)
File "MFCC.py", line 90, in mfcc
filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
File "MFCC.py", line 52, in melFilterBank
filterbank[c, i] = int((i - indexstart[c]))*int(increment)
IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices

###該当のソースコード

#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 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, 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, i] = int((i - indexstart[c])*increment) # 三角フィルタの右の直線の傾きから点を求める decrement = 1.0 / (indexstop[c] - indexcenter[c]) for i in np.arange(indexcenter[c], indexstop[c]): filterbank[c, i] = 1.0 - ((i - indexcenter[c]) * decrement) return filterbank, fcenters def preEmphasis(signal, p): """プリエンファシスフィルタ""" # 係数 (1.0, -p) のFIRフィルタを作成 return scipy.signal.lfilter([1.0, -p], 1, signal) def mfcc(signal, nfft, fs, nceps): """信号のMFCCパラメータを求める signal: 音声信号 nfft : FFTのサンプル数 nceps : MFCCの次元""" # プリエンファシスフィルタをかける p = 0.97 # プリエンファシス係数 signal = preEmphasis(signal, p) # ハミング窓をかける hammingWindow = np.hamming(len(signal)) signal = signal * hammingWindow # 振幅スペクトルを求める 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 = [] # for c in np.arange(0, numChannels): # mspec.append(np.log10(sum(spec * filterbank[c]))) # mspec = np.array(mspec) # 行列で書くと簡単になる! # 振幅スペクトルにメルフィルタバンクを適用 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_melfilter.png") # show() # 離散コサイン変換 ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1) # 低次成分から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)] nfft = 2048 # FFTのサンプル数 nceps = 12 # MFCCの次元数 ceps = mfcc(wavdata, nfft, fs, nceps) print "mfcc:", ceps

###試したこと
52行目をint()でキャストしてみましたができませんでした.
filterbank[c, i] = int((i - indexstart[c])*increment)

###補足情報(言語/FW/ツール等のバージョンなど)
windows7 32bit
python27
ソース元:http://aidiary.hatenablog.com/entry/20120225/1330179868

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

can110

2017/09/28 01:50

参考にされたソース元の明示/エラーの完全なTraceback/コード部分の修正(コード表示になるように)をお願いします。
atena

2017/09/28 01:59

わかりました。
atena

2017/09/28 02:10

修正しましたがどうでしょうか?
can110

2017/09/28 02:17

修正ありがとうございます。可能でしたらコード表示になるよう修正ください(コード前後を```で囲む)。pythonコードはインデントが重要なので
can110

2017/09/28 02:20

参考元ソース「MFCC.py」に手を加えていなければ、コード表示にならなくても大丈夫です。
atena

2017/09/28 02:27

コード表示に修正しました。
can110

2017/09/28 02:56 編集

もう1点だけお願いします。python3.x環境は利用できますか?利用できれば3.x環境でも同様エラー発生するか確認ください。←元ソースもpython2.x用ですね。すみません。これは無視してください(確認不要)。
Lhankor_Mhy

2017/09/28 02:41

np.round は float を返すので i は int ではないのでは?
atena

2017/09/28 04:52

>>>can110 同じエラーでした。
atena

2017/09/28 05:05

>>>Lhankor_Mhy なるほど。ありがとうございます。解決しました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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