如何将MFCC系数应用于DTW

时间:2017-02-18 11:17:13

标签: speech-recognition mfcc

我正在尝试使用Mel实现语音识别模块 频率倒谱系数(MFCC)和动态时间扭曲(DTW)。

我将信号(x(n))分成25ms的帧,重叠10ms,找到每帧的MFCC参数。 我的主要疑问是如何在这种情况下执行DTW。 假设有M帧和N(13)个MFCC系数。

所以我有一个M×N矩阵。 现在我该如何计算DTW?

2 个答案:

答案 0 :(得分:2)

MxN的矩阵可以表示为1D-向量MxN长度。

所以,你有pattern1

p1[M*N], len=i, 'silence-HHHEEEEELLLLLOOOOOOOO-silence' sound;

然后,第二次

p2[M*N], len=j, like 'HHHHHHEEELLOOOO'
然后DTW由曼哈顿,欧几里得,Bray-Curtis等距离计算得到输出2d矩阵,将有一条最小权重的路径。

答案 1 :(得分:0)

使用DTW假设您要验证2个音频序列。因此,对于要验证的序列,您将具有矩阵M1xN,对于查询M2xN。这意味着您的成本矩阵将为M1xM2。

要构建成本矩阵,您必须在序列之间应用距离/成本度量,因为cost(i,j)= your_chosen_multidimension_metric(M1 [i,:],M2 [j,:])

生成的 cost 矩阵为2D,您可以轻松应用DTW。

我为基于MFCC的DTW编写了类似的代码。下面是Python的实现,它可以还原DTW得分; x和y是语音序列的MFCC矩阵,尺寸为M1xN和M2xN:

def my_dtw (x, y):
    cost_matrix = cdist(x, y,metric='seuclidean')
    m,n = np.shape(cost_matrix)
    for i in range(m):
        for j in range(n):
            if ((i==0) & (j==0)):
                cost_matrix[i,j] = cost_matrix[i,j]

            elif (i==0):
                cost_matrix[i,j] = cost_matrix[i,j] + cost_matrix[i,j-1]

            elif (j==0):
                cost_matrix[i,j] = cost_matrix[i,j] + cost_matrix[i-1,j]

            else:
                min_local_dist = cost_matrix[i-1,j]

                if min_local_dist > cost_matrix[i,j-1]:
                    min_local_dist = cost_matrix[i,j-1]

                if min_local_dist > cost_matrix[i-1,j-1]:
                    min_local_dist = cost_matrix[i-1,j-1]

                cost_matrix[i,j] = cost_matrix[i,j] + min_local_dist
    return cost_matrix[m-1,n-1]