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

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

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

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

Python

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

Q&A

解決済

2回答

2216閲覧

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

atena

総合スコア20

Python 2.7

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

Python

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

0グッド

0クリップ

投稿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

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

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

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

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

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

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 なるほど。ありがとうございます。解決しました。
guest

回答2

0

自己解決

filterbank[c, int(i)] = (i - indexstart[c])*increment

iをintでキャスト

投稿2017/09/28 05:07

atena

総合スコア20

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

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

can110

2017/09/28 05:12

一足遅かった。。処理詳細は理解できていませんが プラス「filterbank[c, int(i)] = 1.0 - ((i - indexcenter[c]) * decrement)」ですね。 解決してよかったです。
guest

0

IndexError: only integers
とでてるので、要素数指定するとこに、数字以外が入ってるんじゃないでしょうか?

投稿2017/09/28 02:31

ShinyaMurakami

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問