C15
主线
Abstract
这一章从语音识别任务的数据基础讲起,主线是:语音语料库提供训练和评测材料,CNN 前端把长声学帧序列提取并压短,encoder-decoder ASR 用条件生成完成转写,HuBERT 则展示了如何用无标注语音先做自监督预训练,再微调到 ASR。
关键概念
笔记
常见语音语料库
| 语料库 | 语言 / 类型 | 规模 | 采样率 / 格式 | 场景 | 标注 | 关键特点 |
|---|---|---|---|---|---|---|
| LibriSpeech | 英语朗读语音 | 1000+ 小时 | 16 kHz | LibriVox 有声书,志愿者朗读无版权书籍 | 句子级对齐转录 | 分为 clean 和 other。发布时用 WSJ 朗读语音训练的 ASR 识别全库,再按说话者 WER 大致一分为二:低 WER 为 clean,高 WER 为 other |
| Switchboard | 英语电话对话 | 2430 段对话,平均 6 分钟;约 240 小时,300 万词 | 8 kHz | 20 世纪 90 年代初,陌生人之间的提示式电话对话 | 转录 + 大量人工辅助语言学标注 | 标注很丰富:句法分析、对话行为、音素、韵律、话语结构、信息结构 |
| CALLHOME | 英语电话对话 | 120 段,每段约 30 分钟 | 电话语音 | 20 世纪 90 年代末,英语母语者之间的非脚本化电话对话,多为亲密朋友或家人 | 转录 | 更自然、非脚本化,关系更亲近 |
| CHiME 6 | 英语会话语音 / 鲁棒 ASR | 20 场真实家庭晚餐聚会;每场 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 一帧。
- 随机选择一部分帧,替换成共享的
MASKembedding。 - 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反复迭代两步直到收敛:
- Assignment:每个向量分配给最近的质心,距离通常用欧氏距离。
- Re-estimation:对每个簇,重新计算簇内向量均值,作为新的质心。
在 HuBERT 中的角色:
k-means 把连续声学向量离散化成有限类别,
为自监督预训练提供伪标签。