文章

09 语音识别(Speech Recognition)

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 的折叠规则大意是:

  1. 去掉 blank
  2. 把连续重复字符折叠成一个

  这样就能把长输出压成更短文本。

  例如:

\[\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 的关键贡献在于:不要求你提前知道每一帧对应哪个字符,而是允许模型输出冗长的中间序列,再通过折叠规则得到最终文本。

本文由作者按照 CC BY 4.0 进行授权