MFCC 特征量模拟器 返回
语音信号处理模拟器

MFCC 特征量模拟器 — 梅尔频率倒谱系数

从语音信号经过预强调、汉明窗、FFT、梅尔滤波器组、对数、DCT 提取 MFCC 的过程分阶段可视化。直观学习语音识别的标准特征量。

参数设置
主频率成分 1 f₁
Hz
主频率成分 2 f₂
Hz
梅尔滤波器数 M
MFCC 系数数 L

暂停时,拖动滑块即可即时更新结果。

假设采样频率 F_s = 16000 Hz、帧长 N = 512、预强调系数 α = 0.97。噪声由确定性 LCG 生成。

计算结果
梅尔滤波器数 M
MFCC 系数数 L
主要梅尔频带
第1 MFCC c₁
MFCC 提取管道

从上到下:输入信号 x[n](蓝色)/ 功率谱 |X[k]|²(绿色)/ 梅尔滤波器组能量 log E_m(橙色)/ MFCC 系数 c_n(红色)

理论和主要公式

MFCC 是通过"接近人类听觉的梅尔标度"和"倒谱分析"的组合将语音信号压缩的特征量。处理顺序为预强调 → 窗口 → DFT → 梅尔滤波器组 → 对数 → DCT。

预强调用来强调高频(α ≈ 0.97):

$$y[n] = x[n] - \alpha\,x[n-1]$$

对 N 个样本应用汉明窗后进行 DFT,求功率谱 $|X[k]|^2$。梅尔标度转换:

$$m(f) = 2595\,\log_{10}\!\left(1 + \frac{f}{700}\right)$$

在梅尔轴上等间距排列 M 个三角梅尔滤波器 $H_m$,获得对数滤波器组能量:

$$\log E_m = \log\!\left(\sum_{k} H_m[k]\,|X[k]|^2\right)$$

最后用 DCT 提取倒谱系数:

$$c_n = \sum_{m=0}^{M-1} \log E_m \cdot \cos\!\left(\frac{\pi n (m+\tfrac{1}{2})}{M}\right)$$

DCT 的作用是"分离对数谱的包络(声道)"和"微细结构(声带)"。低阶 c_n 对应声道形状,高阶对应声带振动。

MFCC 特征量模拟器是什么

🙋
经常听说语音识别,但计算机不是直接比较原始波形吧?
🎓
你观察得很敏锐。同一个"啊"音,由于说话人、声调、录音环境的不同,波形形状完全不同。所以要转换成称为"特征量"的数值集合,这样可以更容易识别音素。MFCC——梅尔频率倒谱系数——是一种古老而强大的特征量。上面的模拟器展示了从输入波形到谱、梅尔轴、对数、DCT 的分阶段转换过程,分为 4 段图进行展示。
🙋
"梅尔"是什么意思?普通频率不行吗?
🎓
人的耳朵对低频很敏感,对高频比较迟钝。1000 Hz 和 2000 Hz 的差异被感受为很大,但 6000 Hz 和 7000 Hz 的差异几乎察觉不到。梅尔标度是对这种听觉特性建模的非线性轴,定义为 $m(f) = 2595\,\log_{10}(1 + f/700)$。看第 3 段图,你会发现低频段的滤波器密集,高频段稀疏。
🙋
最后的 DCT 是干什么的?对数之后还要变换?
🎓
DCT 的作用是"压缩"和"分离"。对数梅尔谱中混合了声道形状(包络)和声带振动(微细结构)。应用 DCT 后,低阶系数包含"缓慢变化分量=声道形状",高阶包含"快速振动分量=声带"。音素识别最重要的是声道形状,所以只需取低阶的 12-13 个就够了。在模拟器中把 L 从 4 增加到 20,你会看到后面的系数很小,信息量很少。
🙋
我明白了!当我把梅尔滤波器数 M 改为 10 时,滤波器组的条形数减少了。太少的话会不行吗?
🎓
正是这样,M 决定了谱的分解能。10 太粗糙了,音素之间的细微差异会消失。反之,增加到 40 分解能会提高,但相邻滤波器的相关性会增加,后面的 DCT 会变得冗余。实际应用中通常选择 20-40 之间的值,特别是 26 或 40 最常见。在模拟器中改变 M,对比第 3 和第 4 段图,能体验到这种折衷。

常见问题

语音信号由于声带振动的影响,低频能量很大,高频衰减约 -6 dB/oct。预强调 $y[n] = x[n] - \alpha x[n-1]$(α ≈ 0.97)是一个补偿这种衰减的高频强调滤波器,目的是防止后段谱表示中高频音素信息(特别是辅音)被掩盖。
DFT 假设信号是周期的,对有限长帧进行 DFT 时,两端的不连续会在谱中产生虚假的高频成分(谱泄漏)。汉明窗通过将帧的两端平滑地降到 0 来减少泄漏,同时使主峰更尖锐。窗口的选择(汉明、汉宁、布莱克曼等)涉及峰值锐度和旁瓣的权衡。
三角形被广泛采用是因为计算简单,并且在梅尔轴上相邻滤波器可以设计成半重叠。从物理角度来说,它对应人类听觉的"临界带宽",每个滤波器代表一个听觉通道。形状改为高斯或矩形结果差异不大,三角形是实用的折衷方案。
麦克风种类、房间混响、信道特性改变时,对数谱会产生直流偏置,MFCC 整体偏移。CMVN 是在发话级别或几秒时间窗口上对 MFCC 各维度减去平均值、除以方差的正规化,产生对信道不变的特征。实际运用中,它对说话人和录音条件不匹配的鲁棒性影响很大,几乎是必须的后处理。

实际应用

语音识别(ASR):HMM-GMM 时代的语音识别系统标准配置是在每个 10ms 帧上提取 13 维 MFCC + Δ + ΔΔ 的 39 维向量,输入到声学模型。Kaldi 等至今仍广泛使用的语音识别工具包采用 MFCC 作为基本特征量。

说话人识别和说话人验证:说话人的声道形状和声带特性强烈体现在 MFCC 的包络信息中。从经典的 GMM-UBM、i-vector 到现代的 x-vector,许多说话人嵌入方法都将 MFCC 作为输入特征。智能手机的"OK Google""Hey Siri"等说话人相关的唤醒词检测内部也使用类似的特征。

音乐信息处理:乐器音的音色识别、流派分类、乐曲相似度搜索也广泛使用 MFCC 作为基本特征。Shazam 等音乐搜索应用的指纹算法中,MFCC 被用作辅助特征。Python 音乐分析库 Librosa 默认提供 MFCC 提取函数。

异常音检测和预测性维护:在 CAE 相关领域,从机器运行声音检测异常,MFCC 是将时间波形压缩为低维特征的有用手段。旋转机械的轴承故障、电力设备的电晕放电、汽车发动机的爆震检测等"人类能通过听声音感受到差异"的任务自动化都用到了它。

常见误解和注意事项

最常见的误解是把"MFCC 就是频率谱"搞混。MFCC 实际上是对谱取对数后再做 DCT 的"倒谱"。横轴不是频率,而是称为"倒频率(quefrency)"的时间维度。低阶 c_n 代表对数谱的大局形状(声道),高阶 c_n 代表急剧变化(声带音高和噪声)。看模拟器的第 3 段(log E_m)和第 4 段(c_n),要意识到虽然都是"纵轴对数能量",但横轴的含义完全不同。

次常见的误解是"帧长 N 越长精度越高"。本模拟器固定 N = 512(约 32ms),这是语音处理的典型值。过长会导致同一帧内包含多个音素或清浊音转换,特征量会变得模糊。过短则低频分解能不足。实际应用中,标准做法是将 20-30ms 的帧长和 10ms 的帧移结合,实现时间分辨率和频率分辨率的平衡。

最后要注意"盲目相信 MFCC 万能"。MFCC 是与线性预测、傅里叶变换并列的经典特征量,但近年的 end-to-end 神经网络语音识别越来越多地直接使用梅尔滤波器组(不进行 DCT 的 log-mel spectrogram)或原始波形。DCT 的维度压缩优点(计算量减少、参数减少)和丢弃信息的缺点(切掉高阶系数)是权衡关系。需要根据任务类型、计算资源、模型结构来判断 MFCC、log-mel 或原始波形中哪一个最优。

使用指南

  1. 在 8000Hz-16000Hz 范围内设置采样频率(F1)。语音录音的标准值是 16000Hz
  2. 奈奎斯特频率(F2)自动设为采样频率的一半。当 F1=16000Hz 时,F2=8000Hz
  3. 从 20-128 范围内选择梅尔滤波器组数(M)。语音识别的标准值是 40 个
  4. 指定 DFT 大小(L)为 512-4096,调整 FFT 的频率分辨率
  5. 设置各参数后,依次显示频谱图→梅尔标度变换→倒谱系数的三个阶段

具体计算示例

采样频率 16000Hz、奈奎斯特频率 8000Hz、梅尔滤波器 40 个、DFT 大小 2048,分析日语五个元音"a·i·u·e·o"的语音第 0 帧时,MFCC c₀(对数能量成分)约为 85.3dB,c₁ 为 -2.47,最大能量的滤波器序号是 12(约 1200Hz 附近的辅音能量集中),最后的梅尔滤波器中心频率计算为 7813Hz

实际应用中的注意事项