質問編集履歴
4
コード表示に変更
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
エラー文修正
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
|
-
|
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
|
-
|
143
|
+
ソース元:http://aidiary.hatenablog.com/entry/20120225/1330179868
|
2
詳細設定
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
コードの修正
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
|
-
|
37
|
+
|
39
38
|
fmax = fs / 2
|
40
|
-
|
39
|
+
|
41
40
|
melmax = hz2mel(fmax)
|
42
|
-
|
41
|
+
|
43
42
|
nmax = nfft / 2
|
44
|
-
|
43
|
+
|
45
44
|
df = fs / nfft
|
46
|
-
|
45
|
+
|
47
46
|
dmel = melmax / (numChannels + 1)
|
48
47
|
melcenters = np.arange(1, numChannels + 1) * dmel
|
49
|
-
|
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
|
-
|
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
|
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
|
-
|
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)]
|