简介:本文系统梳理语音识别的技术原理,从分帧、特征提取到端到端建模,重点解析帧与字长度不对齐这一核心难点及其解决方案。读者将理解log-mel特征的计算逻辑、声学建模的演进路径,以及CTC、注意力机制等对齐策略的工程取舍,建立完整的语音识别技术认知框架。
用一句话描述现代语音识别:把一段波形切成每秒约百帧的声学特征,再用一个神经网络将数百帧的输入序列映射为十几个字的输出序列。整个系统的核心难点,都集中在这个输入输出长度严重不对等的对齐问题上。
一条完整的识别流水线通常包含四个环节:信号预处理与分帧、声学特征提取、声学建模(将特征映射为建模单元后验概率)、解码与语言模型融合。近年来端到端模型的兴起,将声学建模、发音建模和语言建模逐渐整合进单一网络,但前端特征提取的基本范式仍然保持稳定。
原始音频以 16kHz 采样时,一秒包含 16000 个采样点。直接将波形喂给模型在技术上可行,也有研究路线采用原始波形作为输入,但工业界主流做法仍是先计算 log-mel filterbank 特征,原因是这一特征在保留语音关键信息的同时大幅压缩了数据量,并且与人耳的听觉特性更为匹配。
具体计算分为四步:
第一步,分帧与加窗。 采用 25ms 窗长、10ms 帧移,16kHz 采样下即 400 点一帧、160 点一步。加汉明窗可以减少帧边界处的频谱泄漏。一秒钟音频大约得到 100 帧(精确值为 98 帧左右),这一「每秒百帧」的粒度是后续所有对齐问题的根源。
第二步,功率谱计算。 对每帧做 FFT,取模平方得到功率谱。若 FFT 点数取 512,则正频率部分为 257 维。
第三步,mel 滤波器组投影。 在 mel 刻度上均匀布置三角滤波器,将 257 维功率谱压缩为 80 维。mel 刻度反映了人耳对低频分辨更细、对高频较粗的感知特性,因此低频滤波器窄、高频滤波器宽。这一设计既降维又贴近听觉感知。
第四步,取对数。 对数运算压缩动态范围,并使音量变化转化为加性偏移,便于后续做均值方差归一化。
示意性代码如下:
import numpy as npsr = 16000win, hop = int(0.025 * sr), int(0.010 * sr) # 400, 160nfft, n_mels = 512, 80# 分帧加窗n = 1 + (len(x) - win) // hopframes = np.stack([x[i*hop:i*hop+win] for i in range(n)]) * np.hamming(win)# 功率谱pow_spec = np.abs(np.fft.rfft(frames, nfft)) ** 2 / nfft # (n, 257)# mel 三角滤波器组def hz2mel(f): return 2595 * np.log10(1 + f / 700)def mel2hz(m): return 700 * (10 ** (m / 2595) - 1)mel_pts = np.linspace(hz2mel(0), hz2mel(sr/2), n_mels + 2)bins = np.floor((nfft + 1) * mel2hz(mel_pts) / sr).astype(int)fb = np.zeros((n_mels, nfft // 2 + 1))for m in range(1, n_mels + 1):l, c, r = bins[m-1], bins[m], bins[m+1]fb[m-1, l:c] = (np.arange(l, c) - l) / max(c - l, 1)fb[m-1, c:r] = (r - np.arange(c, r)) / max(r - c, 1)fbank = np.log(pow_spec @ fb.T + 1e-10) # (n, 80)
输出显示,1 秒音频得到约 98 帧、每帧 80 维特征。早期流水线还会再做一次离散余弦变换得到 MFCC,其目的是去相关以适配高斯混合模型的对角协方差假设;神经网络本身不惧特征相关性,因此现代系统大多直接使用 fbank。
一句「今天天气很好」只有 6 个字,却对应上百帧特征。训练数据通常只提供整句文本,不提供每个字对应哪几帧的边界信息。这种「输入长、输出短、且对齐未知」的问题,是语音识别区别于一般分类任务的根本特征。
围绕这一难点,技术路线经历了清晰的演进:
隐马尔可夫模型路线。 早期系统用 HMM 描述帧级别的状态转移,用高斯混合模型刻画每个状态的观测分布,并通过发音词典将音素与词汇连接起来。训练时用期望最大化算法在无对齐标注下迭代估计参数,解码时用动态规划搜索最优路径。这条流水线成熟稳定,但各模块独立优化,误差会逐级累积,且发音词典和语言模型的维护成本较高。
连接时序分类路线。 CTC 引入一个空白符号,允许网络在每一帧输出字符或空白,再通过合并重复标签与删除空白的方式折叠为最终文本。这样网络可以输出与帧数相同的序列,无需预先知道帧与字的对应关系,损失函数通过对所有合法对齐路径求和得到。CTC 的假设是各帧输出条件独立,因此不具备建模字符间语言依赖的能力,通常需要外接语言模型。
注意力编码解码路线。 编码器将声学特征压缩为高层表示,解码器以自回归方式逐字生成输出,注意力机制自动学习输出位置与输入帧之间的软对齐。这种方式能够建模长距离依赖,但自回归解码在长音频上存在延迟,且注意力对齐有时不够稳定。
混合与改进路线。 实践中常见将 CTC 作为辅助损失与注意力解码联合训练,利用 CTC 的单调对齐先验提升收敛稳定性与对齐质量;也有采用单调分块或流式注意力机制来降低延迟,适配实时识别场景。
模型输出的帧级概率分布需要经解码转换为文本。工程上通常采用束搜索,在每一步保留若干候选路径,并结合语言模型打分。对实时场景,还需考虑分块输入、缓存状态、端点检测等机制,避免长静音与截断问题。
以下工程要点值得重视:
语音识别的技术原理可归结为一条清晰的主线:波形经分帧与 mel 滤波得到每秒约百帧的特征序列;神经网络在帧与字长度不对齐的约束下学习声学到文本的映射;解码环节结合语言知识输出最终结果。理解「每秒百帧」这一基本事实,以及围绕它产生的对齐问题与各类建模范式,就抓住了语音识别技术演进的核心脉络。