C15

主线

Abstract

这一章从语音识别任务的数据基础讲起,主线是:语音语料库提供训练和评测材料,CNN 前端把长声学帧序列提取并压短,encoder-decoder ASR 用条件生成完成转写,HuBERT 则展示了如何用无标注语音先做自监督预训练,再微调到 ASR。

关键概念

笔记

常见语音语料库

语料库语言 / 类型规模采样率 / 格式场景标注关键特点
LibriSpeech英语朗读语音1000+ 小时16 kHzLibriVox 有声书,志愿者朗读无版权书籍句子级对齐转录分为 cleanother。发布时用 WSJ 朗读语音训练的 ASR 识别全库,再按说话者 WER 大致一分为二:低 WER 为 clean,高 WER 为 other
Switchboard英语电话对话2430 段对话,平均 6 分钟;约 240 小时,300 万词8 kHz20 世纪 90 年代初,陌生人之间的提示式电话对话转录 + 大量人工辅助语言学标注标注很丰富:句法分析、对话行为、音素、韵律、话语结构、信息结构
CALLHOME英语电话对话120 段,每段约 30 分钟电话语音20 世纪 90 年代末,英语母语者之间的非脚本化电话对话,多为亲密朋友或家人转录更自然、非脚本化,关系更亲近
CHiME 6英语会话语音 / 鲁棒 ASR20 场真实家庭晚餐聚会;每场 4 人远距离麦克风厨房、餐厅、客厅等真实家庭环境转录CHiME Challenge 系列任务之一,强调噪声、远场、多说话人环境下的 ASR 鲁棒性
AMI Meeting Corpus英语多人会议100 小时会议录音自然会议 + 专门组织的会议人工转录 + 额外人工标签适合研究会议语音、多方对话和会议理解
CORAAL非裔美国英语 / 社会语言学访谈150+ 段访谈访谈录音非裔美国英语说话者访谈匿名化 + 话轮级对齐转录目标是研究 AAE 及非裔美国社区和其他群体中的语言变体
HKUST Mandarin Telephone Speech普通话电话对话1206 段,每段约 10 分钟电话语音中国各地说话者,朋友或陌生人之间电话对话转录中文电话语音识别常用语料
AISHELL-1普通话朗读语音170 小时朗读语音多领域句子,主要由中国北方说话者朗读转录中文朗读语音 ASR 常用基准
Common Voice多语言朗读语音33,150 小时,133 种语言MPEG-3众包志愿者朗读脚本,脚本常来自 Wikipedia;其他贡献者验证录音转录免费可用、众包、多语言,面向 ASR
FLEURS多语言平行朗读语音102 种语言;每种约 12 小时朗读语音基于 FLORES-101,英文 Wikipedia 句子翻译到 101 种语言;每种语言 2009 个句子有录音,每句 3 位母语者朗读平行文本 + 语音平行、多语言,适合跨语言 ASR / speech translation / multilingual speech research

15.2 Convolutional Neural Networks

核心问题

语音输入是很长的 acoustic frame sequence。CNN 在 ASR encoder 前面常用来做两件事:

  • 提取局部时间 / 频率模式
  • 下采样,把序列长度压短

一句话:

CNN in ASR = local feature extraction + sequence downsampling

它是连接原始音频特征和 Transformer encoder 的桥梁。

先验

相邻语音帧高度相关
局部频谱模式有平移不变性
语言级变化慢于 10ms 级声学帧率

特征提取的三个关键维度

宽度 / receptive field:kernel 覆盖几帧。

Whisper 使用宽度为 3 的卷积核。若输入是 10ms 一帧,那么宽度 3 大约覆盖 30-40ms 语音上下文,足够捕捉一些局部语音线索,比如共振峰转变、爆破音闭合等。

为了让输出序列长度和输入等长,卷积两端通常会做 zero padding。

深度 / input channels:输入不是一维标量序列,而是多通道特征。

例如 log Mel 输入可能有 128 个 Mel 通道。一个 kernel 会对每个输入通道各有一组权重,卷积后把所有通道的结果求和,得到某个位置上的一个标量输出。

输出通道数 / output channels:一个 kernel 只产生一个标量特征。

如果要得到模型维度大小的 embedding,例如 Whisper 的 1280 维,就需要学习 1280 个独立 kernel。每个 kernel 的形状类似:

[input_channels, kernel_width] = [128, 3]

所以可以理解为:

1280 个 kernel → 每帧 1280 维 embedding

降采样

CNN 在 ASR 前端最关键的功能之一,是用 stride > 1 压缩序列长度。

原因是声学帧序列远长于文本序列。若每 10ms 一个声学帧,一个英语词平均约 250ms,则:

1 word ≈ 25 acoustic frames
1 word ≈ 5 letters
1 word ≈ 1.3 BPE tokens

所以按字母算:

25 / 5 = 5 倍

按 BPE token 算:

25 / 1.3 ≈ 19 倍

这就是为什么 ASR encoder 前面通常要先下采样。否则 Transformer 会直接面对过长的 acoustic frame sequence,计算成本很高。

两个实例:

Whisper:输入 128 通道 log Mel → 两层 Conv1D + GELU。第一层 stride=1 不缩短;第二层 stride=2 把 3000 帧压到 1500 帧(20 ms 一个 audio token)→ 加正弦位置编码 → 进 Transformer encoder。

HuBERT:直接从 16 kHz 原始波形开始,7 层 CNN(stride 分别是 5,2,2,2,2,2,2,乘起来 = 320×),把采样率从 16000 Hz 压到 50 Hz(20 ms 一帧),同时学频谱提取 + 序列压缩两件事。

HuBERT 架构

图里的 HuBERT training-time inference pass 可以读成:

16 kHz waveform
→ 7 CNN layers
→ frame sequence x1, x2, ..., xn
→ 随机替换部分帧为 MSK token
→ Transformer stack
→ hidden states h1, h2, ..., hn
→ projection layer
→ 与 100/500 phonetic classes 的 embedding 做 cosine
→ softmax
→ 预测每一帧对应的离散语音类别 y1, y2, ..., yn

关键点:

  • 输入是原始 waveform,不是手工提取的 log Mel。
  • 7 层 CNN 同时做局部声学特征提取和降采样。
  • mask 一部分 frame,让 Transformer 根据上下文恢复被遮住位置的离散语音类别。
  • 目标不是文字 token,而是聚类得到的 phonetic class / acoustic unit。
  • projection 后的向量会和每个类别的 embedding 算 cosine similarity,再过 softmax 得到类别分布。

直觉:

HuBERT 像语音版 BERT:
遮住一部分声学帧,让模型从上下文猜它属于哪个离散语音类。

15.3 Whisper / Encoder-Decoder ASR

Encoder-Decoder Architecture

Missing image: Pasted image 20260428220349.png

Missing image: Pasted image 20260428220448.png

LM Rescoring

encoder-decoder ASR 本身会隐式学到语言模型,因为 decoder 要根据历史 token 预测下一个 token。

但 ASR 训练数据是“语音 + 转写”配对数据,文本量通常有限;而纯文本语料可以大很多。所以实际系统中常见做法是:

encoder-decoder ASR 先用 beam search 生成 n-best list
→ 大规模外部语言模型对候选转写重新打分
→ 选最终结果

一个常见打分形式是:

其中:

  • :输入语音
  • :候选转写文本
  • :ASR encoder-decoder 给出的条件概率
  • :外部语言模型给出的文本概率
  • :控制语言模型分数权重
  • :长度归一化,避免 beam search 偏向过短或过长输出

直觉:

ASR score 负责“听起来像不像”
LM score 负责“说出来像不像自然语言”
length normalization 负责修正长度偏置

15.3.3 训练

训练目标是标准 cross-entropy loss:逐步预测正确 token,并累加每一步正确 token 的负对数概率。

其中:

  • :输入语音特征
  • :第 个目标 token
  • :decoder 当前步之前的历史 token

训练时通常使用 teacher forcing

decoder 的历史输入使用 gold tokens
而不是模型自己上一时刻预测出来的 tokens

也可以混合一定比例的模型输出,让训练更接近推断阶段。

规模例子:

  • Whisper-v2:约 68 万小时语音训练
  • OWSM:开源版约 18 万小时语音训练

Whisper 的多任务特色

Whisper 不只是做 transcription,还可以做:

  • 转写 / transcribe
  • 翻译 / translate
  • 语音活动检测 / voice activity detection
  • 语言识别 / language identification

它通过特殊 token 控制任务。输入给 decoder 的前缀大致是:

SOT → language tag → TRANSCRIBE / TRANSLATE → timestamp → text tokens

也就是说,任务类型、语言、时间戳等信息都被包装成 token 序列的一部分,让同一个 encoder-decoder 模型完成多种语音任务。

15.4 自监督模型:HuBERT

Missing image: Pasted image 20260429004543.png

核心思路

HuBERT 不直接学习“音频 → 文字”的映射,而是先从无标注语音中自举一套离散语音单元,再用掩码预测的方式做预训练。

这和 BERT 的思路很像:

BERT: mask text token → predict masked token
HuBERT: mask speech frame → predict masked frame 的离散语音类别

预训练完成后,再用少量有标注数据微调做 ASR。

优势:

可以利用大量没有转写文本的纯语音数据

15.4.1 前向传播

整体流程:

16 kHz raw waveform
→ 7-layer CNN
→ 20 ms frame rate hidden sequence
→ positional encoding + GELU + LayerNorm
→ randomly replace some frames with shared MASK embedding
→ Transformer stack
→ hidden state h_t for each frame
→ linear projection A
→ cosine similarity with each phonetic class embedding
→ softmax
→ probability over 100 / 500 phonetic classes

细节:

  • 输入是 16 kHz 原始波形。
  • 7 层 CNN 把原始采样点压到约 20ms 一帧。
  • 随机选择一部分帧,替换成共享的 MASK embedding。
  • Transformer stack 输出每一帧的表示
  • 线性投影层 投到类别 embedding 空间。
  • 投影后的表示和每个音素类别 embedding 算 cosine similarity。
  • 经过 softmax 后,得到该帧属于每个离散类别的概率分布。

15.4.2 训练过程

HuBERT 训练分两个阶段:先用手工声学特征产生粗糙伪标签,再用模型中间表示产生更好的伪标签。

Stage 1:100 类

步骤:

全部训练语音
→ 提取 39 维 MFCC
→ k-means 聚成 100 个簇
→ 每个簇作为一个初始 phonetic class
→ 用这些类别作为 HuBERT 预训练目标

损失只在被 mask 的帧上计算,让模型预测被遮住帧的正确类别:

其中:

  • :被 mask 的帧集合
  • :第 帧的 k-means 伪标签
  • :输入语音序列

直觉:

MFCC 聚类天然偏向语音学信息,能给模型一个有意义的起点。

Stage 2:500 类

步骤:

拿 Stage 1 训练好的 HuBERT
→ 跑 10% 训练数据
→ 取第 6 层 Transformer 输出,维度 768
→ 对这些表示重新做 k-means
→ 聚成 500 个簇
→ 用 500 类作为新的训练目标

直觉:

模型学到的表示比手工 MFCC 更准、更细粒度。
重新聚类后,伪标签质量更高。

微调做 ASR

预训练完成后,HuBERT 会从“预测离散语音类”切换到“预测文字序列”。

做法:

  • 去掉预训练用的 projection layer 和 cosine classification layer。
  • 换一个随机初始化的 linear + softmax 层。
  • 新输出层预测 29 个类:26 个英文字母 + 若干特殊字符。
  • 冻结 CNN 层。
  • 微调 Transformer stack + 新投影层。
  • 在有标注数据,也就是“音频 + 转写”上,用 CTC loss 微调。

直觉:

CNN 前端已经学会稳定声学特征。
Transformer 已经学会语音上下文表示。
微调阶段只需要把这些表示对齐到字符序列。

15.4.3 K-means 聚类算法

输入:

N 个 d 维向量
指定 k 个簇

初始化:

随机选 k 个向量作为初始质心 / codeword

反复迭代两步直到收敛:

  1. Assignment:每个向量分配给最近的质心,距离通常用欧氏距离。
  2. Re-estimation:对每个簇,重新计算簇内向量均值,作为新的质心。

在 HuBERT 中的角色:

k-means 把连续声学向量离散化成有限类别,
为自监督预训练提供伪标签。

关联