0

RPi と Python を使用して音声コマンド プロジェクトをビルドしたいと考えています。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 配列形式です。助けてください....

4

2 に答える 2

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)

于 2016-03-15T14:09:38.710 に答える
0

mfcc1mfcc2リストまたはnumpy配列である必要があります。彼らは正しいタイプを持っていますか?

于 2016-03-15T12:56:08.137 に答える