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

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

ただいまの
回答率

91.26%

  • Python 3.x

    2747questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 72

atena

score 7

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

コード

#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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

エラーの再現

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/26 12: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
    ```

    キャンセル

  • 2017/12/26 13:10

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

    キャンセル

  • 2017/12/26 13:16

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

    キャンセル

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

ただいまの回答率

91.26%

関連した質問

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

  • Python 3.x

    2747questions

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