匹配两个系列的Mfcc系数

问题描述 投票:2回答:4

我从大约30秒的两个包含相同语音内容的音频文件中提取了两个系列MFCC系数。音频文件从不同来源记录在同一位置。应该估计音频是包含相同对话还是包含不同对话。目前,我已经测试了两个Mfcc系列的相关性计算,但是结果不是很合理。是否有针对这种情况的最佳实践?

matlab audio matching similarity mfcc
4个回答
4
投票

我有相同的问题,解决方案是使用Dynamic Time Warping算法匹配两个MFCC数组。

[计算MFCC之后,对于两个信号中的每个,您现在都应该有一个数组,其中每个元素都包含一帧的MFCC(数组的数组)。第一步将是计算一个数组的每个元素与另一个数组的每个元素之间的“距离”,即每两组MFCC之间的距离(您可以尝试使用Euclidian Distance)。

这应该为您留下一个二维数组(我们称其为“ dist”),其中元素(i,j)代表第一个信号中第i个帧的MFCC与第一个信号中的MFCC之间的距离。第二个信号的第一个帧。

在此数组上,您现在可以应用DTW算法:

  • dtw(1,1)= dist(1,1)
  • dtw(i,j)= min(dtw(i-1,j-1),dtw(i-1,j),dtw(i,j-1))+ dist(i,j)。

表示两个文件之间的“差异”的值为dtw(n,m),其中n = nr。第一个信号中的帧数,m = nr。第二帧的数量。

[为进一步阅读,this paper可能会为您提供将DTW应用于MFCC的整体视图,而DTW算法的this presentation也可能会有所帮助。


3
投票

由于两个向量实际上都是直方图,因此您可能想尝试计算向量之间的卡方距离(直方图的常用距离度量)。

d(i) = sum (x(i) - y(i))^2/(2 * (x(i)+y(i)));

可以在此工具箱中找到良好的(mex)实现:

http://www.mathworks.com/matlabcentral/fileexchange/15935-computing-pairwise-distances-and-metrics

致电如下:

d = slmetric_pw(X, Y, 'chisq');

1
投票

我最近遇到了同样的问题。我发现最好的方法是使用音频库MIRtoolbox,它在音频处理方面非常强大。

[添加此库后,可以通过调用(较低的距离<=>类似的匹配项)来轻松计算两个MFCC的距离:

dist = mirgetdata(mirdist(mfcc1, mfcc2));

0
投票

我知道这个问题已经存在了将近10年,但是我现在正在寻找相同的东西,因此我个人认为上述建议过于复杂。对于仍在搜索的其他人,您可以从简单地使用scipy开始,以使用mfcc数据获取两个矩阵之间的距离:

>>> from scipy.spatial import minkowski_distance
>>> a = [[-2.231413e+01,-5.495589e+01,-2.177988e+01,-1.719458e+01,-1.513321e+01,1.324277e+01,-9.265136e-01,1.542478e+01,1.007597e+01,7.356851e-01,1.106412e+01,-9.447377e+00,-1.325694e+00 ],[-2.294377e+01,-5.487790e+01,-2.152807e+01,-1.725173e+01,-1.500316e+01,1.287956e+01,-7.995839e-01,1.540848e+01,1.040512e+01,3.215451e-01,1.113061e+01,-9.390820e+00,-1.065433e+00 ], [-2.251059e+01,-5.475804e+01,-2.188462e+01,-1.709198e+01,-1.516142e+01,1.278525e+01,-7.952995e-01,1.602424e+01,9.981795e+00,4.940354e-01,1.081703e+01,-9.485857e+00,-7.487018e-01 ]]
>>> b = [[-2.231413e+01,-5.495589e+01,-2.177988e+01,-1.719458e+01,-1.513321e+01,1.324277e+01,-9.265136e-01,1.542478e+01,1.007597e+01,7.356851e-01,1.106412e+01,-9.447377e+00,-1.325694e+00 ], [-2.294327e+01,-5.488413e+01,-2.152952e+01,-1.724601e+01,-1.500094e+01,1.287461e+01,-8.023301e-01,1.541246e+01,1.040808e+01,3.185866e-01,1.112774e+01,-9.388848e+00,-1.062943e+00], [-2.250507e+01,-5.481581e+01,-2.189883e+01,-1.704281e+01,-1.514221e+01,1.274256e+01,-8.183736e-01,1.606115e+01,1.000806e+01,4.662135e-01,1.079070e+01,-9.468561e+00,-7.260294e-01 ]]
>>> minkowski_distance(a, b)
array([0.        , 0.01274899, 0.11421053])

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.minkowski_distance.html

要获取我正在使用yaafe(打包在Docker容器中)的详细MFCC数据:http://yaafe.github.io/Yaafe/manual/install.html

这是解决安装问题的方法:https://github.com/Yaafe/Yaafe/issues/52

© www.soinside.com 2019 - 2024. All rights reserved.