在 MFCC 上使用 DTW 将口语单词与模板匹配

信息处理 演讲 mfcc 模板匹配
2022-01-03 03:37:52

我正在尝试在 MATLAB 中编写一个简单的算法,用于检测单个单词。目标是让用户记录一次单词作为模板,然后让用户重复相同的单词以尝试检测它。在这个网站上搜索已经回答了我的许多问题,但我仍然有一些疑问。

到目前为止,我的算法通过以下方式计算 MFCC:

  • 从 .wav 文件中提取数据(记录在8000 Hz)
  • 构建框架64 ms50%重叠,应用汉恩窗
  • 计算所有这些帧的 FFT
  • 使用 FFT 结果计算功率谱 (P(k)=|X(k)|2)
  • 对于每一帧,通过将功率谱与 26 个 Mel 滤波器相乘并对给定 Mel 滤波器的结果求和来提取 26 个系数
  • 计算log10的系数
  • 对帧的 26 个系数应用 dct

我的目标是使用模板的 MFCC 以及重复工作的 MFCC,并使用 DWT 算法对它们进行比较。我的 DWT 算法已经编程并且可以运行。

但是,我的算法效果不佳,并且某些参数似乎对结果影响很大。以下是我的问题:

  1. 这些步骤是否足以检测口语单词?

  2. 使用大量固定模板而不是让用户预先录制模板会更好吗?哪种方法应该导致更好的识别性能?

  3. 如果该人使用与麦克风不同的距离重复单词,则 MFCC 的增加/减少值足以弄乱 DTW 结果。有没有一种聪明的方法来规范 MFCC 以尝试消除麦克风距离的影响?

  4. 一些网站建议仅使用具有最小值的 13 个 MFCC。

    • 这是为什么?
    • 另外,他们是在谈论最小的量级还是最小值?
    • 假设 13 个 MFCC 是非常大的负数,而其他 13 个 MFCC 是小的正数,我会保留哪一组?

编辑:此外,每帧的第一个系数总是比其他系数大得多。我会说它的幅度比我的 100 倍大。显然,当我使用欧几里得距离计算 DTW 时,我会说这个系数是唯一相关的系数,因为它比所有其他值都大得多。它应该被丢弃吗?

2个回答
  1. 是的,这对于一个基本的孤立词识别系统来说应该足够了。可能不是商业产品,但对于大学项目或演示来说已经足够了......

  2. 最好让用户记录一个单词并与之匹配,而不是尝试与不同说话者对同一单词的大型数据库进行匹配。数据库越大,您就越有可能找到与用户语音匹配的话语,但与大型数据库匹配的计算成本会很高!

  3. 第一个 MFCC 捕获信号能量 - 您可能会在进行匹配时尝试将其移除(您的特征向量将因此包含 MFCC #2 到 13) - 这将使识别对幅度变化更加稳健。

  4. 你可能误会了什么。你有这样一个网站的链接吗?

MFCC 的一般比例是,随着系数指数的增加,该系数的标准偏差减小(DCT 可以被认为是 PCA 的近似值) - 因此较低的系数将具有更大的幅度。您可以通过一劳永逸地估计训练集上每个 MFCC 系数的标准偏差,并在 DTW 步骤之前将每个系数除以其标准偏差(或它的幂 < 1.0)来弥补这一点。

我认为这种方法应该很好用(几年前我做过非常类似的项目)。您可能会考虑的事项:

  1. 您可能希望对信号使用预加重滤波器。
  2. 除了 MFCC 功能之外,您还可以包括ΔΔΔ(一阶和二阶导数 - 简单的差异)。
  3. 在我的情况下,与更多模板进行比较大大提高了识别率。我认为最简单的方法是对从 DWT 返回的距离使用 k-NN 算法。

祝你好运!