Whisper
Whisper 是一个基于 Transformer Encoder-Decoder 架构的端到端语音模型。它直接将音频波形映射为文本序列,支持多语言识别、翻译和语音活动检测(VAD)。
输入:16kHz 单声道音频波形(Waveform)。
输出:离散的文字 Token 序列(包含时间戳、语言标签、特殊控制符)
从输入到输出对应步骤:
- 第一步:音频预处理 (Audio Preprocessing)
| 项目 | 内容 |
|---|---|
| 输入 | 任意长度原始音频(.wav, .mp3 等) |
| 操作 | ① 重采样 → 统一 16kHz ② 归一化 → 振幅缩放至 [-1, 1] ③ 切片 → 30秒片段,不足则零填充 |
| 输出形状 | [Batch, 480,000] (30s × 16,000 samples/s) |
- 第二步:特征提取 (Feature Extraction)
| 项目 | 内容 |
|---|---|
| 操作 | 计算 Log-Mel Spectrogram(对数梅尔频谱图) |
| 流程 | ① STFT → 时域转频域 ② Mel Filter Bank → 80个梅尔滤波器 ③ 取对数 → 压缩动态范围 |
| 维度变化 | 时间:480,000 采样点 → 3,000 帧 频率:80 通道 |
| 输出形状 | [Batch, 80, 3000] |
| 意义 | 模型的"图像"输入,保留时序与频谱特征 |
- 第三步:Encoder 编码 (Feature Encoding)
| 项目 | 内容 |
|---|---|
| 架构 | 32层 Transformer Encoder(Whisper Large) |
| 关键组件 | ① Conv1d Stem → 两层卷积,步长2,时间压缩 3000→750 ② Positional Embedding → 正弦位置编码 ③ Self-Attention (双向) → 每帧可见全部上下文 |
| 输出形状 | [Batch, 750, d_model](d_model=1280) |
| 作用 | 捕捉全局语义,生成音频深层表示 Memory States (K, V) |
- 第四步:Decoder 解码 (Text Generation)
| 项目 | 内容 |
|---|---|
| 架构 | 堆叠 Transformer Decoder(自回归生成) |
| 输入 | ① Encoder 输出 → 作为 Cross-Attention 的 K/V ② 上一时刻 Token → 作为 Query(含特殊令牌) |
| 关键机制 | ① Masked Self-Attention → 单向因果,防信息泄露 ② Cross-Attention → 文字"关注"对应音频时段 ③ Positional Embedding → 文本位置编码 |
| 输出 | 每步生成 Logits [Batch, 1, vocab_size] |
- 第五步:后处理与采样 (Post-processing & Sampling)
| 项目 | 内容 |
|---|---|
| 操作 | ① 采样 → Greedy / Beam Search 选最高概率 Token ② 解析特殊令牌 → 时间戳、结束符检测 ③ 文本拼接 → Token ID 转字符串,去空格 |
| 特殊令牌 | <|startoftranscript|>, <|en|>, <|transcribe|>, <|notimestamps|>, <|0.00|>, <|endoftext|> |
| 最终输出 | 带时间戳的文本段落 |
| 示例 | [00:00:01 --> 00:00:04] Hello world |
以下是 Whisper 流式推理特性与性能瓶颈的 Markdown 格式总结:
⚡ Whisper 流式推理:瓶颈与优化方案
一、核心瓶颈分析
| 瓶颈类型 | 具体表现 | 根本原因 |
|---|---|---|
| 延迟 (Latency) | 首字延迟高达 30s,必须听完才能转录 | Encoder 需完整 30s 上下文做双向 Attention;Decoder 依赖 Encoder 全局输出 |
| 显存带宽 (Memory Bandwidth) | 高并发下 GPU 带宽打满,吞吐量上不去 | Decoder 自回归,每 Token 都需读取巨大 Encoder Memory (KV Cache),Memory-Bound |
| 边界效应 (Boundary Artifacts) | 切片处识别不准,句子截断 | 30s 硬切分破坏长句语义连贯性,卷积/Attention 在边界信息缺失 |
| 卷积算子效率 | Conv1d 流式小 Batch 下效率低 | 卷积难充分利用 Tensor Cores,流式 Padding 处理复杂 |
二、优化落地方案
1. 流式切片策略 (Streaming Chunking)
| 项目 | 内容 |
|---|---|
| 问题 | 如何不等待 30s 即输出? |
| 方案 | Sliding Window Inference(滑动窗口) |
| 机制 | ① 切小块(2s/5s)送入 30s 窗口(历史 + 当前 + lookahead) ② 增量计算:KV Cache 复用历史 Encoder 输出,只算新增 Feature |
| 效果 | 延迟从 30s → 200ms~1s |
2. 量化 (Quantization & Distillation)
| 项目 | 内容 |
|---|---|
| INT8/FP8 量化 | Encoder 权重 + Activation 量化(SmoothQuant),减显存压带宽 |
| 结果 | 显存占用 ↓50%,推理速度 ↑2-3x |
3. 算子融合与编译优化
| 技术 | 作用 |
|---|---|
| Conv-to-GEMM | im2col 转换 Conv1d 为矩阵乘,TensorRT/vLLM 加速 |
| Kernel Fusion | 融合 LayerNorm + Bias + Activation,减少 CUDA Kernel 启动 |
| PagedAttention | 借鉴 LLM 优化,管理 Decoder KV Cache,解决长语音显存碎片 |
4. 端点检测联动 (VAD Integration)
| 项目 | 内容 |
|---|---|
| 方案 | 前置轻量 VAD(如 Silero VAD) |
| 机制 | ① 检测到人声才触发 Whisper ② 自动切断静音,避免无意义 30s 推理 |
| 收益 | 无效计算大幅降低,算力成本 ↓30%-50% |
三、方案对比速查
| 优化方向 | 核心手段 | 主要收益 | 适用场景 |
|---|---|---|---|
| 降低延迟 | Sliding Window + KV Cache 复用 | 30s → 亚秒级 | 实时会议、直播字幕 |
| 提升吞吐 | 量化 + 蒸馏 + PagedAttention | 2-3x 加速,省显存 | 高并发 API 服务 |
| 消除边界 | 重叠窗口 + 上下文拼接 | 句子完整性提升 | 长音频转录 |
| 节省算力 | VAD 前置过滤 | 30%-50% 成本削减 | 语音交互设备 |
💡 面试金句
- 延迟瓶颈:"Whisper 的 Encoder 是双向注意力,必须等 30s 音频到齐才能开始算,这是流式的根本矛盾"
- 带宽瓶颈:"Decoder 每生成一个 Token 都要读一遍 Encoder 的 KV Cache,是典型的 Memory-Bound,不是算力不够"
- 优化核心:"滑动窗口降延迟,量化提吞吐,VAD 过滤省成本"