Skip to content

Whisper 语音识别模型

Whisper 是 OpenAI 推出的通用语音识别模型,通过 68 万小时的多语言弱监督训练数据,实现了接近人类水平的语音识别性能,同时支持语音翻译、语言识别和语音活动检测等多种任务。

Whisper架构示意

架构设计

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 万小时是非英语数据。数据从互联网收集,质量参差不齐,但规模弥补了噪声问题——这是"弱监督学习"的典型成功案例。

模型系列

模型参数量相对速度适用场景
Tiny39M32x实时低延迟
Base74M16x轻量应用
Small244M6x平衡性能
Medium769M2x高质量识别
Large-v31550M1x最佳质量

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 在中文语音识别方面表现良好,但存在一些不足:

  • 长音频识别可能出现重复(幻觉问题)
  • 标点符号预测不够准确
  • 方言和口音识别仍有提升空间

相关资源

最近更新