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

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

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

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

解決済

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

atena
atena

総合スコア20

Python 3.x

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

1回答

0リアクション

0クリップ

3118閲覧

投稿2017/12/26 03:24

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

コード

python3.6

#coding:utf-8 import wave import csv import numpy as np import scipy.signal import scipy.fftpack import scipy.fftpack.realtransforms import sys from pylab import * def wavread(filename): wf = wave.open(filename, "r") fs = wf.getframerate() x = wf.readframes(wf.getnframes()) x = np.frombuffer(x, dtype="int16") / 32768.0 # (-1, 1)に正規化 wf.close() return x, float(fs) def preEmphasis(signal, p): # 係数 (1.0, -p) のFIRフィルタを作成 return scipy.signal.lfilter([1.0, -p], 1, signal) def hz2mel(f): # Hzをmelに変換 return 1127.01048 * np.log(f / 700.0 + 1.0) def mel2hz(m): # melをhzに変換 return 700.0 * (np.exp(m / 1127.01048) - 1.0) def melFilterBank(fs, nfft, numChannels): # メルフィルタバンクを作成 # ナイキスト周波数(Hz) fmax = fs / 2 # ナイキスト周波数(mel) melmax = hz2mel(fmax) # 周波数インデックスの最大数 nmax = nfft / 2 # 周波数解像度(周波数インデックス1あたりのHz幅) df = fs / nfft # メル尺度における各フィルタの中心周波数を求める dmel = melmax / (numChannels + 1) melcenters = np.arange(1, numChannels + 1) * dmel # 各フィルタの中心周波数をHzに変換 fcenters = mel2hz(melcenters) # 各フィルタの中心周波数を周波数インデックスに変換 indexcenter = np.round(fcenters / df) # 各フィルタの開始位置のインデックス indexstart = np.hstack(([0], indexcenter[0:numChannels - 1])) # 各フィルタの終了位置のインデックス indexstop = np.hstack((indexcenter[1:numChannels], [nmax])) filterbank = np.zeros((numChannels, int(nmax))) for c in np.arange(0, numChannels): # 三角フィルタの左の直線の傾きから点を求める increment= 1.0 / (indexcenter[c] - indexstart[c]) for i in np.arange(indexstart[c], indexcenter[c]): filterbank[c, int(i)] = (i - indexstart[c]) * increment # 三角フィルタの右の直線の傾きから点を求める decrement = 1.0 / (indexstop[c] - indexcenter[c]) for i in np.arange(indexcenter[c], indexstop[c]): filterbank[c, int(i)] = 1.0 - ((i - indexcenter[c]) * decrement) return filterbank, fcenters def formant(signal, fcenters): formant = [] 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): formant.append(fcenters[num[y]]) return formant def mfcc(signal, nfft, fs, nceps, i): hammingWindow = [] spec = [] fscale = [] fcenters = [] mspec = [] ceps = [] cpsLif = [] cpsLif_P = [] dftSpc = [] dftSpc_P = [] if (i == 1): # プリエンファシスフィルタをかける p = 0.97 # プリエンファシス係数 signal = preEmphasis(signal, p) # ハミング窓をかける hammingWindow = np.hamming(len(signal)) signal = signal * hammingWindow # plot(range(0,len(hammingWindow)), hammingWindow) # xlabel("sample") # ylabel("amplitude spectrum") # savefig("hamming.png") # show() # 振幅スペクトルを求める spec = np.abs(np.fft.fft(signal, nfft))[:nfft//2] fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft//2] # プロット # plot(fscale, spec) # xlabel("frequency [Hz]") # ylabel("amplitude spectrum") # savefig("spectrum.png") # show() # メルフィルタバンクを作成 numChannels = 80 # メルフィルタバンクのチャネル数 df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅) filterbank, fcenters = melFilterBank(fs, nfft, numChannels) # メルフィルタバンクのプロット # for c in np.arange(0, numChannels): # plot(np.arange(0, nfft / 2) * df, filterbank[c]) # savefig("melfilterbank.png") # show() # 振幅スペクトルにメルフィルタバンクを適用 mspec = np.log10(np.dot(spec, filterbank.T)) # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示 # subplot(211) # plot(fscale, 20 * np.log10(spec)) # xlabel("frequency") # xlim(0, 5000) # subplot(212) # plot(fcenters, mspec) # xlabel("frequency") # xlim(0, 5000) # savefig("result_melfilter3.png") # show() # 離散コサイン変換 ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1) # plot(range(0, 80), ceps, "o-") # xlabel("quefrency") # xlim(0, 80) # savefig("result_melfilter4.png") # show() # ローパスリフタ # ケプストラムの高次成分を0にして微細構造を除去し、 # 緩やかなスペクトル包絡のみ抽出 cepCoef = nceps # ケプストラム次数 cpsLif = np.array(ceps) # arrayをコピー cpsLif_P = np.array(ceps) # arrayをコピー # 高周波成分を除く(左右対称なので注意) cpsLif[cepCoef:len(cpsLif)-1] = 0 # 低周波成分を除く(左右対称なので注意) cpsLif_P[1:cepCoef] = 0 # ケプストラム領域をフーリエ変換してスペクトル領域に戻す # リフタリング後の対数スペクトル dftSpc = scipy.fftpack.realtransforms.idct(cpsLif, type=2, norm="ortho", axis=-1) dftSpc_P = scipy.fftpack.realtransforms.idct(cpsLif_P, type=2, norm="ortho", axis=-1) PdftSpc_P = abs(10 ** (dftSpc_P) ) # オリジナルの対数スペクトルを描画 # plot(fcenters, mspec) # 高周波成分を除いた声道特性のスペクトル包絡を重ねて描画 # plot(fcenters, dftSpc, color="red") # 低周波成分を除いた音源特性のスペクトル包絡を重ねて描画 # plot(fcenters, dftSpc_P, color="green") # xlabel("frequency [Hz]") # ylabel("log amplitude spectrum") # xlim(0, 10000) # savefig("result.png") # show() # plot(fcenters, PdftSpc_P) # xlabel("quefrency[Hz]") # ylabel("power cepstrum") # xlim(0, 1000) # savefig("result_spectrumlif_P.png") # show() if (i == 1): # 低次成分を返す formant1 = [] formant1 = formant(dftSpc, fcenters) return formant1 if (i == 2): # 基本周波数を返す max_i = 3 max_value = ceps[3] for i in range(3, len(ceps)): if(ceps[i] > max_value): max_i = i max_value = ceps[i] # print(max_i, " ", fcenters[max_i], " ", len(ceps)) # f0 = 44100 / max_i f0 = 1.0 / (1.0 / fs * fcenters[max_i]) return f0 if __name__ == "__main__": args = sys.argv 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'] # 音声をロード for i in range(1, len(args)): for j in range(0, len(wavf)): wav = [] wavdata = [] wavfi = wavf[j] + args[i] + '.wav' wav, fs = wavread(wavfi) print(fs) t = np.arange(0.0, len(wav) / fs, 1/fs) # 音声波形の中心部分を切り出す center = len(wav) / 2 # 中心のサンプル番号 cuttime = 0.015 # 切り出す長さ [s] wavdata = wav[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)] # time = t[int(center - cuttime/2*fs) : int(center + cuttime/2*fs)] # 波形をプロット # plot(time * 1000, wavdata) # xlabel("time [ms]") # ylabel("amplitude") # savefig("waveform.png") # show() nfft = 2048 # FFTのサンプル数 nceps = 48 # MFCCの次元数 formant = mfcc(wavdata, nfft, fs, nceps, 1) f0 = mfcc(wavdata, nfft, fs, nceps, 2) # dftSpcmax = scipy.fftpack.realtransforms.idct(max, type=2, norm="ortho", axis=-1) print ('formant', i, ':', formant) # print ('mfcc', i, ':', ceps) print ('f0', i, ':', f0) # print ('mfcc', i, '_Pmax:', dftSpcmax) # print ('mfcc', i, '_Pmax:', f0) print ('\n') data = formant + f0 with open('test.csv','a',newline='') as f: writer = csv.writer(f) writer.writerow(data) 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

よろしくお願いします.

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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