Whisper 语音识别模型
Whisper 是 OpenAI 推出的通用语音识别模型,通过 68 万小时的多语言弱监督训练数据,实现了接近人类水平的语音识别性能,同时支持语音翻译、语言识别和语音活动检测等多种任务。
架构设计
Whisper 采用经典的 Encoder-Decoder Transformer 架构:
- 编码器:处理 Mel 频谱图,提取音频特征
- 解码器:自回归生成文本 Token,支持多种任务 Token 前缀
python
import torch
import torch.nn as nn
class WhisperModel(nn.Module):
"""简化的 Whisper 架构"""
def __init__(self, audio_dim=80, d_model=512, num_heads=8, num_layers=6):
super().__init__()
# 音频编码器
self.encoder = nn.Sequential(
nn.Conv1d(audio_dim, d_model, 3, padding=1),
nn.GELU(),
nn.Conv1d(d_model, d_model, 3, stride=2, padding=1),
nn.GELU(),
nn.TransformerEncoder(
nn.TransformerEncoderLayer(d_model, num_heads, d_model*4),
num_layers=num_layers
)
)
# 文本解码器
self.decoder = nn.TransformerDecoder(
nn.TransformerDecoderLayer(d_model, num_heads, d_model*4),
num_layers=num_layers
)
self.token_embedding = nn.Embedding(50258, d_model) # GPT-2 词表
def forward(self, mel_spectrogram, tokens):
audio_features = self.encoder(mel_spectrogram)
token_embeds = self.token_embedding(tokens)
output = self.decoder(token_embeds, audio_features)
return output @ self.token_embedding.weight.T # 权重共享多任务格式
Whisper 通过特殊的 Token 前缀指定任务类型:
| 任务 | Token 前缀 | 输出 |
|---|---|---|
| 语音识别 | `< | transcribe |
| 语音翻译 | `< | translate |
| 语言识别 | `< | lang |
| 语音活动检测 | `< | sil |
Whisper 的训练数据
Whisper 使用 68 万小时的音频-文本对训练,其中 11.7 万小时是非英语数据。数据从互联网收集,质量参差不齐,但规模弥补了噪声问题——这是"弱监督学习"的典型成功案例。
模型系列
| 模型 | 参数量 | 相对速度 | 适用场景 |
|---|---|---|---|
| Tiny | 39M | 32x | 实时低延迟 |
| Base | 74M | 16x | 轻量应用 |
| Small | 244M | 6x | 平衡性能 |
| Medium | 769M | 2x | 高质量识别 |
| Large-v3 | 1550M | 1x | 最佳质量 |
Whisper 的改进与变体
- Whisper-v3:改进了多语言识别和幻觉问题
- Faster-Whisper:使用 CTranslate2 加速推理,4x 速度提升
- WhisperX:添加强制对齐实现词级时间戳
- Distil-Whisper:知识蒸馏压缩,6x 加速
python
# Faster-Whisper 推理示例
from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe("audio.mp3", language="zh")
for segment in segments:
print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")中文语音识别
Whisper 在中文语音识别方面表现良好,但存在一些不足:
- 长音频识别可能出现重复(幻觉问题)
- 标点符号预测不够准确
- 方言和口音识别仍有提升空间