语音识别入门:声学特征与 CTC 损失

FreeGuideOnline 最新 2026-06-16

语音识别入门:声学特征与 CTC 损失

欢迎来到免费在线教程的语音识别入门课。本教程将为你拆解现代语音识别系统的两个核心组件:声学特征提取CTC 损失函数。无论你是正在入门的学生还是希望转型的工程师,这篇教程都将帮助你建立从声波到文字映射的清晰认知。

语音识别基础:从声波到文字

一个完整的语音识别(Automatic Speech Recognition, ASR)系统通常包含三个部分:

  1. 声学特征提取:将原始波形转化为更适合模型处理的紧凑表示。
  2. 声学模型:将特征序列映射为音素、字符或词片段的概率分布。
  3. 解码器:结合语言模型,搜索出最可能的文本序列。

本教程聚焦于前两个部分的连接点——将不定长语音转化为定长编码的特征,以及解决输入输出序列长度不对齐问题的 CTC 损失

声学特征提取:让机器“听懂”声音

原始音频是随时间变化的电压信号,每秒包含成千上万个采样点,信息冗余且无法直接体现人的听觉感知。声学特征的目标是提取出人耳敏感、对噪声具有一定鲁棒性的紧凑表达。目前工业界最主流的两类特征是 梅尔滤波器组(FBANK)梅尔频率倒谱系数(MFCC)

1. 预加重

语音信号的高频部分通常能量较低。预加重通过一个一阶高通滤波器增强高频分量: [ y[t] = x[t] - \alpha x[t-1] ] 通常 (\alpha) 取 0.97。这一步骤可以补偿唇辐射效应,使频谱更加平坦。

2. 分帧与加窗

语音是非平稳信号,但在 20~40ms 内可以近似为平稳。我们将信号切分为重叠的短时帧(通常帧长25ms,帧移10ms)。为每一帧乘上一个汉明窗(Hamming Window),以减少频谱泄露: [ w[n] = 0.54 - 0.46 \cos\left(\frac{2\pi n}{N-1}\right) ] 加窗后得到帧信号 ( x_t[n] )。

3. 快速傅里叶变换与功率谱

对每一帧计算离散傅里叶变换(FFT),取其幅值的平方得到功率谱: [ P[k] = \frac{1}{N} |X[k]|^2 ] 其中 ( X[k] = \sum_{n=0}^{N-1} x[n] e^{-j2\pi kn/N} )。功率谱反映了该帧在不同频率上的能量分布。

4. 梅尔滤波器组

人耳对频率的感知是非线性的,梅尔刻度(Mel scale)模拟了这一特性。将频率从赫兹转换到梅尔标度: [ \text{Mel}(f) = 2595 \log_{10}\left(1 + \frac{f}{700}\right) ] 在梅尔域等间距地放置若干个三角滤波器(常见 40 或 80 个),每个滤波器的输出是该频率区间内功率谱的加权和。至此得到的特征就是 FBANK

FBANK 特征保留了相邻频带之间的相关性,近年来随着深度神经网络的强大建模能力,已经成为很多端到端系统的首选输入。

5. MFCC:从 FBANK 到倒谱系数

对于某些传统声学模型(如 GMM-HMM),特征维度过高且存在相关性的 FBANK 不够理想,于是引入了离散余弦变换(DCT)进行去相关和降维: [ c_i = \sum_{j=1}^{M} \log E_j \cos\left[\frac{\pi i}{M}(j - 0.5)\right] ] 其中 (E_j) 是第 (j) 个梅尔滤波器的能量。取前 12~13 个系数作为 MFCC。通常会再添加一阶差分(Δ)和二阶差分(ΔΔ)来捕捉帧间动态变化,最终形成 39 维的特征向量。

选择建议:如果你使用 CNN/Transformer 等深度模型,直接使用 80 维 FBANK 通常效果更好。MFCC 更适合输入维度受限或传统高斯混合模型。

CTC 损失:解决序列不对齐问题

连接时序分类(Connectionist Temporal Classification, CTC)是语音识别端到端训练的核心损失函数,由 Graves 等人 2006 年提出。它解决了语音识别中最根本的难题:我们不知道输入特征序列中的每一帧具体对应哪个输出标签

1. 问题定义

假设输入声学特征序列为 ( \mathbf{x} = (x_1, x_2, ..., x_T) ),输出文本序列为 ( \mathbf{y} = (y_1, y_2, ..., y_U) ),且 ( U \leq T )。传统交叉熵要求逐帧对齐,但人工标注每帧的音素几乎不可行。CTC 通过引入一个特殊的 空白符号(blank) (\epsilon) 和一种 多对一映射,将所有可能的对齐路径边缘化。

2. CTC 路径与映射

CTC 允许声学模型在每一帧输出一个标签(包括空白符)。一条路径 ( \pi = (\pi_1, ..., \pi_T) ) 由标签集 ( L \cup {\epsilon} ) 中的符号组成。定义多对一映射函数 ( \mathcal{B} ),对该路径去除重复标签并删除空白符,得到最终的标签序列:

  • 例: ( \mathcal{B}(C - - C - A - T) = \mathcal{B}(- C C - - A T -) = CAT ) 其中“-”表示空白符。所有能映射到正确文本 ( \mathbf{y} ) 的路径构成了合法路径集 ( \mathcal{B}^{-1}(\mathbf{y}) )。

3. 概率与损失函数

声学模型输出每一帧在标签上的概率分布 ( p_t(\pi_t|\mathbf{x}) )。假设各帧独立,某条路径的概率为: [ P(\pi|\mathbf{x}) = \prod_{t=1}^{T} p_t(\pi_t|\mathbf{x}) ] 文本序列的条件概率为所有合法路径的概率之和: [ P(\mathbf{y}|\mathbf{x}) = \sum_{\pi \in \mathcal{B}^{-1}(\mathbf{y})} P(\pi|\mathbf{x}) ] CTC 损失函数就是要最小化该概率的负对数似然: [ \mathcal{L}_{CTC} = -\log P(\mathbf{y}|\mathbf{x}) ]

4. 前向后向算法高效计算

直接枚举所有路径的计算量是指数级的。CTC 利用动态规划的前向后向算法将计算复杂度降为 ( O(T \cdot U) )。

在扩展标签序列 ( \mathbf{y}' )(在 ( y ) 的每个字符之间及首尾插入空白符)上定义前向变量 ( \alpha_t(s) ) 表示在时刻 ( t ) 到达扩展序列第 ( s ) 个位置的合法路径概率和。递推规则类似 HMM 的前向算法,仅允许三种跳转:

  • 停留在同一位置(对应空白符到空白符)
  • 移动到下一个不同标签(如从 ( a ) 到 ( b ))
  • 跳过空白符移动到下一非空白标签(从 ( \epsilon ) 到 ( b ),需保证跳过的标签不等于前一个非空白标签,以正确处理重复字符)

最终 ( P(\mathbf{y}|\mathbf{x}) = \alpha_T(|\mathbf{y}'|) + \alpha_T(|\mathbf{y}'|-1) )。后向算法同理,用于梯度计算。

5. 在深度学习中的实现与技巧

现代框架(PyTorch, TensorFlow)都内置了高效的 CTC 损失实现。使用时需要注意:

  • 输入:声学模型输出需经过 log_softmax,形状为 (T, N, C)T 为帧数,N 为 batch 大小,C 为类别数(包括 blank)。
  • 目标:文本标签需要用整数编码,不能包含 blank(在函数内部自动插空)。
  • 输入长度和目标长度:必须提供每一句的真实特征帧长和标签长度,以屏蔽填充部分。
  • 梯度稳定:CTC 有时会产生发散问题,需要配合梯度裁剪、warm-up 或使用稳定的 log-sum-exp 实现。

6. CTC 的局限与发展

CTC 有三大天然局限:

  1. 条件独立假设:各帧输出独立,缺乏对输出序列的显式语言建模。
  2. 单调对齐:要求输入和输出顺序严格单调,不适合同传翻译等任务。
  3. 重复字符问题:纯粹靠空白符区分连字符,对长重复音不够友好。

近年来,RNNN-Transducer 和注意力机制(LAS, Transformer)在一定程度上克服了这些局限,但 CTC 依然凭借其简单高效、对长语音的稳定收敛等特性,广泛应用于工业级流式识别、多语言系统以及作为混合系统(如 CTC/Attention 联合模型)的关键组成部分。

总结与下一步

祝贺你!现在你已经深入理解了语音识别中两个不可绕开的基础模块:

  • 声学特征:FBANK 和 MFCC 的提取流程,以及它们如何模拟人耳感知。
  • CTC 损失:通过空白符和路径求和优雅地解决序列不对齐问题。

下一步学习建议

  • 动手实现一个特征提取管道:你可以使用 librosatorchaudio 提取 80 维 FBANK 并观察语谱图。
  • 用 CTC 损失训练一个简单的 Bidirectional LSTM 声学模型,感受从特征到模型的端到端流程。
  • 探索 CTC 的高阶用法:如启用 WFST 解码的贪婪搜索与束搜索、基于音节的建模等。

保持好奇心,语音识别的世界远比你想象的精彩。我们在后续教程中将带你逐步构建一个完整的流式识别系统。欢迎收藏本教程,并分享给一同学习的伙伴!


本文属于 [免费在线教程]语音识别专题,转载需注明出处。