匹配两个系列的Mfcc系数

时间:2011-08-03 19:23:53

标签: matlab audio matching similarity mfcc

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

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,解决方法是使用Dynamic Time Warping算法匹配两个MFCC阵列。

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

这应该给你留下一个二维数组(我们称之为“dist”),其中元素(i,j)表示第一个信号中第i帧的MFCC与j的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)。< / LI>

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

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

答案 1 :(得分: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');

答案 2 :(得分:1)

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

添加此库后,可以通过调用(较低距离&lt; =&gt;类似匹配)轻松计算两个MFCC的距离:

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

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

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

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