09 语音识别(Speech Recognition)
这一节在讲什么
这一节讲 seq2seq 和相关模型怎样用于语音识别,也就是:
输入一段音频,输出它对应的文本。
任务形式
输入是音频片段 $x$,输出是文本序列 $y$:
\[x \rightarrow y\]例如:
- 输入是一段说了
the quick brown fox的音频 - 输出就是文本
the quick brown fox
为什么不能直接拿原始波形就上
课程里先讲了常见预处理:声谱图(spectrogram)。
原始音频是“随时间变化的气压波形”, 但机器通常会先把它转成一个二维特征图:
- 横轴:时间
- 纵轴:频率
- 颜色强弱:能量大小
这就是声谱图。
它更像人耳对声音的处理方式,也更适合模型学习。
一个重要背景:从音位到端到端
过去很多语音识别系统依赖人工设计的音位(phoneme)。 也就是先把语音拆成更小的发音单元,再做识别。
现在端到端模型更常见:
- 直接输入音频特征
- 直接输出文本
- 不再强依赖人工设计的中间表示
这背后一个关键前提是:
数据够大。
课程提到,语音识别常用的数据量非常惊人,动不动就是几百小时、几千小时,工业界甚至更大。
方法一:注意力模型做语音识别
一种办法是沿用上一节的注意力思路:
- 输入是很多时间帧的音频特征
- 解码器输出字符或词
- 在每一步输出时,对不同时间帧分配注意力
这可以把语音识别也做成一种 seq2seq with attention。
方法二:CTC
课程重点介绍了另一种很经典的方法:CTC。
CTC 全称:
\[\text{Connectionist Temporal Classification}\]它特别适合处理这种情况:
- 输入时间步很多
- 输出文本长度短很多
- 而且你不知道每个字符精确对应哪一帧
CTC 解决的难点
假设音频长 10 秒,每秒采样 100 帧,那么输入时间步大约是:
\[100 \times 10 = 1000\]也就是说输入序列长度可能是 1000。
但一句 the quick brown fox 连空格也就十几二十个字符,不可能和 1000 一一对齐。
CTC 的想法是:
允许模型输出很多重复字符和空白符,再通过“折叠规则”把它压缩成最终文本。
CTC 的例子
课程里用下划线 _ 表示特殊空白符 blank。
比如模型某段原始输出可能像:
\[\text{t t t \_ h \_ e e e \_ \_ \_ q q q \_ \_}\]CTC 的折叠规则大意是:
- 去掉 blank
- 把连续重复字符折叠成一个
这样就能把长输出压成更短文本。
例如:
\[\pi = \text{t t t \_ h \_ e e e}\]折叠后可以得到:
\[B(\pi) = \text{the}\]这里 $B(\cdot)$ 可以理解为“CTC 折叠函数”。
为什么这个设计聪明
因为语音本来就会在时间上拖长:
- 一个字母可能持续很多帧
- 不同字之间还会有停顿
CTC 允许模型在时间轴上“啰嗦地输出”, 最后再统一折叠,这样就不需要人工给每一帧打精确字符标签。
注意力和 CTC 的区别,怎么直观理解
注意力模型
像是:
“生成每个输出字符时,我去输入里找最相关的片段。”
CTC
像是:
“我在整条时间轴上密密麻麻输出字符和空白,最后再压缩整理。”
两种都能做语音识别,但思路不同。
这一节最该记住的公式和记号
任务形式
\[x \rightarrow y\]输入时间步示例
\[T_x = 100 \times 10 = 1000\]CTC 折叠思想
\[B(\pi) = y\]其中:
- $\pi$ 是模型在长时间轴上的原始输出
- $B$ 表示删除 blank 并折叠重复后的结果
- $y$ 是最终文本
这一节最该记住的要点
要点 1:语音识别输入长、输出短
这是它和普通翻译任务很不一样的地方。
要点 2:声谱图是常见预处理
它把原始波形转换成更适合学习的时频特征。
要点 3:端到端方法不再强依赖音位
可以直接从音频映射到文本。
要点 4:CTC 通过“重复字符 + blank + 折叠”解决对齐难题
这是这一节最核心的技术点。
这一节一句话总结
语音识别可以看作“从音频序列到文本序列”的映射,而 CTC 的关键贡献在于:不要求你提前知道每一帧对应哪个字符,而是允许模型输出冗长的中间序列,再通过折叠规则得到最终文本。