我正在尝试使用Mel实现语音识别模块 频率倒谱系数(MFCC)和动态时间扭曲(DTW)。
我将信号(x(n))分成25ms的帧,重叠10ms,找到每帧的MFCC参数。 我的主要疑问是如何在这种情况下执行DTW。 假设有M帧和N(13)个MFCC系数。
所以我有一个M×N矩阵。 现在我该如何计算DTW?
答案 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]