質問編集履歴

2

文法の変更

2020/05/14 14:54

投稿

maguro2020
maguro2020

スコア34

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ### 発生している問題・エラーメッセージ
12
12
 
13
- TypeError: wavread() takes 0 positional arguments but 1 was given
13
+ Error: unknown format: 65534
14
14
 
15
15
 
16
16
 
@@ -36,9 +36,9 @@
36
36
 
37
37
 
38
38
 
39
- def wavread(): #1
39
+ def wavread(filename):
40
-
40
+
41
- wf = wave.open('call01.wav', "r") #2
41
+ wf = wave.open(filename, "r")
42
42
 
43
43
  fs = wf.getframerate()
44
44
 
@@ -232,7 +232,7 @@
232
232
 
233
233
  # 音声をロード
234
234
 
235
- wav, fs = wavread('call01.wav')
235
+ wav, fs = wavread(wavfile)
236
236
 
237
237
  t = np.arange(0.0, len(wav) / fs, 1/fs)
238
238
 
@@ -256,7 +256,7 @@
256
256
 
257
257
  if __name__ == "__main__":
258
258
 
259
- wavfile= 'call01.wav'
259
+ wavfile= "call01.wav" #1
260
260
 
261
261
  nfft=2048
262
262
 
@@ -264,7 +264,7 @@
264
264
 
265
265
  tmp = get_feature(wavfile,nfft,nceps)
266
266
 
267
- print (tmp)
267
+ print (tmp) #2
268
268
 
269
269
 
270
270
 
@@ -274,23 +274,21 @@
274
274
 
275
275
  # 試したこと
276
276
 
277
- 1.上から行目のdef wavread(filename):をdef wavread():に書き換えました。
277
+ 前回の質問より、ほとんどリンク元のコードのまま実行してみました。変更点といたしましては、下から5行目(#1)と1行目(#2)コードの
278
+
278
-
279
+ 1.参照するファイル名の変更
280
+
281
+ 2.printに()をつけたこと。(リンク元のコードがPython2.7のため)
282
+
283
+ を行いました。
284
+
285
+
286
+
287
+ 少し調べてみたところ、
288
+
279
- 2.上から9行目の wf = wave.open(filename, "r")を wf = wave.open('call01.wav', "r")に書き換えました。
289
+ [Why GitHub? wave.Error: unknown format: 65534 #129](https://github.com/jiaaro/pydub/issues/129)
280
-
281
-
282
-
283
- また、自分の読み込もうとしているwavファイル('call01.wav')が96kHzなので、wavread()ではなくscipy.io.wavfile.read('call01.wav')
290
+
284
-
285
- に置き換えたりしてみたのですが、上手くいきませんでした。
286
-
287
-
288
-
289
- 下から、14行目の
290
-
291
- wav, fs = wavread('call01.wav')
292
-
293
- に問題があるのいかと考えているのですがどのようにコードを書き換えればよのかがわかっていない状況です。
291
+ 上記も似たようエラーで困っている人を見つけ色々とコードをいってみてはるのですが、上手くいきません
294
292
 
295
293
 
296
294
 

1

コードの挿入、およびリンクの挿入を行なった。

2020/05/14 14:54

投稿

maguro2020
maguro2020

スコア34

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,10 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- http://webdatareport.hatenablog.com/entry/2016/11/06/161304
3
+ [はてなブログ Webデータレポート 生活音を機械学習してみた](http://webdatareport.hatenablog.com/entry/2016/11/06/161304)
4
-
5
-
6
-
4
+
5
+
6
+
7
- 上記のURLを参考にPython3を用いて、音声(wav)の機械学習をしたいと考えております。wavファイルのスペクトグラムや振幅の表示はできたのですが、MFCC(メル周波数ケプストラム係数)のあたりから上手くいかず、wavファイルからベクトルを生成することができません。
7
+ 上記のリンクを参考にPython3を用いて、音声(wav)の機械学習をしたいと考えております。wavファイルのスペクトグラムや振幅の表示はできたのですが、MFCC(メル周波数ケプストラム係数)のあたりから上手くいかず、wavファイルからベクトルを生成することができません。
8
8
 
9
9
 
10
10
 
@@ -20,260 +20,258 @@
20
20
 
21
21
  ```Python3
22
22
 
23
+ #coding:utf-8
24
+
25
+ import wave
26
+
27
+ import numpy as np
28
+
29
+ import scipy.signal
30
+
31
+ import scipy.fftpack
32
+
33
+ import scipy.fftpack.realtransforms
34
+
35
+ import scipy.io.wavfile
36
+
37
+
38
+
39
+ def wavread(): #1
40
+
41
+ wf = wave.open('call01.wav', "r") #2
42
+
43
+ fs = wf.getframerate()
44
+
45
+ x = wf.readframes(wf.getnframes())
46
+
47
+ x = np.frombuffer(x, dtype="int16") / 32768.0 # (-1, 1)に正規化
48
+
49
+ wf.close()
50
+
51
+ return x, float(fs)
52
+
53
+
54
+
55
+ def hz2mel(f):
56
+
57
+ """Hzをmelに変換"""
58
+
59
+ return 1127.01048 * np.log(f / 700.0 + 1.0)
60
+
61
+
62
+
63
+ def mel2hz(m):
64
+
65
+ """melをhzに変換"""
66
+
67
+ return 700.0 * (np.exp(m / 1127.01048) - 1.0)
68
+
69
+
70
+
71
+ def melFilterBank(fs, nfft, numChannels):
72
+
73
+ """メルフィルタバンクを作成"""
74
+
75
+ # ナイキスト周波数(Hz)
76
+
77
+ fmax = fs / 2
78
+
79
+ # ナイキスト周波数(mel)
80
+
81
+ melmax = hz2mel(fmax)
82
+
83
+ # 周波数インデックスの最大数
84
+
85
+ nmax = nfft / 2
86
+
87
+ # 周波数解像度(周波数インデックス1あたりのHz幅)
88
+
89
+ df = fs / nfft
90
+
91
+ # メル尺度における各フィルタの中心周波数を求める
92
+
93
+ dmel = melmax / (numChannels + 1)
94
+
95
+ melcenters = np.arange(1, numChannels + 1) * dmel
96
+
97
+ # 各フィルタの中心周波数をHzに変換
98
+
99
+ fcenters = mel2hz(melcenters)
100
+
101
+ # 各フィルタの中心周波数を周波数インデックスに変換
102
+
103
+ indexcenter = np.round(fcenters / df)
104
+
105
+ # 各フィルタの開始位置のインデックス
106
+
107
+ indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
108
+
109
+ # 各フィルタの終了位置のインデックス
110
+
111
+ indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
112
+
113
+
114
+
115
+ filterbank = np.zeros((numChannels, nmax))
116
+
117
+ for c in np.arange(0, numChannels):
118
+
119
+ # 三角フィルタの左の直線の傾きから点を求める
120
+
121
+ increment= 1.0 / (indexcenter[c] - indexstart[c])
122
+
123
+ for i in np.arange(indexstart[c], indexcenter[c]):
124
+
125
+ i=int(i)
126
+
127
+ filterbank[c, i] = (i - indexstart[c]) * increment
128
+
129
+ # 三角フィルタの右の直線の傾きから点を求める
130
+
131
+ decrement = 1.0 / (indexstop[c] - indexcenter[c])
132
+
133
+ for i in np.arange(indexcenter[c], indexstop[c]):
134
+
135
+ i=int(i)
136
+
137
+ filterbank[c, i] = 1.0 - ((i - indexcenter[c]) * decrement)
138
+
139
+
140
+
141
+ return filterbank, fcenters
142
+
143
+
144
+
145
+ def preEmphasis(signal, p):
146
+
147
+ """プリエンファシスフィルタ"""
148
+
149
+ # 係数 (1.0, -p) のFIRフィルタを作成
150
+
151
+ return scipy.signal.lfilter([1.0, -p], 1, signal)
152
+
153
+
154
+
155
+ def mfcc(signal, nfft, fs, nceps):
156
+
157
+ """信号のMFCCパラメータを求める
158
+
159
+ signal: 音声信号
160
+
161
+ nfft : FFTのサンプル数
162
+
163
+ nceps : MFCCの次元"""
164
+
165
+ # プリエンファシスフィルタをかける
166
+
167
+ p = 0.97 # プリエンファシス係数
168
+
169
+ signal = preEmphasis(signal, p)
170
+
171
+
172
+
173
+ # ハミング窓をかける
174
+
175
+ hammingWindow = np.hamming(len(signal))
176
+
177
+ signal = signal * hammingWindow
178
+
179
+
180
+
181
+ # 振幅スペクトルを求める
182
+
183
+ spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
184
+
185
+ fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
186
+
187
+
188
+
189
+ # メルフィルタバンクを作成
190
+
191
+ numChannels = 20 # メルフィルタバンクのチャネル数
192
+
193
+ df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
194
+
195
+ filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
196
+
197
+
198
+
199
+
200
+
201
+ # 定義通りに書いた場合
202
+
203
+ # 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
204
+
205
+ mspec = np.log10(np.dot(spec, filterbank.T))
206
+
207
+
208
+
209
+
210
+
211
+ # 離散コサイン変換
212
+
213
+ ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
214
+
215
+
216
+
217
+ # 低次成分からnceps個の係数を返す
218
+
219
+ return ceps[:nceps]
220
+
221
+
222
+
223
+ #wavファイルと次元数を入れてMFCCを抽出
224
+
225
+ # nfft:FFTのサンプル数 1024, 2048, 4096
226
+
227
+ # nceps:MFCCの次元数 大体12次元が多い
228
+
229
+ # ※ fs * cuttime >= nfft/2 を満たす値を与えなければいけない
230
+
231
+ def get_feature(wavfile,nfft,nceps):
232
+
23
- スコー
233
+ # 音声をロード
234
+
235
+ wav, fs = wavread('call01.wav')
236
+
237
+ t = np.arange(0.0, len(wav) / fs, 1/fs)
238
+
239
+
240
+
241
+ # 音声波形の中心部分を切り出す
242
+
243
+ center = len(wav) / 2 # 中心のサンプル番号
244
+
245
+ cuttime = 0.8 # 切り出す長さ [s]
246
+
247
+ wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)]
248
+
249
+
250
+
251
+ ceps = mfcc(wavdata, nfft, fs, nceps)
252
+
253
+ return ceps.tolist()
254
+
255
+
256
+
257
+ if __name__ == "__main__":
258
+
259
+ wavfile= 'call01.wav'
260
+
261
+ nfft=2048
262
+
263
+ nceps=12
264
+
265
+ tmp = get_feature(wavfile,nfft,nceps)
266
+
267
+ print (tmp)
268
+
269
+
270
+
271
+
24
272
 
25
273
  ```
26
274
 
27
- //coding:utf-8
28
-
29
- import wave
30
-
31
- import numpy as np
32
-
33
- import scipy.signal
34
-
35
- import scipy.fftpack
36
-
37
- import scipy.fftpack.realtransforms
38
-
39
- import scipy.io.wavfile
40
-
41
-
42
-
43
- def wavread(): #1
44
-
45
- wf = wave.open('call01.wav', "r") #2
46
-
47
- fs = wf.getframerate()
48
-
49
- x = wf.readframes(wf.getnframes())
50
-
51
- x = np.frombuffer(x, dtype="int16") / 32768.0 #(-1, 1)に正規化
52
-
53
- wf.close()
54
-
55
- return x, float(fs)
56
-
57
-
58
-
59
- def hz2mel(f):
60
-
61
- """Hzをmelに変換"""
62
-
63
- return 1127.01048 * np.log(f / 700.0 + 1.0)
64
-
65
-
66
-
67
- def mel2hz(m):
68
-
69
- """melをhzに変換"""
70
-
71
- return 700.0 * (np.exp(m / 1127.01048) - 1.0)
72
-
73
-
74
-
75
- def melFilterBank(fs, nfft, numChannels):
76
-
77
- """メルフィルタバンクを作成"""
78
-
79
- // ナイキスト周波数(Hz)
80
-
81
- fmax = fs / 2
82
-
83
- // ナイキスト周波数(mel)
84
-
85
- melmax = hz2mel(fmax)
86
-
87
- // 周波数インデックスの最大数
88
-
89
- nmax = nfft / 2
90
-
91
- // 周波数解像度(周波数インデックス1あたりのHz幅)
92
-
93
- df = fs / nfft
94
-
95
- // メル尺度における各フィルタの中心周波数を求める
96
-
97
- dmel = melmax / (numChannels + 1)
98
-
99
- melcenters = np.arange(1, numChannels + 1) * dmel
100
-
101
- // 各フィルタの中心周波数をHzに変換
102
-
103
- fcenters = mel2hz(melcenters)
104
-
105
- // 各フィルタの中心周波数を周波数インデックスに変換
106
-
107
- indexcenter = np.round(fcenters / df)
108
-
109
- // 各フィルタの開始位置のインデックス
110
-
111
- indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
112
-
113
- // 各フィルタの終了位置のインデックス
114
-
115
- indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
116
-
117
-
118
-
119
- filterbank = np.zeros((numChannels, nmax))
120
-
121
- for c in np.arange(0, numChannels):
122
-
123
- // 三角フィルタの左の直線の傾きから点を求める
124
-
125
- increment= 1.0 / (indexcenter[c] - indexstart[c])
126
-
127
- for i in np.arange(indexstart[c], indexcenter[c]):
128
-
129
- i=int(i)
130
-
131
- filterbank[c, i] = (i - indexstart[c]) * increment
132
-
133
- // 三角フィルタの右の直線の傾きから点を求める
134
-
135
- decrement = 1.0 / (indexstop[c] - indexcenter[c])
136
-
137
- for i in np.arange(indexcenter[c], indexstop[c]):
138
-
139
- i=int(i)
140
-
141
- filterbank[c, i] = 1.0 - ((i - indexcenter[c]) * decrement)
142
-
143
-
144
-
145
- return filterbank, fcenters
146
-
147
-
148
-
149
- def preEmphasis(signal, p):
150
-
151
- """プリエンファシスフィルタ"""
152
-
153
- // 係数 (1.0, -p) のFIRフィルタを作成
154
-
155
- return scipy.signal.lfilter([1.0, -p], 1, signal)
156
-
157
-
158
-
159
- def mfcc(signal, nfft, fs, nceps):
160
-
161
- """信号のMFCCパラメータを求める
162
-
163
- signal: 音声信号
164
-
165
- nfft : FFTのサンプル数
166
-
167
- nceps : MFCCの次元"""
168
-
169
-
170
-
171
- // プリエンファシスフィルタをかける
172
-
173
- p = 0.97 # プリエンファシス係数
174
-
175
- signal = preEmphasis(signal, p)
176
-
177
-
178
-
179
- // ハミング窓をかける
180
-
181
- hammingWindow = np.hamming(len(signal))
182
-
183
- signal = signal * hammingWindow
184
-
185
-
186
-
187
- // 振幅スペクトルを求める
188
-
189
- spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
190
-
191
- fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
192
-
193
-
194
-
195
- // メルフィルタバンクを作成
196
-
197
- numChannels = 20 # メルフィルタバンクのチャネル数
198
-
199
- df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
200
-
201
- filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
202
-
203
-
204
-
205
- // 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
206
-
207
- mspec = np.log10(np.dot(spec, filterbank.T))
208
-
209
-
210
-
211
-
212
-
213
- // 離散コサイン変換
214
-
215
- ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
216
-
217
-
218
-
219
- // 低次成分からnceps個の係数を返す
220
-
221
- return ceps[:nceps]
222
-
223
-
224
-
225
- //wavファイルと次元数を入れてMFCCを抽出
226
-
227
- // nfft:FFTのサンプル数 1024, 2048, 4096
228
-
229
- // nceps:MFCCの次元数 大体12次元が多い
230
-
231
- // ※ fs * cuttime >= nfft/2 を満たす値を与えなければいけない
232
-
233
-
234
-
235
- def get_feature(wavfile,nfft,nceps):
236
-
237
- // 音声をロード
238
-
239
- wav, fs = wavread('call01.wav') #ここに問題があるのではと考えております
240
-
241
- t = np.arange(0.0, len(wav) / fs, 1/fs)
242
-
243
-
244
-
245
- // 音声波形の中心部分を切り出す
246
-
247
- center = len(wav) / 2 # 中心のサンプル番号
248
-
249
- cuttime = 0.8 # 切り出す長さ [s]
250
-
251
- wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)]
252
-
253
-
254
-
255
- ceps = mfcc(wavdata, nfft, fs, nceps)
256
-
257
- return ceps.tolist()
258
-
259
-
260
-
261
- if __name__ == "__main__":
262
-
263
- wavfile= 'call01.wav'
264
-
265
- nfft=2048
266
-
267
- nceps=12
268
-
269
- tmp = get_feature(wavfile,nfft,nceps)
270
-
271
- print (tmp)
272
-
273
-
274
-
275
-
276
-
277
275
  # 試したこと
278
276
 
279
277
  1.上から8行目のdef wavread(filename):をdef wavread():に書き換えました。