使用序列设置数组元素(MFCC + fastDTW,Python)

时间:2016-03-15 12:18:09

标签: python-2.7 raspberry-pi2 voice-recognition mfcc

我想使用RPi和python构建Voice命令项目。我使用MFCC和fastDTW来匹配那个声音,但我收到了这个错误,我不知道如何修复它。代码......

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数组形式。 请帮帮....

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

mfcc1mfcc2应该是list或numpy数组。他们的类型是否正确?