teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

コード表示に変更

2017/09/28 02:26

投稿

atena
atena

スコア20

title CHANGED
File without changes
body CHANGED
@@ -16,6 +16,8 @@
16
16
  IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
17
17
 
18
18
  ###該当のソースコード
19
+ ```ここに言語を入力
20
+ #coding:utf-8
19
21
  import wave
20
22
  import numpy as np
21
23
  import scipy.signal
@@ -41,33 +43,33 @@
41
43
 
42
44
  def melFilterBank(fs, nfft, numChannels):
43
45
  """メルフィルタバンクを作成"""
44
-
46
+ # ナイキスト周波数(Hz)
45
47
  fmax = fs / 2
46
-
48
+ # ナイキスト周波数(mel)
47
49
  melmax = hz2mel(fmax)
48
-
50
+ # 周波数インデックスの最大数
49
51
  nmax = nfft / 2
50
-
52
+ # 周波数解像度(周波数インデックス1あたりのHz幅)
51
53
  df = fs / nfft
52
-
54
+ # メル尺度における各フィルタの中心周波数を求める
53
55
  dmel = melmax / (numChannels + 1)
54
56
  melcenters = np.arange(1, numChannels + 1) * dmel
55
-
57
+ # 各フィルタの中心周波数をHzに変換
56
58
  fcenters = mel2hz(melcenters)
57
-
59
+ # 各フィルタの中心周波数を周波数インデックスに変換
58
60
  indexcenter = np.round(fcenters / df)
59
-
61
+ # 各フィルタの開始位置のインデックス
60
62
  indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
61
-
63
+ # 各フィルタの終了位置のインデックス
62
64
  indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
63
65
 
64
66
  filterbank = np.zeros((numChannels, nmax))
65
67
  for c in np.arange(0, numChannels):
66
-
68
+ # 三角フィルタの左の直線の傾きから点を求める
67
69
  increment= 1.0 / (indexcenter[c] - indexstart[c])
68
70
  for i in np.arange(indexstart[c], indexcenter[c]):
69
- filterbank[c, i] = (i - indexstart[c])*increment
71
+ filterbank[c, i] = int((i - indexstart[c])*increment)
70
-
72
+ # 三角フィルタの右の直線の傾きから点を求める
71
73
  decrement = 1.0 / (indexstop[c] - indexcenter[c])
72
74
  for i in np.arange(indexcenter[c], indexstop[c]):
73
75
  filterbank[c, i] = 1.0 - ((i - indexcenter[c]) * decrement)
@@ -76,7 +78,7 @@
76
78
 
77
79
  def preEmphasis(signal, p):
78
80
  """プリエンファシスフィルタ"""
79
-
81
+ # 係数 (1.0, -p) のFIRフィルタを作成
80
82
  return scipy.signal.lfilter([1.0, -p], 1, signal)
81
83
 
82
84
  def mfcc(signal, nfft, fs, nceps):
@@ -84,46 +86,68 @@
84
86
  signal: 音声信号
85
87
  nfft : FFTのサンプル数
86
88
  nceps : MFCCの次元"""
87
-
89
+ # プリエンファシスフィルタをかける
88
90
  p = 0.97 # プリエンファシス係数
89
91
  signal = preEmphasis(signal, p)
90
92
 
91
-
93
+ # ハミング窓をかける
92
94
  hammingWindow = np.hamming(len(signal))
93
95
  signal = signal * hammingWindow
94
96
 
95
-
97
+ # 振幅スペクトルを求める
96
98
  spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
97
99
  fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
100
+ # plot(fscale, spec)
101
+ # xlabel("frequency [Hz]")
102
+ # ylabel("amplitude spectrum")
103
+ # savefig("spectrum.png")
104
+ # show()
98
105
 
99
-
106
+ # メルフィルタバンクを作成
100
-
101
- numChannels = 20
107
+ numChannels = 20 # メルフィルタバンクのチャネル数
102
- df = fs / nfft
108
+ df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
103
109
  filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
110
+ # for c in np.arange(0, numChannels):
111
+ # plot(np.arange(0, nfft / 2) * df, filterbank[c])
112
+ # savefig("melfilterbank.png")
113
+ # show()
104
114
 
115
+ # 定義通りに書いた場合
116
+ # 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
117
+ # mspec = []
118
+ # for c in np.arange(0, numChannels):
119
+ # mspec.append(np.log10(sum(spec * filterbank[c])))
120
+ # mspec = np.array(mspec)
105
121
 
106
-
122
+ # 行列で書くと簡単になる!
107
-
123
+ # 振幅スペクトルにメルフィルタバンクを適用
108
-
109
-
110
124
  mspec = np.log10(np.dot(spec, filterbank.T))
111
125
 
112
-
126
+ # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示
127
+ # subplot(211)
128
+ # plot(fscale, np.log10(spec))
129
+ # xlabel("frequency")
130
+ # xlim(0, 25000)
131
+ #
132
+ # subplot(212)
133
+ # plot(fcenters, mspec, "o-")
134
+ # xlabel("frequency")
135
+ # xlim(0, 25000)
136
+ # savefig("result_melfilter.png")
137
+ # show()
113
138
 
114
-
139
+ # 離散コサイン変換
115
-
116
140
  ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
117
141
 
118
-
142
+ # 低次成分からnceps個の係数を返す
119
143
  return ceps[:nceps]
120
144
 
121
145
  if __name__ == "__main__":
122
-
146
+ # 音声をロード
123
147
  wav, fs = wavread("a_1.wav")
124
148
  t = np.arange(0.0, len(wav) / fs, 1/fs)
125
149
 
126
-
150
+ # 音声波形の中心部分を切り出す
127
151
  center = len(wav) / 2 # 中心のサンプル番号
128
152
  cuttime = 0.04 # 切り出す長さ [s]
129
153
  wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)]
@@ -132,7 +156,7 @@
132
156
  nceps = 12 # MFCCの次元数
133
157
  ceps = mfcc(wavdata, nfft, fs, nceps)
134
158
  print "mfcc:", ceps
135
-
159
+ ```
136
160
  ###試したこと
137
161
  52行目をint()でキャストしてみましたができませんでした.
138
162
  filterbank[c, i] = int((i - indexstart[c])*increment)

3

エラー文修正

2017/09/28 02:26

投稿

atena
atena

スコア20

title CHANGED
File without changes
body CHANGED
@@ -6,7 +6,14 @@
6
6
 
7
7
 
8
8
  エラーメッセージ
9
+ Traceback (most recent call last):
10
+ File "MFCC.py", line 138, in <module>
11
+ ceps = mfcc(wavdata, nfft, fs, nceps)
12
+ File "MFCC.py", line 90, in mfcc
13
+ filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
14
+ File "MFCC.py", line 52, in melFilterBank
15
+ filterbank[c, i] = int((i - indexstart[c]))*int(increment)
9
- IndeEerror: only integers, slices (':'), ellipsis ('...'), numpy.newaxis ('None') and integer or boolean arrays are valid indices
16
+ IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
10
17
 
11
18
  ###該当のソースコード
12
19
  import wave
@@ -128,8 +135,9 @@
128
135
 
129
136
  ###試したこと
130
137
  52行目をint()でキャストしてみましたができませんでした.
138
+ filterbank[c, i] = int((i - indexstart[c])*increment)
131
139
 
132
140
  ###補足情報(言語/FW/ツール等のバージョンなど)
133
141
  windows7 32bit
134
142
  python27
135
- ド詳細:http://aidiary.hatenablog.com/entry/20120225/1330179868
143
+ ス元:http://aidiary.hatenablog.com/entry/20120225/1330179868

2

詳細設定

2017/09/28 01:58

投稿

atena
atena

スコア20

title CHANGED
File without changes
body CHANGED
@@ -131,4 +131,5 @@
131
131
 
132
132
  ###補足情報(言語/FW/ツール等のバージョンなど)
133
133
  windows7 32bit
134
- python27
134
+ python27
135
+ コード詳細:http://aidiary.hatenablog.com/entry/20120225/1330179868

1

コードの修正

2017/09/28 01:53

投稿

atena
atena

スコア20

title CHANGED
File without changes
body CHANGED
@@ -9,7 +9,6 @@
9
9
  IndeEerror: only integers, slices (':'), ellipsis ('...'), numpy.newaxis ('None') and integer or boolean arrays are valid indices
10
10
 
11
11
  ###該当のソースコード
12
- #coding:utf-8
13
12
  import wave
14
13
  import numpy as np
15
14
  import scipy.signal
@@ -35,33 +34,33 @@
35
34
 
36
35
  def melFilterBank(fs, nfft, numChannels):
37
36
  """メルフィルタバンクを作成"""
38
- # ナイキスト周波数(Hz)
37
+
39
38
  fmax = fs / 2
40
- # ナイキスト周波数(mel)
39
+
41
40
  melmax = hz2mel(fmax)
42
- # 周波数インデックスの最大数
41
+
43
42
  nmax = nfft / 2
44
- # 周波数解像度(周波数インデックス1あたりのHz幅)
43
+
45
44
  df = fs / nfft
46
- # メル尺度における各フィルタの中心周波数を求める
45
+
47
46
  dmel = melmax / (numChannels + 1)
48
47
  melcenters = np.arange(1, numChannels + 1) * dmel
49
- # 各フィルタの中心周波数をHzに変換
48
+
50
49
  fcenters = mel2hz(melcenters)
51
- # 各フィルタの中心周波数を周波数インデックスに変換
50
+
52
51
  indexcenter = np.round(fcenters / df)
53
- # 各フィルタの開始位置のインデックス
52
+
54
53
  indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
55
- # 各フィルタの終了位置のインデックス
54
+
56
55
  indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
57
56
 
58
57
  filterbank = np.zeros((numChannels, nmax))
59
58
  for c in np.arange(0, numChannels):
60
- # 三角フィルタの左の直線の傾きから点を求める
59
+
61
60
  increment= 1.0 / (indexcenter[c] - indexstart[c])
62
61
  for i in np.arange(indexstart[c], indexcenter[c]):
63
62
  filterbank[c, i] = (i - indexstart[c])*increment
64
- # 三角フィルタの右の直線の傾きから点を求める
63
+
65
64
  decrement = 1.0 / (indexstop[c] - indexcenter[c])
66
65
  for i in np.arange(indexcenter[c], indexstop[c]):
67
66
  filterbank[c, i] = 1.0 - ((i - indexcenter[c]) * decrement)
@@ -70,7 +69,7 @@
70
69
 
71
70
  def preEmphasis(signal, p):
72
71
  """プリエンファシスフィルタ"""
73
- # 係数 (1.0, -p) のFIRフィルタを作成
72
+
74
73
  return scipy.signal.lfilter([1.0, -p], 1, signal)
75
74
 
76
75
  def mfcc(signal, nfft, fs, nceps):
@@ -78,68 +77,46 @@
78
77
  signal: 音声信号
79
78
  nfft : FFTのサンプル数
80
79
  nceps : MFCCの次元"""
81
- # プリエンファシスフィルタをかける
80
+
82
81
  p = 0.97 # プリエンファシス係数
83
82
  signal = preEmphasis(signal, p)
84
83
 
85
- # ハミング窓をかける
84
+
86
85
  hammingWindow = np.hamming(len(signal))
87
86
  signal = signal * hammingWindow
88
87
 
89
- # 振幅スペクトルを求める
88
+
90
89
  spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
91
90
  fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
92
- # plot(fscale, spec)
93
- # xlabel("frequency [Hz]")
94
- # ylabel("amplitude spectrum")
95
- # savefig("spectrum.png")
96
- # show()
97
91
 
98
- # メルフィルタバンクを作成
92
+
93
+
99
- numChannels = 20 # メルフィルタバンクのチャネル数
94
+ numChannels = 20
100
- df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
95
+ df = fs / nfft
101
96
  filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
102
- # for c in np.arange(0, numChannels):
103
- # plot(np.arange(0, nfft / 2) * df, filterbank[c])
104
- # savefig("melfilterbank.png")
105
- # show()
106
97
 
107
- # 定義通りに書いた場合
108
- # 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
109
- # mspec = []
110
- # for c in np.arange(0, numChannels):
111
- # mspec.append(np.log10(sum(spec * filterbank[c])))
112
- # mspec = np.array(mspec)
113
98
 
114
- # 行列で書くと簡単になる!
99
+
115
- # 振幅スペクトルにメルフィルタバンクを適用
100
+
101
+
102
+
116
103
  mspec = np.log10(np.dot(spec, filterbank.T))
117
104
 
118
- # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示
105
+
119
- # subplot(211)
120
- # plot(fscale, np.log10(spec))
121
- # xlabel("frequency")
122
- # xlim(0, 25000)
123
- #
124
- # subplot(212)
125
- # plot(fcenters, mspec, "o-")
126
- # xlabel("frequency")
127
- # xlim(0, 25000)
128
- # savefig("result_melfilter.png")
129
- # show()
130
106
 
131
- # 離散コサイン変換
107
+
108
+
132
109
  ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
133
110
 
134
- # 低次成分からnceps個の係数を返す
111
+
135
112
  return ceps[:nceps]
136
113
 
137
114
  if __name__ == "__main__":
138
- # 音声をロード
115
+
139
116
  wav, fs = wavread("a_1.wav")
140
117
  t = np.arange(0.0, len(wav) / fs, 1/fs)
141
118
 
142
- # 音声波形の中心部分を切り出す
119
+
143
120
  center = len(wav) / 2 # 中心のサンプル番号
144
121
  cuttime = 0.04 # 切り出す長さ [s]
145
122
  wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)]