2016-03-15 4 views
0

Я хочу построить проект голосовой команды с помощью RPi и python. Я использую 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) 

Run Файл:

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 не являются волной 1 и волной2, они являются локальными переменными в функции dist. Функция dist по умолчанию - 'lambda a, b: abs (a - b)', вам нужно переопределить ее. –

+0

О, хорошо, я понял, но почему в файле запуска я не могу распечатать dist, который выводится из fastdtw. Он сказал синтаксическую ошибку. Я так запутанный –

0

mfcc1 и mfcc2 должны быть перечислены или массивом numpy. У них правильный тип?

+0

вывод mccc в форме массива numpy. –