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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3474閲覧

エラーが取れません...

atena

総合スコア20

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/12/26 03:24

'list' object is not callableのエラーが取れません.
原因を教えてください.

コード

python3.6

1#coding:utf-8 2import wave 3import csv 4import numpy as np 5import scipy.signal 6import scipy.fftpack 7import scipy.fftpack.realtransforms 8import sys 9from pylab import * 10 11def wavread(filename): 12 wf = wave.open(filename, "r") 13 fs = wf.getframerate() 14 x = wf.readframes(wf.getnframes()) 15 x = np.frombuffer(x, dtype="int16") / 32768.0 # (-1, 1)に正規化 16 wf.close() 17 return x, float(fs) 18 19def preEmphasis(signal, p): 20 21 # 係数 (1.0, -p) のFIRフィルタを作成 22 return scipy.signal.lfilter([1.0, -p], 1, signal) 23 24def hz2mel(f): 25 # Hzをmelに変換 26 return 1127.01048 * np.log(f / 700.0 + 1.0) 27 28def mel2hz(m): 29 # melをhzに変換 30 return 700.0 * (np.exp(m / 1127.01048) - 1.0) 31 32def melFilterBank(fs, nfft, numChannels): 33 # メルフィルタバンクを作成 34 # ナイキスト周波数(Hz) 35 fmax = fs / 2 36 # ナイキスト周波数(mel) 37 melmax = hz2mel(fmax) 38 # 周波数インデックスの最大数 39 nmax = nfft / 2 40 # 周波数解像度(周波数インデックス1あたりのHz幅) 41 df = fs / nfft 42 # メル尺度における各フィルタの中心周波数を求める 43 dmel = melmax / (numChannels + 1) 44 melcenters = np.arange(1, numChannels + 1) * dmel 45 # 各フィルタの中心周波数をHzに変換 46 fcenters = mel2hz(melcenters) 47 # 各フィルタの中心周波数を周波数インデックスに変換 48 indexcenter = np.round(fcenters / df) 49 # 各フィルタの開始位置のインデックス 50 indexstart = np.hstack(([0], indexcenter[0:numChannels - 1])) 51 # 各フィルタの終了位置のインデックス 52 indexstop = np.hstack((indexcenter[1:numChannels], [nmax])) 53 54 filterbank = np.zeros((numChannels, int(nmax))) 55 for c in np.arange(0, numChannels): 56 # 三角フィルタの左の直線の傾きから点を求める 57 increment= 1.0 / (indexcenter[c] - indexstart[c]) 58 for i in np.arange(indexstart[c], indexcenter[c]): 59 filterbank[c, int(i)] = (i - indexstart[c]) * increment 60 # 三角フィルタの右の直線の傾きから点を求める 61 decrement = 1.0 / (indexstop[c] - indexcenter[c]) 62 for i in np.arange(indexcenter[c], indexstop[c]): 63 filterbank[c, int(i)] = 1.0 - ((i - indexcenter[c]) * decrement) 64 65 return filterbank, fcenters 66 67def formant(signal, fcenters): 68 formant = [] 69 num = [] 70 for w1 in range(0, len(signal)): 71 if(fcenters[w1] < 4500): 72 #ピークピッキング法によるフォルマント抽出 73 w2 = w1 + 1 74 left = np.real(signal[w2-1]) 75 center = np.real(signal[w2]) 76 right = np.real(signal[w2+1]) 77 if((center - left) > 0 and (right - center) < 0): 78 num.append(w2) 79 if (len(num) == 5): 80 min = 0 81 for x in range(1, 5): 82 if (signal[num[min]] > signal[num[x]]): 83 min = x 84 num.pop(min) 85 for y in range(0, 4): 86 formant.append(fcenters[num[y]]) 87 return formant 88 89def mfcc(signal, nfft, fs, nceps, i): 90 91 hammingWindow = [] 92 spec = [] 93 fscale = [] 94 fcenters = [] 95 mspec = [] 96 ceps = [] 97 cpsLif = [] 98 cpsLif_P = [] 99 dftSpc = [] 100 dftSpc_P = [] 101 102 if (i == 1): 103 # プリエンファシスフィルタをかける 104 p = 0.97 # プリエンファシス係数 105 signal = preEmphasis(signal, p) 106 107 # ハミング窓をかける 108 hammingWindow = np.hamming(len(signal)) 109 signal = signal * hammingWindow 110 111# plot(range(0,len(hammingWindow)), hammingWindow) 112# xlabel("sample") 113# ylabel("amplitude spectrum") 114# savefig("hamming.png") 115# show() 116 117 # 振幅スペクトルを求める 118 spec = np.abs(np.fft.fft(signal, nfft))[:nfft//2] 119 fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft//2] 120 121 # プロット 122# plot(fscale, spec) 123# xlabel("frequency [Hz]") 124# ylabel("amplitude spectrum") 125# savefig("spectrum.png") 126# show() 127 128 # メルフィルタバンクを作成 129 numChannels = 80 # メルフィルタバンクのチャネル数 130 df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅) 131 filterbank, fcenters = melFilterBank(fs, nfft, numChannels) 132 133 # メルフィルタバンクのプロット 134# for c in np.arange(0, numChannels): 135# plot(np.arange(0, nfft / 2) * df, filterbank[c]) 136# savefig("melfilterbank.png") 137# show() 138 139 # 振幅スペクトルにメルフィルタバンクを適用 140 mspec = np.log10(np.dot(spec, filterbank.T)) 141 142 # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示 143# subplot(211) 144# plot(fscale, 20 * np.log10(spec)) 145# xlabel("frequency") 146# xlim(0, 5000) 147 148# subplot(212) 149# plot(fcenters, mspec) 150# xlabel("frequency") 151# xlim(0, 5000) 152# savefig("result_melfilter3.png") 153# show() 154 155 # 離散コサイン変換 156 ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1) 157 158# plot(range(0, 80), ceps, "o-") 159# xlabel("quefrency") 160# xlim(0, 80) 161# savefig("result_melfilter4.png") 162# show() 163 164 # ローパスリフタ 165 # ケプストラムの高次成分を0にして微細構造を除去し、 166 # 緩やかなスペクトル包絡のみ抽出 167 cepCoef = nceps # ケプストラム次数 168 cpsLif = np.array(ceps) # arrayをコピー 169 cpsLif_P = np.array(ceps) # arrayをコピー 170 # 高周波成分を除く(左右対称なので注意) 171 cpsLif[cepCoef:len(cpsLif)-1] = 0 172 # 低周波成分を除く(左右対称なので注意) 173 cpsLif_P[1:cepCoef] = 0 174 175 # ケプストラム領域をフーリエ変換してスペクトル領域に戻す 176 # リフタリング後の対数スペクトル 177 dftSpc = scipy.fftpack.realtransforms.idct(cpsLif, type=2, norm="ortho", axis=-1) 178 dftSpc_P = scipy.fftpack.realtransforms.idct(cpsLif_P, type=2, norm="ortho", axis=-1) 179 180 PdftSpc_P = abs(10 ** (dftSpc_P) ) 181 182 # オリジナルの対数スペクトルを描画 183# plot(fcenters, mspec) 184 # 高周波成分を除いた声道特性のスペクトル包絡を重ねて描画 185# plot(fcenters, dftSpc, color="red") 186 # 低周波成分を除いた音源特性のスペクトル包絡を重ねて描画 187# plot(fcenters, dftSpc_P, color="green") 188# xlabel("frequency [Hz]") 189# ylabel("log amplitude spectrum") 190# xlim(0, 10000) 191# savefig("result.png") 192# show() 193 194# plot(fcenters, PdftSpc_P) 195# xlabel("quefrency[Hz]") 196# ylabel("power cepstrum") 197# xlim(0, 1000) 198# savefig("result_spectrumlif_P.png") 199# show() 200 201 202 if (i == 1): 203 # 低次成分を返す 204 formant1 = [] 205 formant1 = formant(dftSpc, fcenters) 206 return formant1 207 208 if (i == 2): 209 # 基本周波数を返す 210 max_i = 3 211 max_value = ceps[3] 212 for i in range(3, len(ceps)): 213 if(ceps[i] > max_value): 214 max_i = i 215 max_value = ceps[i] 216# print(max_i, " ", fcenters[max_i], " ", len(ceps)) 217# f0 = 44100 / max_i 218 f0 = 1.0 / (1.0 / fs * fcenters[max_i]) 219 return f0 220 221if __name__ == "__main__": 222 223 args = sys.argv 224 wavf = ['171002_686a','171002_686b','171002_756a','171002_756b','171003_686a','171003_686b','171003_756a','171003_756b','171004_686a','171004_686b','171004_756a','171004_756b'] 225 226 # 音声をロード 227 for i in range(1, len(args)): 228 for j in range(0, len(wavf)): 229 wav = [] 230 wavdata = [] 231 wavfi = wavf[j] + args[i] + '.wav' 232 wav, fs = wavread(wavfi) 233 print(fs) 234 t = np.arange(0.0, len(wav) / fs, 1/fs) 235 # 音声波形の中心部分を切り出す 236 center = len(wav) / 2 # 中心のサンプル番号 237 cuttime = 0.015 # 切り出す長さ [s] 238 wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)] 239# time = t[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)] 240 241 # 波形をプロット 242# plot(time * 1000, wavdata) 243# xlabel("time [ms]") 244# ylabel("amplitude") 245# savefig("waveform.png") 246# show() 247 248 nfft = 2048 # FFTのサンプル数 249 nceps = 48 # MFCCの次元数 250 formant = mfcc(wavdata, nfft, fs, nceps, 1) 251 f0 = mfcc(wavdata, nfft, fs, nceps, 2) 252 253# dftSpcmax = scipy.fftpack.realtransforms.idct(max, type=2, norm="ortho", axis=-1) 254 255 print ('formant', i, ':', formant) 256# print ('mfcc', i, ':', ceps) 257 print ('f0', i, ':', f0) 258# print ('mfcc', i, '_Pmax:', dftSpcmax) 259# print ('mfcc', i, '_Pmax:', f0) 260 print ('\n') 261 data = formant + f0 262 with open('test.csv','a',newline='') as f: 263 writer = csv.writer(f) 264 writer.writerow(data) 265 266 267 f.close()

エラー文

44100.0 formant 1 : [753.47274869718137, 1734.3869637942682, 2733.2974197701342, 4142.0942717455473] f0 1 : 262.798703496 44100.0 Traceback (most recent call last): File "C:\Users\yossi\Documents\sotuken\MFCC\MFCC2\MFCC2.py", line 250, in <module> File "C:\Users\yossi\Documents\sotuken\MFCC\MFCC2\MFCC2.py", line 205, in mfcc TypeError: 'list' object is not callable

よろしくお願いします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数とリストの名前が被ってしまっているからです。適切にリネームしてください。

Python

1def formant(signal, fcenters): # L67 2 formant = []

エラーの再現

Python

1>>> my_list = [] 2>>> my_list() 3Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5TypeError: 'list' object is not callable

投稿2017/12/26 03:30

編集2017/12/26 03:31
LouiS0616

総合スコア35658

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

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

atena

2017/12/26 03:44

リネームしてみましたが取れませんでした ``` def formant(signal, fcenters): formants = [] num = [] for w1 in range(0, len(signal)): if(fcenters[w1] < 4500): #ピークピッキング法によるフォルマント抽出 w2 = w1 + 1 left = np.real(signal[w2-1]) center = np.real(signal[w2]) right = np.real(signal[w2+1]) if((center - left) > 0 and (right - center) < 0): num.append(w2) if (len(num) == 5): min = 0 for x in range(1, 5): if (signal[num[min]] > signal[num[x]]): min = x num.pop(min) for y in range(0, 4): formants.append(fcenters[num[y]]) return formants ``` ``` Traceback (most recent call last): File "C:\Users\yossi\Documents\sotuken\MFCC\MFCC2\MFCC2.py", line 250, in <module> File "C:\Users\yossi\Documents\sotuken\MFCC\MFCC2\MFCC2.py", line 205, in mfcc TypeError: 'list' object is not callable ```
atena

2017/12/26 04:10

すいません,解決しました.関数名の方をリネームすればよかったんですね!
LouiS0616

2017/12/26 04:16

解決されたようで何よりです。 ちなみに、世の中のプログラマはこのような悲劇を避けるため、関数には動詞形の、変数には名詞形の命名をすることが多いです。 具体的には、関数の名前をget_formantにするとか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問