匹配两个Mfcc系数序列

3

我从两个约30秒的音频文件中提取了两个MFCC系数序列,两个音频文件内容相同但来源不同。需要进行估计,确定这两个音频文件是否包含相同对话或不同对话。目前我已经测试了两个Mfcc系列之间的相关计算,但结果并不太合理。这种情况下有最佳实践吗?


为什么要使用MFCC来做这件事?我会尝试随时间相关几个低DFT频率。 - Efrain
“不同来源”是什么意思?“相同的语音内容”是否意味着在记录的会话中,说话者和措辞都相同?您试图解决什么问题?一般来说,我认为MFCC非常适合这项任务,但我需要您澄清我的问题,以便帮助您。问候 - KlausCPH
“不同来源”指的是在不同位置(即一个房间中的不同区域)录制相同演讲者和相同话语的记录会话时使用不同麦克风。 - Sney
"相干性"是比较两个信号之间的一种度量方式。我认为结果在频域中。完美的线将对应于完全相同的信号。 - Celdor
4个回答

4

我曾经遇到过同样的问题,解决方案是使用动态时间规整算法匹配两个MFCC数组。

在计算了MFCC后,你现在应该有两个信号的每个元素都包含一个帧的MFCC的数组(一个数组的数组)。第一步是计算一个数组中每个元素与另一个数组中每个元素之间的“距离”,即每两个MFCC集之间的距离(你可以尝试使用欧几里得距离)。

这将使你拥有一个二维数组(我们称之为“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).

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

如需进一步阅读,this paper 可以给您一个应用DTW到MFCCs的总体概述,而DTW算法的this presentation也可能有所帮助。


4

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

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

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


以上的答案建议使用卡方检验而不是闵可夫斯基距离。您为什么认为这样会有效呢? - user3668129
当我在匹配小样本的声音时,这对我很有帮助 - 它大大加快了处理速度。如果声音样本严重失真,则可能会导致一些问题,但对我来说,在这种情况下出现“未匹配”的结果是可以接受的。 - Vladimir T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接