【问题标题】:Matching two series of Mfcc coefficients匹配两个系列的 Mfcc 系数
【发布时间】:2011-10-19 09:54:57
【问题描述】:

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

【问题讨论】:

  • 您为什么要使用 MFCC 来这样做?我会尝试随着时间的推移关联几个低 DFT 频率。
  • “不同来源”是什么意思? “相同的语音内容”是否意味着录制会话中的相同说话者和相同单词?你想解决什么问题?一般来说,我的意思是 MFCC 非常适合这项任务,但我需要你澄清我的问题以便帮助你。问候
  • “不同来源”是指不同位置的不同麦克风(即一个房间的不同区域),在录制的会话中录制相同的演讲者和相同的单词。
  • Coherence 是比较两个信号的度量之一。我认为结果是在频域中。完美的线将对应完全相同的信号。

标签: matlab audio matching similarity mfcc


【解决方案1】:

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

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】:

    我遇到了同样的问题,解决方法是使用 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)。

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

    如需进一步阅读,this paper 可能会让您全面了解如何将 DTW 应用于 MFCC,this presentation 的 DTW 算法也可能会有所帮助。

    【讨论】:

      【解决方案3】:

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

      加入这个库后,两个MFCC的距离可以通过调用轻松计算(距离更小相似匹配):

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 以上答案建议使用卡方而不是 minkowski。为什么你建议它应该工作?
        • 当我匹配小的声音样本以匹配时,它适用于我的情况 - 它对加快过程有很大帮​​助。我认为如果声音样本严重失真可能会导致一些问题,但对我来说,在这种情况下产生“不匹配”结果是可以的。
        猜你喜欢
        • 2012-11-28
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        • 2015-10-20
        • 2020-03-25
        相关资源
        最近更新 更多