语音识别AI之----fbank和mfcc

一、简介

Fbank(滤波器组能量特征)和MFCC(梅尔频率倒谱系数)是语音识别中最核心的声学特征提取方法,二者均通过模拟人耳非线性听觉特性处理语音信号。Fbank直接输出梅尔滤波器组的能量值,而MFCC在Fbank基础上增加对数压缩和离散余弦变换(DCT),进一步降维并去除特征相关性。现代语音识别系统中,Fbank因保留更多频谱细节更适用于深度学习模型(如CNN/RNN),而MFCC因维度低、相关性弱传统上更适合GMM-HMM系统。

复制代码
原始语音 → 预加重→ 分帧加窗 → FFT → Mel 滤波器组 → 取对数 → 【FBank 特征 80 维】
                                                          ↓ 继续
                                                          DCT 去相关 → 取前 N 维 → 【MFCC 特征】

一张图解释fbank和MFCC的计算来源

这里不讲原理公式,只梳理下每个步骤的作用和输出维度,方便后续语音处理的理解,因为现在的语音模型基本离不开这些处理。

序号 步骤名称 核心原理 关键作用 适用场景
1 预加重 一阶高通滤波,补偿声门激励、口鼻辐射造成的高频衰减 提升高频信噪比、平衡频谱平坦度 FBANK、MFCC 通用前置
2 分帧加窗 把非平稳语音切分为 20~30ms 短时平稳帧,帧移 10~15ms;汉明窗抑制频谱泄漏 保证短时平稳性、稳定时频分析、弱化帧边界突变干扰 FBANK、MFCC 通用前置
3 FFT 变换 加窗时域信号转复数频谱,舍弃相位、仅保留幅度谱 完成时域转频域,为人耳不敏感相位做舍弃,奠定频带分析基础 FBANK、MFCC 通用前置
4 Mel 滤波器组 20~80 个非均匀三角滤波器,低频密集、高频稀疏,线性频谱映射到 Mel 人耳感知尺度 贴合人耳非线性听觉特性,突出语音共振峰结构 FBANK、MFCC 通用核心步骤
5 取对数 遵循韦伯 - 费希纳定律,对 Mel 能量做对数压缩 压缩能量动态范围,模拟人耳响度感知,增强弱语音成分表征 FBANK、MFCC 通用步骤
6 FBank 特征 (80 维) 直接输出对数梅尔滤波器组能量,保留频带间相关性 完整保留频谱局部关联特征 深度学习:Whisper、Conformer、Wav2Vec、TTS 等
7 DCT 去相关 对对数梅尔谱做离散余弦变换,解耦相关频带能量 去除特征相关性,集中提取声道形状低阶倒谱信息 MFCC 专属步骤
8 MFCC 特征 截取 DCT 前 12~13 维低阶系数,舍弃高阶噪声分量 表征声道共振峰轮廓,满足传统模型特征独立假设 传统模型:GMM-HMM、早期 DNN-HMM、嵌入式轻量语音算法

1.1 示例代码:

复制代码
pip install librosa numpy

import numpy as np
import librosa

# ===================== 固定配置 =====================
target_sr = 16000        # 目标采样率 16kHz
pre_emph_coeff = 0.97    # 预加重系数
frame_ms = 25            # 帧长 25ms
hop_ms = 10              # 帧移 10ms
n_fft = 512              # FFT 点数
n_mels = 80              # FBank 80维
n_mfcc = 13              # MFCC 取前13维

# 计算帧长/帧移的采样点数
frame_len = int(target_sr * frame_ms / 1000)
hop_len = int(target_sr * hop_ms / 1000)

# ===================== 0. 加载语音 + 重采样到 16kHz =====================
wav_path = "test.wav"  # 你的音频路径
sig, original_sr = librosa.load(wav_path, sr=None)  # 不自动重采样

# 重采样到 16kHz(不管输入是 8k/32k/44k/48k,全部转 16k)
sig_resample = librosa.resample(sig, orig_sr=original_sr, target_sr=target_sr)
print(f"原始采样率: {original_sr} Hz → 重采样到 {target_sr} Hz")
print(f"0.重采样后信号 shape: {sig_resample.shape}")

# ===================== 1. 预加重 =====================
def pre_emphasis(signal, alpha=0.97):
    return np.append(signal[0], signal[1:] - alpha * signal[:-1])

sig_pre = pre_emphasis(sig_resample, pre_emph_coeff)
print("1.预加重后 shape:", sig_pre.shape)

# ===================== 2. 分帧 + 汉明窗 =====================
def framing_and_window(signal, frame_len, hop_len):
    num_frames = int(np.ceil((len(signal) - frame_len) / hop_len))
    frames = np.zeros((num_frames, frame_len))
    for i in range(num_frames):
        start = i * hop_len
        end = start + frame_len
        frames[i] = signal[start:end]
    ham_win = np.hamming(frame_len)
    frames_win = frames * ham_win
    return frames_win

frames_win = framing_and_window(sig_pre, frame_len, hop_len)
print("2.分帧加窗后 shape (帧数, 每帧点数):", frames_win.shape)

# ===================== 3. FFT → 幅度/功率谱 =====================
def stft_pow_spec(frames, n_fft):
    fft_res = np.fft.fft(frames, n=n_fft)
    mag_spec = np.abs(fft_res)
    pow_spec = (mag_spec ** 2) / n_fft
    return pow_spec[:, :n_fft//2 + 1]  # 取前半频段

pow_spec = stft_pow_spec(frames_win, n_fft)
print("3.FFT功率谱 shape (帧数, 频点):", pow_spec.shape)

# ===================== 4. Mel 滤波器组 =====================
mel_filter = librosa.filters.mel(sr=target_sr, n_fft=n_fft, n_mels=n_mels)
mel_energy = np.dot(pow_spec, mel_filter.T)
print("4.Mel滤波后 shape (帧数, mel维):", mel_energy.shape)

# ===================== 5. 取对数 =====================
log_mel = np.log(mel_energy + 1e-8)
print("5.对数Mel后 shape:", log_mel.shape)

# ===================== 6. FBank 80维 完成 =====================
fbank = log_mel
print("6.最终FBank特征 shape (帧数, 80维):", fbank.shape)

# ===================== 7. DCT 去相关 =====================
dct_feat = librosa.feature.dct(log_mel.T, n_mfcc=n_mfcc).T
print("7.DCT变换后 shape:", dct_feat.shape)

# ===================== 8. MFCC 13维 完成 =====================
mfcc = dct_feat
print("8.最终MFCC特征 shape (帧数, 13维):", mfcc.shape)

二、原始语音信息

我们这里使用采样率:16hz,16bit 单声道 PCM。

这里以1秒的语音,1秒的语音数据大概32000byte。

公式如下:

复制代码
字节率 (Byte/s) = 采样率 × 位深 ÷ 8 × 声道数

然后1ms大概32byte 具体如下:

16000×16÷8×1=32000 Byte/秒 = 32 Byte/毫秒

由于是16bit,那么存储为int16 ,大概数组为 1秒为 数组 int16【1600】

这里输出int16【16000】

三、预加重

通过一阶高通滤波补偿声门激励和口鼻辐射导致的高频衰减,提升高频信噪比并平衡频谱平坦度。

语音产生时声带辐射导致高频能量自然衰减,而人耳对高频变化更敏感,此步骤可平衡频谱平坦度,提升信噪比(SNR),并减少后续FFT的数值计算误差。

效果:高频共振峰(如元音谐波)能量显著增强,对区分音素至关重要

公式:

复制代码
y[n]=x[n]-a·x[n-1]

a通常取0.95~0.97,这里取0.97

这里把int16 转换为float32 ,这里需要精度处理,所以用float存储

这里把int16【16000】 转换为 float32 【16000】

1ms为float32【16】

输出:float32 【16000】

四、分帧和加窗

将非平稳语音切分为20--30ms短时平稳片段 (帧移10--15ms),并用汉明窗抑制帧边界频谱泄漏,确保时频分析稳定性。

分帧:

  • 作用 :将非平稳语音信号切分为短时平稳的帧 (通常20~30ms,帧移10ms)。因语音在短时间内可视为平稳信号,短时分析能有效捕捉动态声学特性
  • 关键参数:以16kHz采样率为例,25ms帧长对应400个采样点,10ms帧移确保相邻帧重叠50%,避免信息丢失。

加窗:

  • 作用 :对每帧施加汉明窗(Hamming Window)等平滑窗函数抑制分帧导致的频谱泄漏。窗函数使帧边界平滑过渡,减少FFT后的旁瓣干扰。
  • 关键效果:矩形窗旁瓣高易引发频谱混叠,汉明窗主瓣较宽但旁瓣显著降低,更适合语音频谱分析。


1ms为16个float32数组
分割每帧为25msx16 =400
窗口为10msx16 = 160
帧长 win = 400 采样点,帧移 hop = 160 采样点
1秒音频得到帧数:nframes = 1 + (16000 - 400)//160 = 99
对每一帧乘以汉明窗/汉宁窗(长度 400 的 float32 向量)
输出矩阵形状:[99, 400],每帧就是 400 个 float32 数。

这里输出:float32 【99,400】

五、短时傅里叶变换(FFT)

将加窗后时域信号转换为复数频谱 ,仅保留幅度谱(因人耳对相位不敏感),为后续频带分析提供基础。

它把一帧帧摸不着头脑的波形,变成一张张看得清"嗓音成分"的频谱图

  • 作用 :对加窗后的帧进行FFT转换至频域 ,得到线性频率的功率谱( ∣X(k)∣2∣X(k)∣2 )。将时域信号映射为可分析的频谱能量分布
  • 关键效果:保留幅度信息而舍弃相位(语音识别对相位不敏感),为后续非线性频率映射奠定基础。

FFT 的作用是将"时间-幅度"的波形帧变换为"频率-能量"的频谱,让隐藏在波形里的频率成分显形,为后续模拟人耳听觉的 Mel 滤波提供标准线性频谱,是整个语音特征提取中"从听感波形到可见纹理"的关键一步。

对每帧 400 点做 512 点 FFT(补零到 512),得到 512 个复数。

实信号频谱对称,只取前一半 257 个频点,计算幅度谱。

对每帧信号应用FFT,将其从时域波形转换为频域的能量分布,得到线性频谱图

输出为float32 【99,257】

六、Mel滤波器组

通过20--80个非均匀三角滤波器 (低频密、高频疏),将线性频谱映射至符合人耳非线性感知的Mel尺度,突出共振峰结构。

梅尔滤波器组 是语音特征提取中连接"线性频谱"与"人耳听觉"的关键桥梁。它把 FFT 输出的精细线性频谱(成百上千个频点)压缩、变形为更符合人类听觉感知的梅尔频谱,最终得到 FBank 特征。

它就是一组按照人耳听觉非线性尺度排列的三角带通滤波器,它能将线性的 Hz 频谱"揉"成低频分辨率高、高频分辨率低的梅尔频谱,模拟人耳对音高的感知特性。

用一系列模拟人耳听觉特性的Mel尺度三角滤波器处理线性频谱,获得FBank(滤波器组)特征

80 个三角滤波器与 257 点频谱相乘 → 输出 80 维 FBank 特征。

输出float32 【99,80】

七、对数运算 (Log)-》Fbank

对数运算在 FBank 特征提取中,是连接"物理能量"与"人耳响度感知"的最后一步转换。它不只是简单的数学压缩,更是为了让特征符合听觉规律,并为后续的模型处理创造更好的数值条件。

Fbank: 直接输出对数梅尔滤波器组能量 ,保留完整的频带相关性,适用于深度学习模型(如RNN/Transformer),因其能显式建模频谱局部模式。

人耳对声音响度的感知不是线性的,而是近似对数关系

  • 声强(物理能量)需要增加到原来的 10 倍,我们听起来才感觉响了大约 2 倍(一个"贝尔"的差异)。

  • 这意味着,物理上巨大的能量差异(比如 1000 倍),在人耳感知中只是几个"档位"的变化。

梅尔滤波器组输出的每个值 S[m] 是该频带的物理能量(或功率),单位是线性尺度。直接使用它们有两个问题:

  1. 不符合听觉特性:模型应该去模仿人耳听到的"响度关系",而不是物理能量本身。

  2. 数值动态范围巨大:从安静帧(能量接近 0)到响亮元音(能量可达 10⁶~10⁷),跨度可达多个数量级。如果不压缩,后续处理(如神经网络)会面临严重的梯度问题,特征中的弱能量细节会被大能量完全淹没。

取对数后

  • 能量比变成差值:比如两倍能量变成长数上的 log(2) 的差距,符合了"响度感知"。

  • 动态范围被强烈压缩:1000 倍的差异压缩成 log(1000) ≈ 7 个单位。安静帧的微弱信息(比如辅音的高频能量)得以在数值上与响亮元音共存,不会被"压碎"。

对数运算把物理能量按照人耳感知的对数规律进行压缩,让特征的数值范围变得可控,同时让不同响度级别的声音信息公平地呈现在特征中,使模型能同时"看到"嘹亮元音和微弱辅音。

这里这步就取到了Fbank

输出:float32 【99,80】

八、DCT (离散余弦变换)

对对数梅尔谱执行离散余弦变换(DCT)将相关频带能量解耦为去相关的倒谱系数,集中表征声道形状的低阶信息。

离散余弦变换(DCT) 是 MFCC 提取过程中最关键的一步,它把"符合人耳感知"的 FBank 特征,进一步加工成"符合传统模型需求"的紧凑倒谱表示。

梅尔滤波器组输出的 80 维 FBank 虽然很好地模拟了听觉频率尺度,但它有一个"缺点":相邻滤波器之间有很高的相关性

  • 因为三角滤波器相互交叠,相邻频带的能量往往是联动的,这导致 FBank 向量各维之间高度相关。

  • 传统的 高斯混合模型(GMM) 假设特征向量的各维独立(对角协方差),直接使用 FBank 会违反这个假设,导致建模困难。

  • 即使神经网络没有独立性假设,高度相关的特征也会增加冗余,降低训练效率。

DCT 的作用就是对这种相关特征进行正交变换,把能量集中到少数几个系数上,实现:

  1. 去相关:变换后系数近似统计独立。

  2. 能量压缩:大部分信号信息集中在低阶系数,高阶系数接近于零。

  3. 降维:截取前 13~20 个系数,丢弃高阶系数,大幅压缩特征维度。

这就像把一团乱麻的相关信息,梳理成少数几根承载主要信息的"主成分"。

C[k]=∑m=079​E[m]⋅cos(80πk(m+0.5)​),k=0,1,...,79

DCT 是 MFCC 的灵魂步骤,它将高度相关的对数梅尔谱变换到倒谱域,实现去相关和能量压缩,用低阶系数概括声道形状,用高阶系数承载激励细节。截取低阶倒谱后,就得到紧凑且独立的特征向量,完美适配传统 GMM‑HMM 声学模型的对角协方差假设,也成为语音识别史上最重要的特征设计之一。

输出数组:float32【99,80】

九、截取前 N 个系数->MFCC

"截取前 N 个系数" 是 MFCC 特征从"全信息倒谱"到"紧凑声学表示"的决定性裁剪。它凭借一个简单的截断操作,完成降维、去噪、提取音色三合一的功能。

经过 DCT 后,每一帧语音得到一个 80 维的向量 [C₀, C₁, C₂, ..., C₇₉],这些系数按阶数从低到高排列。截取前 N 个系数(通常 N=13)就是:

保留 C₀C₁₂(共 13 个系数)
丢弃 C₁₃C₇₉(其余 67 个系数)

此时得到的 [帧数, 13] 矩阵,就是 静态 MFCC 特征

"截取前 N 个系数"是在倒谱域做了一次分离:保留承载音色的低阶共振峰包络,丢弃混入噪声和激励细节的高阶成分,得到维度低、信息密、抗噪性好的静态 MFCC 特征,为传统语音识别模型提供了一组精心设计的、近乎最优的声学表示。

输出 float32 【99,13】

十、【可选】 动态特征**(Δ 和 Δ²)**

动态特征(Δ 和 Δ²) 是传统语音识别中为静态 MFCC 注入"时间生命"的关键操作。它们把一帧帧孤立的声道快照,变成携带发音动作速度加速度的完整动态描述,让模型能"听"出语音是如何从"b"滑到"a"的

静态 MFCC 描述的是某一瞬间声道截面的形状,如同给你的发音器官拍了一张张快照。但语音的本质是动态的过渡过程

  • 辅音 /b/ 和 /p/ 在成阻阶段的静态频谱几乎一样,区别全在于除阻后声带开始振动的时机和速度

  • 元音 /i/ 到 /a/ 的滑动,核心信息隐藏在共振峰如何随时间移动的轨迹里。

只给模型看静态照片,它无法区分这些动态音素。Δ 和 Δ² 给模型装上了一双"眼睛",让它看到画面之间的运动和运动的变化。

其他好处:

  • 抗噪:整体幅度偏移(如距离远近)对差分影响较小,动态特征对信道、背景噪声有一定鲁棒性。

  • 提供时序上下文:每一帧的 Δ 融合了前后 MM 帧的信息,变相扩展了模型的视野,弥补早期 HMM 条件独立性假设的不足。

动态特征 Δ 和 Δ² 将静态的 MFCC 照片连成了一段动画:Δ 给出发音动作的速度,Δ² 给出加速度,三者结合让模型不仅能识别"是什么",还能捕捉"怎么变",从而大幅提升对辅音、过渡音和协同发音的区分能力,是传统语音识别系统能够成功的核心工程设计之一。

后续就是可以给模型进行训练了,具体看什么模型,看选择的是MFCC还是 FBank

十一、代表模型和使用的特征类型

特征类型 代表模型 维度(每帧) 现状
MFCC + 差分 GMM‑HMM、早期 DNN 39 淘汰
FBANK(Log‑Mel) Whisper、Wav2Vec、Conformer、Tacotron 40/80 主流
原始波形 WaveNet、ECAPA‑TDNN、SpeechLM 1(时域) 上升
离散 Speech Tokens HuBERT、SpeechLM、AudioPaLM 1(token ID) 大模型专用
PLP 传统 ASR 13/39 小众
  • 现代 ASR/TTS :优先用 80 维 FBANK,不用 MFCC、不用手工差分。
  • 传统 / 嵌入式 :用 39 维 MFCC + 差分
  • 语音大模型 / 声纹 :可用原始波形离散 tokens

简言之:MFCC已退出主流研究视野,Fbank是当前深度学习语音模型的基石

相关推荐
金融小师妹1 小时前
基于全球能源供给扰动模型的原油市场重构:沙特产量跌至36年低位后的供需链式分析
大数据·人工智能·逻辑回归
玖日大大1 小时前
2026十大LLM研究突破:扩散语言模型挑战自回归、Unicode隐形注入、AI操纵性评估 — 大模型从狂飙走向可控
人工智能·语言模型·回归·llm·论文解读·ai agent·ai安全
汽车仪器仪表相关领域1 小时前
Debron OVM 1052 光学关门速度仪:汽车门盖检测的高精度便携工具 + 生产线适配 + 耐久性监测,整车制造与质量控制的黄金标准
人工智能·功能测试·单元测试·汽车·制造·可用性测试
网络工程小王1 小时前
【LangGraph 状态持久化(Checkpoint)详解】学习笔记
jvm·人工智能·笔记·langchain
web守墓人1 小时前
【神经网络】js版本的Pytorch,estorch重磅发布
前端·javascript·人工智能·pytorch·深度学习·神经网络
蔡俊锋1 小时前
AI自动化不是接工具就行,得补缺点搭轨道
人工智能·ai 效率
DXM05211 小时前
第11期:实战| ArcGIS Pro 遥感影像预处理
人工智能·arcgis·#arcpy·#arcgis 二次开发·#gis 自动化
Tutankaaa1 小时前
交通安全知识竞赛:文明出行,安全相伴
大数据·人工智能·安全
knight_9___1 小时前
大模型project面试2
人工智能