音频 Transformer 架构#
音频领域的 Transformer 模型主要分为两大类架构:CTC(仅编码器) 和 Seq2Seq(编码器-解码器)。理解这两种架构的原理和区别,是选择和使用音频模型的基础。
音频任务概述#
在深入架构之前,先了解音频处理的核心挑战:
输入: 音频波形 (变长序列,每秒 16,000 个采样点)
↓
输出: 文本/标签 (长度与输入不对齐)核心挑战:输入输出长度不一致
- 一秒音频 = 16,000 个采样点
- 对应文本可能只有几个字
- 需要某种对齐机制
CTC 架构#
什么是 CTC?#
CTC (Connectionist Temporal Classification) 是一种仅使用编码器的架构,通过特殊的损失函数解决对齐问题。
音频波形
↓
[特征提取] → Log-mel Spectrogram
↓
[音频编码器] → 隐藏状态序列
↓
[线性层] → 字符概率分布
↓
[CTC 解码] → 最终文本CTC 的工作原理#
CTC 引入了一个特殊的空白标记 (blank token),允许模型在不确定时输出空白:
原始输出: h h h _ e e _ l l l l _ l _ o o o
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
合并重复: h e l l o
↓
移除空白: h e l l o → "hello"CTC 解码规则:
- 合并连续重复的字符
- 移除空白标记
_
CTC 代码示例#
| |
CTC 的优缺点#
| 优点 | 缺点 |
|---|---|
| 推理速度快(无自回归) | 不能建模输出间依赖 |
| 结构简单 | 对重复字符处理不佳 |
| 支持流式处理 | 需要字符级词表 |
典型 CTC 模型#
| 模型 | 描述 |
|---|---|
| Wav2Vec2 | Facebook 的自监督预训练模型 |
| HuBERT | 隐藏单元聚类预训练 |
| SEW | 压缩预训练方法 |
Seq2Seq 架构#
什么是 Seq2Seq?#
Seq2Seq (Sequence-to-Sequence) 使用编码器-解码器结构,通过注意力机制实现输入输出的对齐。
音频波形
↓
[特征提取] → Log-mel Spectrogram
↓
[音频编码器] → 编码器隐藏状态
↓ ↓
↓ [交叉注意力]
↓ ↓
[文本解码器] ← 自回归生成
↓
输出文本 (逐 token 生成)Seq2Seq 的工作原理#
编码器输出: [h₁, h₂, h₃, ..., hₙ] (音频特征序列)
↓
[交叉注意力机制]
↓
解码器: <start> → "The" → "cat" → "sat" → <end>
↓ ↓ ↓
每步都关注编码器的相关位置自回归生成过程:
- 输入起始标记
<start> - 预测第一个 token
- 将预测结果作为下一步输入
- 重复直到生成结束标记
<end>
Whisper 模型详解#
Whisper 是目前最流行的 Seq2Seq 语音模型:
Whisper 架构
┌─────────────────────────────────────────────┐
│ │
│ Audio Input │
│ ↓ │
│ [Log-Mel Spectrogram] │
│ ↓ │
│ ┌───────────────┐ │
│ │ Audio Encoder │ (Transformer Encoder) │
│ │ × N layers │ │
│ └───────┬───────┘ │
│ ↓ │
│ Encoder Hidden States │
│ ↓ │
│ ┌───────────────┐ ┌─────────────┐ │
│ │ Cross-Attention│ ← │Text Decoder │ │
│ └───────────────┘ │ × N layers │ │
│ └──────┬──────┘ │
│ ↓ │
│ Output Tokens │
│ │
└─────────────────────────────────────────────┘Whisper 代码示例#
| |
Whisper 的特殊 Token#
Whisper 使用特殊 token 控制行为:
| |
| |
Seq2Seq 的优缺点#
| 优点 | 缺点 |
|---|---|
| 可建模输出依赖关系 | 推理速度慢(自回归) |
| 支持任意输出词表 | 不支持真正的流式 |
| 可执行多任务(翻译等) | 更大的模型复杂度 |
典型 Seq2Seq 模型#
| 模型 | 描述 |
|---|---|
| Whisper | OpenAI 多语言/多任务模型 |
| SpeechT5 | 统一语音-文本模型 |
| mBART | 多语言序列到序列 |
音频编码器模型#
无论 CTC 还是 Seq2Seq,都需要强大的音频编码器。以下是主流的预训练编码器:
Wav2Vec 2.0#
原始波形
↓
[CNN 特征提取器] → 局部特征 (每 20ms 一帧)
↓
[Transformer 编码器] → 上下文表示
↓
输出: 每帧的隐藏状态预训练方法:对比学习
- 随机遮挡部分输入
- 模型预测被遮挡位置的量化特征
- 类似于 BERT 的 MLM
| |
HuBERT#
HuBERT 使用聚类伪标签进行预训练:
第一轮: 使用 MFCC 聚类生成伪标签
↓
训练模型预测伪标签
↓
第二轮: 使用模型特征重新聚类
↓
再次训练... | |
Audio Spectrogram Transformer (AST)#
AST 将音频频谱图视为"图像",使用 Vision Transformer:
Log-mel Spectrogram (time × freq)
↓
[分割为 patches]
↓
[线性嵌入 + 位置编码]
↓
[Vision Transformer]
↓
分类输出 | |
编码器对比#
| 模型 | 输入 | 预训练方法 | 特点 |
|---|---|---|---|
| Wav2Vec2 | 原始波形 | 对比学习 | 端到端,支持微调 |
| HuBERT | 原始波形 | 聚类预测 | 更稳定的表示 |
| AST | 频谱图 | ImageNet 迁移 | 利用视觉预训练 |
| Whisper Encoder | 频谱图 | 监督学习 | 大规模标注数据 |
架构对比#
CTC vs Seq2Seq#
| 特性 | CTC | Seq2Seq |
|---|---|---|
| 结构 | 仅编码器 | 编码器 + 解码器 |
| 解码方式 | 非自回归 | 自回归 |
| 输出建模 | 条件独立 | 依赖历史输出 |
| 推理速度 | 快 | 慢 |
| 流式支持 | 原生支持 | 需特殊处理 |
| 错误纠正 | 弱 | 强(语言模型) |
| 代表模型 | Wav2Vec2 | Whisper |
何时选择哪种架构?#
选择 CTC:
- 需要低延迟实时识别
- 流式语音识别
- 计算资源有限
- 语言模型可外部融合
选择 Seq2Seq:
- 追求最高准确率
- 多语言/多任务场景
- 需要语音翻译
- 可接受较高延迟
混合架构#
一些模型结合了两种方法的优点:
音频
↓
[共享编码器]
↓
┌────────────────┬────────────────┐
│ CTC 分支 │ Attention 分支 │
│ (辅助训练) │ (主要输出) │
└────────────────┴────────────────┘
↓
联合解码联合 CTC-Attention 解码:
| |
特征提取对比#
原始波形 vs 频谱图#
| 输入类型 | 模型示例 | 优点 | 缺点 |
|---|---|---|---|
| 原始波形 | Wav2Vec2 | 端到端学习 | 序列很长 |
| Log-mel | Whisper | 降维,传统特征 | 信息损失 |
| 学习特征 | Encodec | 神经压缩 | 需要预训练 |
序列长度对比#
1 秒音频的序列长度:
原始波形 (16kHz): 16,000 个点
Wav2Vec2 输出: ~50 帧 (每帧 20ms)
Whisper 编码器输出: ~50 帧 (每帧 20ms)实践建议#
模型选择指南#
任务需求
│
├─→ 实时/流式 → Wav2Vec2 + CTC
│
├─→ 高准确率 → Whisper
│
├─→ 多语言 → Whisper / XLS-R
│
├─→ 语音翻译 → Whisper (translate task)
│
└─→ 音频分类 → AST / Wav2Vec2微调建议#
| 场景 | 推荐方案 |
|---|---|
| 数据少 (<1h) | 冻结编码器,只训练分类头 |
| 数据中等 (1-100h) | 微调全模型,小学习率 |
| 数据充足 (>100h) | 可从头训练或深度微调 |
| 领域特殊 | 先在领域数据上继续预训练 |
小结#
| 架构 | 核心思想 | 代表模型 | 适用场景 |
|---|---|---|---|
| CTC | 空白标记对齐 | Wav2Vec2 | 实时识别 |
| Seq2Seq | 注意力对齐 | Whisper | 高精度识别 |
| 混合 | 联合训练 | Conformer | 平衡方案 |
关键要点:
- CTC 快但不能建模输出依赖
- Seq2Seq 准但推理慢
- 预训练编码器是基础
- 根据实际需求选择架构
下一节:音乐流派分类 - 动手实践音频分类