質問編集履歴
4
コード表示に変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -34,6 +34,10 @@
|
|
34
34
|
|
35
35
|
###該当のソースコード
|
36
36
|
|
37
|
+
```ここに言語を入力
|
38
|
+
|
39
|
+
#coding:utf-8
|
40
|
+
|
37
41
|
import wave
|
38
42
|
|
39
43
|
import numpy as np
|
@@ -84,41 +88,41 @@
|
|
84
88
|
|
85
89
|
"""メルフィルタバンクを作成"""
|
86
90
|
|
87
|
-
|
91
|
+
# ナイキスト周波数(Hz)
|
88
92
|
|
89
93
|
fmax = fs / 2
|
90
94
|
|
91
|
-
|
95
|
+
# ナイキスト周波数(mel)
|
92
96
|
|
93
97
|
melmax = hz2mel(fmax)
|
94
98
|
|
95
|
-
|
99
|
+
# 周波数インデックスの最大数
|
96
100
|
|
97
101
|
nmax = nfft / 2
|
98
102
|
|
99
|
-
|
103
|
+
# 周波数解像度(周波数インデックス1あたりのHz幅)
|
100
104
|
|
101
105
|
df = fs / nfft
|
102
106
|
|
103
|
-
|
107
|
+
# メル尺度における各フィルタの中心周波数を求める
|
104
108
|
|
105
109
|
dmel = melmax / (numChannels + 1)
|
106
110
|
|
107
111
|
melcenters = np.arange(1, numChannels + 1) * dmel
|
108
112
|
|
109
|
-
|
113
|
+
# 各フィルタの中心周波数をHzに変換
|
110
114
|
|
111
115
|
fcenters = mel2hz(melcenters)
|
112
116
|
|
113
|
-
|
117
|
+
# 各フィルタの中心周波数を周波数インデックスに変換
|
114
118
|
|
115
119
|
indexcenter = np.round(fcenters / df)
|
116
120
|
|
117
|
-
|
121
|
+
# 各フィルタの開始位置のインデックス
|
118
122
|
|
119
123
|
indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
|
120
124
|
|
121
|
-
|
125
|
+
# 各フィルタの終了位置のインデックス
|
122
126
|
|
123
127
|
indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
|
124
128
|
|
@@ -128,15 +132,15 @@
|
|
128
132
|
|
129
133
|
for c in np.arange(0, numChannels):
|
130
134
|
|
131
|
-
|
135
|
+
# 三角フィルタの左の直線の傾きから点を求める
|
132
136
|
|
133
137
|
increment= 1.0 / (indexcenter[c] - indexstart[c])
|
134
138
|
|
135
139
|
for i in np.arange(indexstart[c], indexcenter[c]):
|
136
140
|
|
137
|
-
filterbank[c, i] = (i - indexstart[c])*increment
|
141
|
+
filterbank[c, i] = int((i - indexstart[c])*increment)
|
142
|
+
|
138
|
-
|
143
|
+
# 三角フィルタの右の直線の傾きから点を求める
|
139
|
-
|
140
144
|
|
141
145
|
decrement = 1.0 / (indexstop[c] - indexcenter[c])
|
142
146
|
|
@@ -154,7 +158,7 @@
|
|
154
158
|
|
155
159
|
"""プリエンファシスフィルタ"""
|
156
160
|
|
157
|
-
|
161
|
+
# 係数 (1.0, -p) のFIRフィルタを作成
|
158
162
|
|
159
163
|
return scipy.signal.lfilter([1.0, -p], 1, signal)
|
160
164
|
|
@@ -170,7 +174,7 @@
|
|
170
174
|
|
171
175
|
nceps : MFCCの次元"""
|
172
176
|
|
173
|
-
|
177
|
+
# プリエンファシスフィルタをかける
|
174
178
|
|
175
179
|
p = 0.97 # プリエンファシス係数
|
176
180
|
|
@@ -178,7 +182,7 @@
|
|
178
182
|
|
179
183
|
|
180
184
|
|
181
|
-
|
185
|
+
# ハミング窓をかける
|
182
186
|
|
183
187
|
hammingWindow = np.hamming(len(signal))
|
184
188
|
|
@@ -186,53 +190,97 @@
|
|
186
190
|
|
187
191
|
|
188
192
|
|
189
|
-
|
193
|
+
# 振幅スペクトルを求める
|
190
194
|
|
191
195
|
spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
|
192
196
|
|
193
197
|
fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
|
194
198
|
|
195
|
-
|
199
|
+
# plot(fscale, spec)
|
200
|
+
|
196
|
-
|
201
|
+
# xlabel("frequency [Hz]")
|
202
|
+
|
197
|
-
|
203
|
+
# ylabel("amplitude spectrum")
|
204
|
+
|
198
|
-
|
205
|
+
# savefig("spectrum.png")
|
206
|
+
|
199
|
-
|
207
|
+
# show()
|
208
|
+
|
209
|
+
|
210
|
+
|
200
|
-
|
211
|
+
# メルフィルタバンクを作成
|
212
|
+
|
201
|
-
numChannels = 20
|
213
|
+
numChannels = 20 # メルフィルタバンクのチャネル数
|
202
|
-
|
214
|
+
|
203
|
-
df = fs / nfft
|
215
|
+
df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
|
204
216
|
|
205
217
|
filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
|
206
218
|
|
207
|
-
|
219
|
+
# for c in np.arange(0, numChannels):
|
220
|
+
|
208
|
-
|
221
|
+
# plot(np.arange(0, nfft / 2) * df, filterbank[c])
|
222
|
+
|
209
|
-
|
223
|
+
# savefig("melfilterbank.png")
|
224
|
+
|
210
|
-
|
225
|
+
# show()
|
226
|
+
|
227
|
+
|
228
|
+
|
211
|
-
|
229
|
+
# 定義通りに書いた場合
|
230
|
+
|
212
|
-
|
231
|
+
# 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
|
232
|
+
|
213
|
-
|
233
|
+
# mspec = []
|
234
|
+
|
214
|
-
|
235
|
+
# for c in np.arange(0, numChannels):
|
236
|
+
|
215
|
-
|
237
|
+
# mspec.append(np.log10(sum(spec * filterbank[c])))
|
238
|
+
|
216
|
-
|
239
|
+
# mspec = np.array(mspec)
|
240
|
+
|
241
|
+
|
242
|
+
|
217
|
-
|
243
|
+
# 行列で書くと簡単になる!
|
244
|
+
|
245
|
+
# 振幅スペクトルにメルフィルタバンクを適用
|
218
246
|
|
219
247
|
mspec = np.log10(np.dot(spec, filterbank.T))
|
220
248
|
|
221
249
|
|
222
250
|
|
223
|
-
|
251
|
+
# 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示
|
252
|
+
|
224
|
-
|
253
|
+
# subplot(211)
|
254
|
+
|
225
|
-
|
255
|
+
# plot(fscale, np.log10(spec))
|
256
|
+
|
226
|
-
|
257
|
+
# xlabel("frequency")
|
258
|
+
|
227
|
-
|
259
|
+
# xlim(0, 25000)
|
260
|
+
|
228
|
-
|
261
|
+
#
|
262
|
+
|
229
|
-
|
263
|
+
# subplot(212)
|
264
|
+
|
265
|
+
# plot(fcenters, mspec, "o-")
|
266
|
+
|
267
|
+
# xlabel("frequency")
|
268
|
+
|
269
|
+
# xlim(0, 25000)
|
270
|
+
|
271
|
+
# savefig("result_melfilter.png")
|
272
|
+
|
273
|
+
# show()
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
# 離散コサイン変換
|
230
278
|
|
231
279
|
ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
|
232
280
|
|
233
281
|
|
234
282
|
|
235
|
-
|
283
|
+
# 低次成分からnceps個の係数を返す
|
236
284
|
|
237
285
|
return ceps[:nceps]
|
238
286
|
|
@@ -240,7 +288,7 @@
|
|
240
288
|
|
241
289
|
if __name__ == "__main__":
|
242
290
|
|
243
|
-
|
291
|
+
# 音声をロード
|
244
292
|
|
245
293
|
wav, fs = wavread("a_1.wav")
|
246
294
|
|
@@ -248,7 +296,7 @@
|
|
248
296
|
|
249
297
|
|
250
298
|
|
251
|
-
|
299
|
+
# 音声波形の中心部分を切り出す
|
252
300
|
|
253
301
|
center = len(wav) / 2 # 中心のサンプル番号
|
254
302
|
|
@@ -266,7 +314,7 @@
|
|
266
314
|
|
267
315
|
print "mfcc:", ceps
|
268
316
|
|
269
|
-
|
317
|
+
```
|
270
318
|
|
271
319
|
###試したこと
|
272
320
|
|
3
エラー文修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,7 +14,21 @@
|
|
14
14
|
|
15
15
|
エラーメッセージ
|
16
16
|
|
17
|
+
Traceback (most recent call last):
|
18
|
+
|
19
|
+
File "MFCC.py", line 138, in <module>
|
20
|
+
|
21
|
+
ceps = mfcc(wavdata, nfft, fs, nceps)
|
22
|
+
|
23
|
+
File "MFCC.py", line 90, in mfcc
|
24
|
+
|
25
|
+
filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
|
26
|
+
|
27
|
+
File "MFCC.py", line 52, in melFilterBank
|
28
|
+
|
29
|
+
filterbank[c, i] = int((i - indexstart[c]))*int(increment)
|
30
|
+
|
17
|
-
IndeE
|
31
|
+
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
|
18
32
|
|
19
33
|
|
20
34
|
|
@@ -258,6 +272,8 @@
|
|
258
272
|
|
259
273
|
52行目をint()でキャストしてみましたができませんでした.
|
260
274
|
|
275
|
+
filterbank[c, i] = int((i - indexstart[c])*increment)
|
276
|
+
|
261
277
|
|
262
278
|
|
263
279
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
@@ -266,4 +282,4 @@
|
|
266
282
|
|
267
283
|
python27
|
268
284
|
|
269
|
-
|
285
|
+
ソース元:http://aidiary.hatenablog.com/entry/20120225/1330179868
|
2
詳細設定
test
CHANGED
File without changes
|
test
CHANGED
@@ -265,3 +265,5 @@
|
|
265
265
|
windows7 32bit
|
266
266
|
|
267
267
|
python27
|
268
|
+
|
269
|
+
コード詳細:http://aidiary.hatenablog.com/entry/20120225/1330179868
|
1
コードの修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -20,8 +20,6 @@
|
|
20
20
|
|
21
21
|
###該当のソースコード
|
22
22
|
|
23
|
-
#coding:utf-8
|
24
|
-
|
25
23
|
import wave
|
26
24
|
|
27
25
|
import numpy as np
|
@@ -72,41 +70,41 @@
|
|
72
70
|
|
73
71
|
"""メルフィルタバンクを作成"""
|
74
72
|
|
75
|
-
|
73
|
+
|
76
74
|
|
77
75
|
fmax = fs / 2
|
78
76
|
|
79
|
-
|
77
|
+
|
80
78
|
|
81
79
|
melmax = hz2mel(fmax)
|
82
80
|
|
83
|
-
|
81
|
+
|
84
82
|
|
85
83
|
nmax = nfft / 2
|
86
84
|
|
87
|
-
|
85
|
+
|
88
86
|
|
89
87
|
df = fs / nfft
|
90
88
|
|
91
|
-
|
89
|
+
|
92
90
|
|
93
91
|
dmel = melmax / (numChannels + 1)
|
94
92
|
|
95
93
|
melcenters = np.arange(1, numChannels + 1) * dmel
|
96
94
|
|
97
|
-
|
95
|
+
|
98
96
|
|
99
97
|
fcenters = mel2hz(melcenters)
|
100
98
|
|
101
|
-
|
99
|
+
|
102
100
|
|
103
101
|
indexcenter = np.round(fcenters / df)
|
104
102
|
|
105
|
-
|
103
|
+
|
106
104
|
|
107
105
|
indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
|
108
106
|
|
109
|
-
|
107
|
+
|
110
108
|
|
111
109
|
indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
|
112
110
|
|
@@ -116,7 +114,7 @@
|
|
116
114
|
|
117
115
|
for c in np.arange(0, numChannels):
|
118
116
|
|
119
|
-
|
117
|
+
|
120
118
|
|
121
119
|
increment= 1.0 / (indexcenter[c] - indexstart[c])
|
122
120
|
|
@@ -124,7 +122,7 @@
|
|
124
122
|
|
125
123
|
filterbank[c, i] = (i - indexstart[c])*increment
|
126
124
|
|
127
|
-
|
125
|
+
|
128
126
|
|
129
127
|
decrement = 1.0 / (indexstop[c] - indexcenter[c])
|
130
128
|
|
@@ -142,7 +140,7 @@
|
|
142
140
|
|
143
141
|
"""プリエンファシスフィルタ"""
|
144
142
|
|
145
|
-
|
143
|
+
|
146
144
|
|
147
145
|
return scipy.signal.lfilter([1.0, -p], 1, signal)
|
148
146
|
|
@@ -158,7 +156,7 @@
|
|
158
156
|
|
159
157
|
nceps : MFCCの次元"""
|
160
158
|
|
161
|
-
|
159
|
+
|
162
160
|
|
163
161
|
p = 0.97 # プリエンファシス係数
|
164
162
|
|
@@ -166,7 +164,7 @@
|
|
166
164
|
|
167
165
|
|
168
166
|
|
169
|
-
|
167
|
+
|
170
168
|
|
171
169
|
hammingWindow = np.hamming(len(signal))
|
172
170
|
|
@@ -174,97 +172,53 @@
|
|
174
172
|
|
175
173
|
|
176
174
|
|
177
|
-
|
175
|
+
|
178
176
|
|
179
177
|
spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
|
180
178
|
|
181
179
|
fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
|
182
180
|
|
183
|
-
|
181
|
+
|
184
|
-
|
185
|
-
|
182
|
+
|
186
|
-
|
187
|
-
|
183
|
+
|
188
|
-
|
189
|
-
|
184
|
+
|
190
|
-
|
191
|
-
|
185
|
+
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
186
|
+
|
196
|
-
|
197
|
-
numChannels = 20
|
187
|
+
numChannels = 20
|
198
|
-
|
188
|
+
|
199
|
-
df = fs / nfft
|
189
|
+
df = fs / nfft
|
200
190
|
|
201
191
|
filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
|
202
192
|
|
203
|
-
|
193
|
+
|
204
|
-
|
205
|
-
|
194
|
+
|
206
|
-
|
207
|
-
|
195
|
+
|
208
|
-
|
209
|
-
|
196
|
+
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
197
|
+
|
214
|
-
|
215
|
-
|
198
|
+
|
216
|
-
|
217
|
-
|
199
|
+
|
218
|
-
|
219
|
-
|
200
|
+
|
220
|
-
|
221
|
-
|
201
|
+
|
222
|
-
|
223
|
-
|
202
|
+
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
203
|
+
|
228
|
-
|
229
|
-
# 振幅スペクトルにメルフィルタバンクを適用
|
230
204
|
|
231
205
|
mspec = np.log10(np.dot(spec, filterbank.T))
|
232
206
|
|
233
207
|
|
234
208
|
|
235
|
-
|
209
|
+
|
236
|
-
|
237
|
-
|
210
|
+
|
238
|
-
|
239
|
-
|
211
|
+
|
240
|
-
|
241
|
-
|
212
|
+
|
242
|
-
|
243
|
-
|
213
|
+
|
244
|
-
|
245
|
-
|
214
|
+
|
246
|
-
|
247
|
-
|
215
|
+
|
248
|
-
|
249
|
-
# plot(fcenters, mspec, "o-")
|
250
|
-
|
251
|
-
# xlabel("frequency")
|
252
|
-
|
253
|
-
# xlim(0, 25000)
|
254
|
-
|
255
|
-
# savefig("result_melfilter.png")
|
256
|
-
|
257
|
-
# show()
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
# 離散コサイン変換
|
262
216
|
|
263
217
|
ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
|
264
218
|
|
265
219
|
|
266
220
|
|
267
|
-
|
221
|
+
|
268
222
|
|
269
223
|
return ceps[:nceps]
|
270
224
|
|
@@ -272,7 +226,7 @@
|
|
272
226
|
|
273
227
|
if __name__ == "__main__":
|
274
228
|
|
275
|
-
|
229
|
+
|
276
230
|
|
277
231
|
wav, fs = wavread("a_1.wav")
|
278
232
|
|
@@ -280,7 +234,7 @@
|
|
280
234
|
|
281
235
|
|
282
236
|
|
283
|
-
|
237
|
+
|
284
238
|
|
285
239
|
center = len(wav) / 2 # 中心のサンプル番号
|
286
240
|
|