Matlab 匹配两个Mfcc系数序列

Matlab 匹配两个Mfcc系数序列,matlab,audio,matching,similarity,mfcc,Matlab,Audio,Matching,Similarity,Mfcc,我从两个大约30秒的音频文件中提取了两个系列的MFCC系数,这些文件由相同的语音内容组成。音频文件从不同来源记录在同一位置。应该估计音频中包含的是相同的对话还是不同的对话。目前,我已经测试了两个Mfcc系列的相关性计算,但结果不是很合理。此场景是否有最佳实践?由于这两个向量实际上是直方图,您可能需要尝试计算向量之间的卡方距离(直方图的常用距离度量) 可以在此工具箱中找到一个良好的(mex)实现: 电话如下: d = slmetric_pw(X, Y, 'chisq'); 我遇到了同样的问题,

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

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

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

电话如下:

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

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

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

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

现在,您可以在此阵列上应用DTW算法:

  • dtw(1,1)=距离(1,1)
  • dtw(i,j)=最小值(dtw(i-1,j-1),dtw(i-1,j),dtw(i,j-1))+dist(i,j)
表示两个文件之间“差异”的值是dtw(n,m),其中n=第一个信号中的帧数,m=第二个信号中的帧数


为了进一步阅读,我可能会向您提供将DTW应用于MFCC的总体视图,DTW算法也可能会有所帮助。

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

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


我知道这个问题已经存在了将近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])

为了获得详细的MFCC数据,我使用了yaafe(打包在Docker容器中):


以下是解决安装问题的方法:

为什么要使用MFCC来解决此问题?我会试着在一段时间内校正几个低DFT频率。你说的“不同来源”是什么意思?“相同的演讲内容”是否意味着录音会话中的相同演讲者和相同单词?你想解决什么问题?总的来说,我的意思是MFCC非常适合这项任务,但我需要你澄清我的问题,以便帮助你。关于“不同来源”,我指的是不同位置(即一个房间的不同区域)的不同话筒,在录制的会话中录制相同的扬声器和相同的单词。是比较两个信号的方法之一。我认为结果是频域的。完美的线条将对应于完全相同的信号。
dist = mirgetdata(mirdist(mfcc1, mfcc2));
>>> 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])