2016-03-15 36 views
0

我想使用RPi和python構建Voice命令項目。我使用MFCC和fastDTW來匹配這個聲音,但我得到了這個錯誤,我不知道如何解決它。這裏的代碼...使用序列設置數組元素(MFCC + fastDTW,Python)

def fastdtw(x, y, radius=1, dist=lambda a, b: abs(a - b)): 
    min_time_size = radius + 2 

    if len(x) < min_time_size or len(y) < min_time_size: 
     return dtw(x, y, window = None, dist=dist) 

    x_shrinked = __reduce_by_half(x) 
    y_shrinked = __reduce_by_half(y) 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    window = __expand_window(path, len(x), len(y), radius) 
    return dtw(x, y, window, dist=dist) 


def dtw(x, y, window=None, dist=lambda a, b: abs(a - b)): 
    len_x, len_y = len(x), len(y) 
    if window is None: 
     window = [(i, j) for i in xrange(len_x) for j in xrange(len_y)] 
    window = [(i + 1, j + 1) for i, j in window] 
    D = np.full((len_x+1, len_y+1), np.inf, dtype=('f4, i4, i4')) 
    D[0, 0] = (0, 0, 0) 
    for i, j in window: 
     D[i, j] = min((D[i-1, j][0], i-1, j), (D[i, j-1][0], i, j-1), (D[i-1, j-1][0], i-1, j-1), key=lambda a: a[0]) 
     D[i, j][0] += dist(x[i-1], y[j-1]) 
    path = [] 
    i, j = len_x, len_y 
    while not (i == j == 0): 
     path.append((i-1, j-1)) 
     i, j = D[i, j][1], D[i, j][2] 
    path.reverse() 
    return (D[len_x, len_y][0], path) 

運行文件:

from __future__ import absolute_import, division, print_function, unicode_literals 
from features import mfcc 
from features import logfbank 
import scipy.io.wavfile as wav 
import time 
from numpy.linalg import norm 
import unittest 
import numpy as np 
from fastdtw import fastdtw, dtw 
import bisect 
from six.moves import xrange 
from collections import defaultdict 

start = time.time() 
(rate1,sig1) = wav.read("/home/pi/OpenCalculator.wav") 
(rate2,sig2) = wav.read("/home/pi/voiceCommand.wav") 
mfcc1 = mfcc(sig1,rate1) 
mfcc2 = mfcc(sig2,rate2) 

dist, path = fastdtw(mfcc1, mfcc2) 

elapsed = time.time()-start 

這是錯誤消息:

Traceback (most recent call last): 
    File "/home/pi/test.py", line 23, in <module> 
    dist, path = fastdtw(mfcc1, mfcc2) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 20, in fastdtw 
    distance, path = fastdtw(x_shrinked, y_shrinked, radius=radius, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 16, in fastdtw 
    return dtw(x, y, window = None, dist=dist) 
    File "build/bdist.linux-armv7l/egg/fastdtw.py", line 34, in dtw 
    D[i, j][0] += dist(x[i-1], y[j-1]) 
ValueError: setting an array element with a sequence. 

*** MCCC的輸出是numpy的陣列形式。 請幫忙....

回答

1

您需要重新定義距離,特徵向量,而不是數字來工作(默認距離可與數字,而不是與向量):

def mfcc_dist(a,b): 
     dist = 0 
     for x, y in zip(a,b): 
      dist = dist + (x - y) * (x - y) 
     return sqrt(dist) 

dist, path = fastdtw(mfcc1, mfcc2, dist=mfcc_dist) 

您還可以使用numpy.linalg.norm(a-b)

+0

a和b是wave1&wave2文件嗎? –

+0

不,a和b不是wave1和wave2,它們是dist函數中的局部變量。默認dist函數是'lambda a,b:abs(a - b)',您需要重新定義它。 –

+0

噢好吧我知道了,但爲什麼在運行文件中我無法打印出從fastdtw輸出的dist。它說的語法錯誤。我很困惑 –

0

mfcc1 and mfcc2應該是list或numpy數組。他們有正確的類型嗎?

+0

mccc的輸出是numpy數組形式。 –

相關問題