MCFF(Mel Frequency Cepstrum Coefficient)的计算过程、背景以及相应的python代码。

MFCC:考虑了人的听觉系统特性,将线性频谱映射到基于听觉感知特性的 Mel 频谱上,然后再计算倒谱。声道的 shape 表现为短时间功率谱的包络线(envelope of the short time power spectrum),MFCCs 的工作则是如何准确地表征这种 envelope。

1. 人听觉系统的特性

人听到的声音高低和声音频率不成线性关系,而是成对数关系。

屏蔽效应:人不能听到所有的声音,只有两个频率分量相差一定的带宽时,人耳才能区分。否则只有听到一个音调。这个带宽称为临界带宽

  • 其中$f_c$为中心频率。
  • 当$f_c$在 1kHz 以下时,临界带宽基本恒定为 100Hz。
  • 当$f_c$在 1kHz 以上时,临界带宽呈指数增加。

模拟上述的听觉特性,可以进行构造模仿人耳的感知特性。

  • Mel 频率尺度:对数关系
  • Mel 滤波器组:屏蔽效应
    • 每一个滤波器的中心频率在 mel 频率域中呈等间隔分布
    • 每一个滤波器的带宽在其临界带宽范围内

2. MFCC的计算步骤

  1. 输入语音信号 — 语音波谱
  2. 预加重、分帧、加窗 — 分为不同帧的语音波谱
  3. 用 FFT 计算信号频谱 — 不同帧对应的频谱
  4. 计算频谱的绝对值/平方 — 不同帧对应的能量谱
  5. 使用 Mel 滤波器组 — 获得更符合人类听觉的 Mel 谱特征
  6. 取对数 — 为了倒谱做准备
  7. DCT — 将乘积通过对数转化为加法。
  8. Delta MFCC
  9. 输出语音特征

2.1 预加重、分帧、加窗

2.1.1 预加重

即通过一个高通滤波器。在时域中写为:

预加重的目的是使频谱变得平坦。同时,也是为了消除发生过程中声带和嘴唇的效应,来补偿语音信号受到发音系统所抑制的高频部分,也为了突出高频的共振峰。$\mu$的取值一般为 0.9~1 之间。

2.1.2 分帧
一个窗为一帧。通常情况下 N=256,时间为 20ms~30ms。对于 8kHz 的信号来说,若帧长度为 256 个采样点,则对应的时间为$256 / 8000\times 1000 = 32ms$。

2.1.3 加窗
对每一帧使用汉明窗。通常,$a$取值为 0.46.

2.2 FFT

对每一帧进行 FFT,变换到频率域中。

2.3 Mel滤波器组

人的听力像是一组滤波器(见第一节讨论的屏蔽效应),听见的声音在频谱上是不连续的;并且在低频上分布更密集(同样参见第一节中人听到的声音特性)。将能量谱通过一组 Mel 尺度的三角形滤波器组,定义一个有 $M$ 个滤波器的滤波器组。

  • 中心频率$f_c(l)$在 Mel 频率域中是等间隔分布
  • 每一个滤波器的中心频率为:其中:$N$为窗口宽度,$F_s$为采样频率,$M$为滤波器数量,通常取 22~26。通过上式可以获得 M 个带通滤波器$H_m(k)$

对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰。因此一段语音的音调或音高,是不会呈现在 MFCC 参数内,换句话说,以 MFCC 为特征的语音辨识系统,并不会受到输入语音的音调不同的影响。此外,还可以降低运算量。

计算每个滤波器组输出的对数能量。其中$M$为滤波器个数,$N$为窗口大小。

2.4 离散馀弦变换(DCT)

对滤波器组输出$S(m)$,DCT 得到 Mel 频率的倒谱系数$c(n)$。

DCT 正变换:

DCT 反变换:

将$S(m)$作为上式中的$f(x)$,$m$作为$x$得到下式:

这里的$L$是 MFCC 系数的阶数,通常取 12~16。

2.5 Delta MFCC

到此为止,MFCC 只是获得了当前帧的语音特征。而相邻帧之间是连续的,可以通过相邻帧之间的变化更好地表达语音的特征。

3. MFCC常用参数集

参数 取值
$\mu$(预加重参数) 0.9~1
$N$(窗口大小) 256/512
采样率 8kHz/16kHz
帧长 20ms~30ms
$M$(Mel 滤波器组数量) 22~26
$L$(MFCC 阶数) 12~16
$a$(汉明窗系数) 0.46

4. 参考

  1. 这篇文章将原理解释得挺不错:梅尔频率倒谱系数(MFCC)
  2. 这篇将流程解释得更清楚:语音特征 MFCC 提取过程详解