前言
相比 wav2vec 2.0 、HuBERT 和 WavLM 等自监督模型。Whisper(Radford et al.,OpenAI,2022)的想法是,互联网已经有大量音频、字幕对,能不能接受标签不够精确,以更大的规模和更多样的来源,直接训练一个能转写、能翻译的模型?
它采用的方法是,68 万小时弱监督数据 + 一个标准的 encoder-decoder Transformer + 统一的下一 token 预测。
重点理解下面 5 个问题:
- 一段声音怎样变成 encoder 的 1500 个向量?
- Decoder 不是简单的文字续写,它如何利用音频信息?
- 语言、任务、文字和时间戳,怎么共用一个交叉熵损失?
- 训练时一次算出所有位置,推理时为什么必须逐步生成?
- 模型一次只处理 30 秒,怎样转写一小时的录音?
一、主框架
1.1 弱监督
Whisper 与 SSL 模型对比。
| 比较项 | wav2vec 2.0 / HuBERT / WavLM 的自监督预训练 | Whisper |
|---|---|---|
| 主要监督来源 | 从音频构造的量化目标或聚类伪标签 | 收集到的音频—文本配对及任务标签 |
| 主要预测对象 | 被掩码位置的声学目标 | 文字、语言、任务、时间戳等 token |
| 直接产物 | 可用于多种下游任务的语音表示 | 可直接转写、翻译的 encoder-decoder 系统 |
| 做 ASR 的典型方式 | 加下游头,并用标注数据微调 | 直接解码,也可以继续微调 |
弱监督指的是互联网字幕通常不是为训练专门制作的逐字精标,可能有漏字、时间偏移、大小写不统一等问题。它依然有监督信号,只是单条标签不够可靠。
相比 SSL 模型,Whisper 不再主要预测声学伪标签,而是直接学习从音频生成自然语言。
1.2 数学表示
设 X X X 是音频特征, H H H 是 encoder 输出, Y = ( y 1 , … , y N ) Y=(y_1,\ldots,y_N) Y=(y1,…,yN) 是待生成的 token 序列, c c c 表示已指定的语言、任务、格式及可选历史文本。推理时,
H = Encoder θ ( X ) H=\operatorname{Encoder}_{\theta}(X) H=Encoderθ(X)
p θ ( Y ∣ X , c ) = ∏ n = 1 N p θ ( y n ∣ y < n , H , c ) p_{\theta}(Y\mid X,c)= \prod_{n=1}^{N} p_{\theta}(y_n\mid y_{<n},H,c) pθ(Y∣X,c)=n=1∏Npθ(yn∣y<n,H,c)
即先把声音编码一次,然后每一步同时参考“这段声音”和“前面已经生成的内容”,预测下一个 token。
- H 告诉模型音频里有什么声学证据;
- y < n y_{<n} y<n 和 c 告诉模型现在在做什么任务,已经写到哪里,下一步应该输出什么格式。
训练时,语言、任务等 token 本身也会作为预测目标;推理时,它们可以由用户指定,作为已知前缀输入。
1.3 68 万小时组成
论文的数据构成:
680,000 小时
├── 438,000 小时:英语语音 → 英语文本
├── 117,000 小时:96 种非英语语音 → 同语种文本
└── 125,000 小时:非英语语音 → 英语文本
438,000 小时由总量减去另外两项得到,英语转写约占 64%。
数据清洗主要是
- 过滤疑似机器生成的字幕:利用缺少标点、异常的大小写模式等线索,减少模型学习其他 ASR 系统的输出习惯。
- 检查音频与文本的语言:语言不一致时通常丢弃;若目标文本是英语,则可作为语音翻译数据保留,音频语种标签也来自语种识别模型。
- 模糊去重:减少重复、模板化和低质量内容的影响。
- 切分为 30 秒窗口并匹配字幕:无语音片段也保留一部分,为 vad 提供监督,这里的 vad 是片段级的。
- 用初版模型辅助复查数据源:结合错误率与数据源规模安排人工检查,清除大批音文错位、转写不完整的数据。
弱监督允许个别标签有噪声,但不能放任大量同方向的错误反复出现。
二、声音怎样变成 1500 个向量

图 1 Whisper 流程
2.1 数据流
如图 1 所示,以 batch size 为 1 的多语言 whisper-base 为例,模型宽度 d=512,encoder 和 decoder 各 6 层:
音频波形:16 kHz,补齐或截取为一个 30 秒窗口
(1, 480000)
│ STFT → 功率谱 → 80 维 mel → log 与缩放
▼
X:(1, 80, 3000)
│ Conv1d(80, 512, kernel=3, stride=1, padding=1) + GELU
▼
(1, 512, 3000)
│ Conv1d(512, 512, kernel=3, stride=2, padding=1) + GELU
▼
(1, 512, 1500)
│ 转置 + 正弦位置编码 + 6 层双向 Transformer + LayerNorm
▼
H:(1, 1500, 512)
│
└─────────────────────── 作为每层 cross-attention 的 K、V 来源
▲
decoder token IDs:(1, N) │
│ token embedding + 可学习位置编码 │
▼ │
(1, N, 512) → 6 层 decoder ────────────────────────┘
│ 最后 LayerNorm + 共享词嵌入矩阵投影
▼
logits:(1, N, 51865)
1500 是声学序列长度,N 是 decoder 输入的 token 数,二者不需要相等。
2.2 两层卷积
卷积用来混合邻域、升维、降采样,时间长度遵循
T o u t = ⌊ T i n + 2 p − ( k − 1 ) − 1 s + 1 ⌋ , T_{\mathrm{out}}= \left\lfloor \frac{T_{\mathrm{in}}+2p-(k-1)-1}{s}+1 \right\rfloor, Tout=⌊sTin+2p−(k−1)−1+1⌋,
代入 k=3, p=1,
- 第一层
s=1:3000 → 3000,通道 80 → 512; - 第二层
s=2:3000 → 1500,通道保持 512。
第一层不只是“把 80 维升到 512 维”,它的卷积核宽度是 3,也会混合相邻的 mel 帧。两层卷积叠加后,内部位置的一个输出覆盖 5 个 mel 帧,对应约
25 m s + 4 × 10 m s = 65 m s , 25\ \mathrm{ms}+4\times10\ \mathrm{ms}=65\ \mathrm{ms}, 25 ms+4×10 ms=65 ms,
| 概念 | 此处的数值或含义 |
|---|---|
| 卷积输出的时间步间隔 | 20 ms,即每秒 50 个位置 |
| 卷积前端的局部感受野 | 内部位置约覆盖 65 ms 波形 |
| 完整 encoder 输出的上下文 | 双向自注意力允许利用整个 30 秒窗口 |
“50 Hz 的 encoder 输出”不代表“每个向量只知道独立的 20 ms 音频”。
2.3 Encoder:把局部声学特征变成上下文化表示
将卷积结果转成 T×d,加上正弦位置编码后,送入双向 Transformer。省略 batch 维,每一层可写成
U ( ℓ ) = H ( ℓ − 1 ) + SelfAttn ( LN ( H ( ℓ − 1 ) ) ) , U^{(\ell)}= H^{(\ell-1)} + \operatorname{SelfAttn}\bigl(\operatorname{LN}(H^{(\ell-1)})\bigr), U(ℓ)=H(ℓ−1)+SelfAttn(LN(H(ℓ−1))),
H ( ℓ ) = U ( ℓ ) + MLP ( LN ( U ( ℓ ) ) ) , H^{(\ell)}= U^{(\ell)} + \operatorname{MLP}\bigl(\operatorname{LN}(U^{(\ell)})\bigr), H(ℓ)=U(ℓ)+MLP(LN(U(ℓ))),
这是 pre-LN 残差结构,MLP 为 d → 4d → d,中间使用 GELU。最后再做一次 LayerNorm,得到
H = ( h 1 , … , h 1500 ) ∈ R 1500 × d , H=(h_1,\ldots,h_{1500})\in\mathbb{R}^{1500\times d}, H=(h1,…,h1500)∈R1500×d,
Encoder 的自注意力没有 decoder 的因果掩蔽。
这 1500 个向量是连续表示,不是 1500 个文字 token,也不是 HuBERT 的聚类编号。它们保留时间位置,并把局部声学信息与整窗上下文融合起来。
三、Decoder 一边读文字,一边听声音
3.1 一层 decoder 做三件事
假设现在已有前缀:“中文、转写、起始时间、你”。模型要预测后面的“好”。
它既要知道“你”后面在语言上可能接什么,也要检查音频到底有没有说“好”。如图 1 所示,这两种信息分别通过 self-attention 和 cross-attention 进入 decoder。
令 Z ( 0 ) Z^{(0)} Z(0) 为 token embedding 与可学习位置 embedding 之和。一层 decoder 为:
A ( ℓ ) = Z ( ℓ − 1 ) + MaskedSelfAttn ( LN ( Z ( ℓ − 1 ) ) ) A^{(\ell)}= Z^{(\ell-1)} + \operatorname{MaskedSelfAttn} \bigl(\operatorname{LN}(Z^{(\ell-1)})\bigr) A(ℓ)=Z(ℓ−1)+MaskedSelfAttn(LN(Z(ℓ−1)))
B ( ℓ ) = A ( ℓ ) + CrossAttn ( LN ( A ( ℓ ) ) , H ) B^{(\ell)}= A^{(\ell)} + \operatorname{CrossAttn} \bigl(\operatorname{LN}(A^{(\ell)}),H\bigr) B(ℓ)=A(ℓ)+CrossAttn(LN(A(ℓ)),H)
Z ( ℓ ) = B ( ℓ ) + MLP ( LN ( B ( ℓ ) ) ) Z^{(\ell)}= B^{(\ell)} + \operatorname{MLP}\bigl(\operatorname{LN}(B^{(\ell)})\bigr) Z(ℓ)=B(ℓ)+MLP(LN(B(ℓ)))
对应三步:
- Masked self-attention:读已知前缀。
- Cross-attention:按当前需要,从音频表示中取信息。
- MLP:进一步变换融合后的表示。
声学信息通过每一层交叉注意力,参与下一 token 的判断。
3.2 Cross-attention:Q 来自文字侧,K、V 来自音频侧
先看一个注意力头。设头维度为 dₕ
Q = LN ( A ) W Q , K = H W K , V = H W V , Q=\operatorname{LN}(A)W_Q,\qquad K=HW_K,\qquad V=HW_V, Q=LN(A)WQ,K=HWK,V=HWV,
Attention ( Q , K , V ) = softmax ( Q K ⊤ d h ) V . \operatorname{Attention}(Q,K,V)= \operatorname{softmax} \left(\frac{QK^\top}{\sqrt{d_h}}\right)V. Attention(Q,K,V)=softmax(dhQK⊤)V.
若当前 decoder 有 N 个位置,encoder 有 1500 个位置,则
Q ∈ R N × d h , K , V ∈ R 1500 × d h , Q K ⊤ ∈ R N × 1500 . Q\in\mathbb{R}^{N\times d_h},\quad K,V\in\mathbb{R}^{1500\times d_h},\quad QK^\top\in\mathbb{R}^{N\times1500}. Q∈RN×dh,K,V∈R1500×dh,QK⊤∈RN×1500.
每一行都在回答“为了预测这个位置的下一个 token,应该从哪些音频位置取信息?”
所有 decoder 层都访问同一个 encoder 输出 H,但各层的投影矩阵不同,取信息的方式也不同。
3.3 举个例子
为了看清运算,把 1500 个声学位置缩成 4 个。假设某个 decoder 位置与它们的缩放后分数为
s = [ 0 , 2 , 1 , − 1 ] , s=[0,2,1,-1], s=[0,2,1,−1],
softmax 后
α = softmax ( s ) ≈ [ 0.0871 , 0.6439 , 0.2369 , 0.0321 ] . \alpha=\operatorname{softmax}(s) \approx[0.0871,\ 0.6439,\ 0.2369,\ 0.0321]. α=softmax(s)≈[0.0871, 0.6439, 0.2369, 0.0321].
假设这 4 个位置对应的 value 为
V = [ 1 0 0 2 2 1 − 1 0 ] , V= \begin{bmatrix} 1&0\\ 0&2\\ 2&1\\ -1&0 \end{bmatrix}, V= 102−10210 ,
取回的音频信息就是加权和
o = α V ≈ [ 0.5289 , 1.5247 ] . o=\alpha V \approx[0.5289,\ 1.5247]. o=αV≈[0.5289, 1.5247].
第二个位置权重最大,但其他位置也有贡献。这个向量会经过多头拼接、输出投影和残差连接,继续参与 decoder 计算。
3.4 下一个 token 的概率
Decoder 最后一层输出经 LayerNorm 后,设第 n n n 个预测位置的向量为 z n ∈ R d z_n\in\mathbb{R}^{d} zn∈Rd,词嵌入矩阵为 E ∈ R ∣ V ∣ × d E\in\mathbb{R}^{|\mathcal{V}|\times d} E∈R∣V∣×d。官方实现共享输入词嵌入与输出投影权重,
ℓ n = E z n ∈ R ∣ V ∣ , \ell_n=Ez_n\in\mathbb{R}^{|\mathcal{V}|}, ℓn=Ezn∈R∣V∣,
p θ ( y n = v ∣ y < n , H , c ) = exp ( ℓ n , v ) ∑ u ∈ V exp ( ℓ n , u ) , p_{\theta}(y_n=v\mid y_{<n},H,c)= \frac{\exp(\ell_{n,v})} {\sum_{u\in\mathcal{V}}\exp(\ell_{n,u})}, pθ(yn=v∣y<n,H,c)=∑u∈Vexp(ℓn,u)exp(ℓn,v),
ℓₙ 是整个词表的分数向量,p(yₙ=v) 是其中某个 token 的概率。
四、把任务写进序列
4.1 词表类别
原始多语言模型的词表共 51,865 项。按互不重叠的类别划分:
50,257 个普通 byte-level BPE token
99 个语言 token
1,501 个时间戳 token
8 个其他特殊 token
──────────────────────────────
51,865 个 token
8 个其他特殊 token 包括 <|endoftext|>、<|startoftranscript|>、<|translate|>、<|transcribe|>、<|startoflm|>、<|startofprev|>、<|nospeech|> 和 <|notimestamps|>。
英文模型沿用 GPT-2 的 byte-level BPE,多语言模型重新拟合了文本词表。
4.2 带时间戳的中文转写序列
假设音频里的“你好”从 0.30 秒持续到 0.92 秒,完整序列示意为:
<|startoftranscript|> <|zh|> <|transcribe|> <|0.30|> 你 好 <|0.92|> <|endoftext|>
SOT 中文 转写 起点 正文 终点 EOT
下文用 SOT、EOT 简写起止标记。论文示意图中的 EOT,在官方 tokenizer 中的实际字符串是 <|endoftext|>。
逐项理解,
SOT:当前转录序列从这里开始;<|zh|>:音频的语言是中文;<|transcribe|>:保留原语言转写;<|0.30|>、<|0.92|>:这段字幕在当前音频窗口中的起止时间;EOT:本次序列生成结束。
这里没有一张独立的“时间戳预测表”。时间也是词表里的离散类别,和正文一样由 decoder 预测。
4.3 换任务、换格式
同一段中文音频,三种格式可以写成:
中文转写,带时间戳:
SOT <|zh|> <|transcribe|> <|0.30|> 你好 <|0.92|> EOT
中文转写,不带时间戳:
SOT <|zh|> <|transcribe|> <|notimestamps|> 你好 EOT
翻译为英语,不带时间戳:
SOT <|zh|> <|translate|> <|notimestamps|> Hello EOT
翻译时仍然用 <|zh|>,因为它标记的是源音频语言;原论文这里的语音翻译目标是英语,不是任意目标语言互译。
训练时模型学习完整序列的分布;实际使用时,用户可以指定语言、任务与格式,模型在这个前缀后继续生成。
所以,“训练过预测 <|translate|>”不等于“模型会自动知道用户今天想要翻译,而不是转写”。任务选择仍然需要明确输入。
4.4 无语音
无语音分支的关键预测关系是:
有语音:SOT → 语言 token → 任务 token → …
无语音:SOT → <|nospeech|>
官方推理会读取 SOT 位置原始 softmax 中 <|nospeech|> 的概率,用作 no_speech_prob。它不依赖这枚 token 最终出现在转写文本中;正常正文生成时,这枚 token 通常被抑制。
自动语种识别也读取 SOT 位置,但会把候选限制在语言 token 中再归一化。因此“中文概率很高”与“无语音概率也高”并不矛盾:二者的候选集合不同,不能当作同一套概率直接比较。
4.5 时间戳
Whisper 把时间离散到 20 ms 的网格
τ k = 0.02 k s , k = 0 , 1 , … , 1500 , \tau_k=0.02k\ \mathrm{s},\qquad k=0,1,\ldots,1500, τk=0.02k s,k=0,1,…,1500,
因此时间戳 token 从 <|0.00|> 到 <|30.00|>,共
30 0.02 + 1 = 1501. \frac{30}{0.02}+1=1501. 0.0230+1=1501.
训练时间戳来自字幕的时间信息,再量化到网格。
官方的 word_timestamps=True 是额外的对齐流程:利用选定交叉注意力头的权重,再用动态时间规整(DTW)寻找文本与音频的对齐路径,见官方 timing.py。它不等于把原生时间戳 token 的输出直接改名为“词时间戳”。
4.6 历史文本怎样进入下一窗
如果启用上下文条件,形式是
<|startofprev|> 上一窗的部分文字 SOT <|zh|> <|transcribe|> …
模型可以参考前文处理术语、指代和上下句衔接。训练时提供的历史是真实转写文本,推理时通常变成先前的识别结果。
历史文本、任务前缀和新生成内容会共同占用 decoder 的上下文。原始模型的文本上下文长度是 448 个位置。
至此,Whisper 的“多任务”可以概括成一句话:
把不同任务的条件和答案写成同一种序列协议,再让同一个 decoder 学习这个协议。
五、训练
5.1 Teacher forcing:输入与标签必须错开一位
仍用“你好”的完整序列:
SOT <zh> <transcribe> <0.30> 你 好 <0.92> EOT
其中 <zh>、<transcribe> 等为缩写。构造一组等长的输入与标签:
位置: 0 1 2 3 4 5 6
输入: SOT <zh> <transcribe> <0.30> 你 好 <0.92>
标签: <zh> <transcribe> <0.30> 你 好 <0.92> EOT
输入位置 4 是“你”,标签是“好”。因果掩蔽使这个位置只能看到输入位置 0~4,不能看到位置 5 的“好”。
teacher forcing:每个位置都用真实历史预测下一个真实 token。
5.2 为什么训练可以并行,推理却不行
训练时,整条正确答案已知,可以一次构造全部输入,计算 N×|V| 的 logits,再同时求各位置损失。因果掩蔽保证并行计算没有答案泄漏。
推理时,下一个输入还不存在,只能先生成一个 token,再把它接回前缀:
训练:真实完整序列 → 右移与因果掩蔽 → 一次前向计算所有位置
推理:已有前缀 → 生成一个 token → 接回前缀 → 再生成一个
5.3 损失函数:一套词表,一套负对数似然
令 m n ∈ { 0 , 1 } m_n\in\{0,1\} mn∈{0,1} 表示第 n n n 个目标是否参与损失,则平均 token 损失可写为
L = − 1 ∑ n m n ∑ n m n log p θ ( y n ∣ y < n , H ) . \mathcal{L}=-\frac{1}{\sum_n m_n} \sum_n m_n \log p_{\theta}(y_n\mid y_{<n},H). L=−∑nmn1n∑mnlogpθ(yn∣y<n,H).
这里把语言、任务等也纳入完整训练序列,不再单独记作已固定的 c。
按论文的训练设定,先前上下文文本不计预测损失,当前序列中的语言、任务、时间戳、正文、结束标记等均为学习目标。无语音样本提供无语音 token 的监督。实现 batch 时,补齐位置应忽略。补齐的文本虽然不算上下文的 loss,但依然参与注意力计算。
例如历史文本“上一句”作为条件:
完整输入条件:<|startofprev|> 上一句 SOT <zh> <transcribe> …
损失处理: 历史区域忽略 当前任务序列参与预测
注意力处理: 历史仍可被后续位置读取
六、解码
6.1 单窗口解码
一次常规解码尝试可以概括为:
1. 当前音频窗口 → log-mel → encoder,得到 H。
2. 确定语言,按用户要求组装任务与格式前缀。
3. Decoder 读取前缀和 H,得到下一个 token 的 logits。
4. 应用特殊 token / 时间戳约束,按解码策略选择 token。
5. 把新 token 接回序列,重复 3~4。
6. 遇到 EOT 或达到生成长度限制,停止。
在一次自回归生成中,H 不会随着每个新字重新计算。各 decoder 层投影后的 cross-attention K、V 可以缓存,self-attention 的历史 K、V 则随生成逐渐增长。
6.2 Greedy、beam search 和温度
Greedy 每一步取当前概率最大的 token,简单但不保证整条序列最好。
Beam search 保留多条候选前缀。每次扩展后,根据累计对数概率及长度处理等规则筛选候选,减小早期一次错误选择就丢掉好序列的风险。它是近似搜索,也不保证找到全局最优答案。
温度采样 则先调整分布:
p τ ( v ) = exp ( ℓ v / τ ) ∑ u exp ( ℓ u / τ ) , τ > 0 p_{\tau}(v)= \frac{\exp(\ell_v/\tau)} {\sum_u\exp(\ell_u/\tau)},\qquad \tau>0 pτ(v)=∑uexp(ℓu/τ)exp(ℓv/τ),τ>0
温度越高,分布越平,低概率候选更容易被采到。官方代码的 temperature=0 表示进入确定性解码分支,不是除以 0。
6.3 时间戳不是完全自由地生成
学习序列格式之外,官方解码还会施加规则,帮助输出保持合法结构。例如
- 带时间戳模式下,正文起始处应先生成起始时间;
- 一段正文以结束时间收尾,后面可接下一段的起始时间;
- 约束时间顺序,避免随意倒退;
- 在不该出现语言、任务等标记的位置抑制这些 token。
因此,典型多段结果是:
<|0.30|>第一段文字<|2.10|><|2.40|>第二段文字<|5.00|>
↑ ↑
上段终点 下段起点
6.4 解码回退
自回归模型有时会重复某句话,或者在模糊音频上给出低置信度结果。论文与官方实现使用以下启发式检查:
| 信号 | 默认阈值 | 主要用途 |
|---|---|---|
| 平均 token 对数概率 | 低于 -1.0 | 提示整段候选置信度较低 |
| 文本压缩率 | 高于 2.4 | 提示可能出现大量重复 |
SOT 位置的 no_speech_prob | 高于 0.6 | 与低置信度联合判断无语音 |
文本压缩率在该版官方实现中按 UTF-8 文本字节数除以 zlib 压缩后字节数计算。重复越多,通常越容易压缩,比例就可能越大;这只是检测线索,不是“超过阈值就一定是幻觉”。
平均对数概率或压缩率检查失败时,尝试按 0.0 → 0.2 → 0.4 → … → 1.0 提高温度,重新解码同一个窗口。
对于无语音判断,不是单看 no_speech_prob > 0.6 就跳过。默认逻辑检查转写置信度:如果转写平均对数概率较高,会保留结果;无语音概率高且转写置信度低时,才倾向于跳过该窗,并避免无意义重试。
6.5 长音频解码
一小时录音有 180,000 个 20 ms 时间步。如果直接把它们一起送进标准全注意力 encoder,计算与显存开销会远大于 1500 个位置的 30 秒窗口。
原始 Whisper 的输入接口与位置长度按 30 秒设计。长录音的处理发生在模型外层的转写循环中:
取当前窗口 → 编码与解码 → 解析字幕及时间戳 → 更新音频起点 → 处理下一窗
│
└→ 可把已确认文字作为下一窗的文本条件
新窗口会重新编码自己的音频。传递历史文字。
举个例子。第一窗从绝对时间 0 秒开始,范围为 [0.00,30.00]:
<0.00> 第一段文字 <4.20> <4.60> 第二段文字 <26.40> <26.80>
└──完整──┘ └───完整───┘ └──未完成下一段的起点
第二窗范围为 [26.40,56.40]。原来那句 [26.80,30.20] 的跨界句,现在完整落在第二窗里,其相对时间是:
26.80 − 26.40 = 0.40 , 30.20 − 26.40 = 3.80 26.80-26.40=0.40,\qquad 30.20-26.40=3.80 26.80−26.40=0.40,30.20−26.40=3.80
所以它可以被输出为
第二窗中的片段:<0.40> 完整的跨界句 <3.80>
映射回原录音: [26.80, 30.20]
让新窗口重新覆盖未完成的声音,待能完整识别时再提交,而不是把两个半句字符串拼接。
七、结果分析
7.1 强大的泛化性
Whisper 的 zero-shot 不针对被评测数据集的训练集做专门微调,直接使用训练好的系统。
论文表 2 比较 wav2vec 2.0 Large 和 Whisper Large V2,说明它们虽然在 LibriSpeech test-clean 上表现接近,但在其他评测集上,Whisper 的泛化能力更强。
| 评测项 | wav2vec 2.0 Large | Whisper Large V2 | 相对降错 |
|---|---|---|---|
| LibriSpeech test-clean | 2.7 | 2.7 | 0.0% |
| Common Voice | 29.9 | 9.0 | 69.9% |
| TED-LIUM | 10.5 | 4.0 | 61.9% |
| CHiME-6 | 65.8 | 25.5 | 61.2% |
| AMI IHM | 37.0 | 16.9 | 54.3% |
| AMI SDM1 | 67.6 | 36.4 | 46.2% |
| 原表除 test-clean 外 13 个评测项的平均 | 29.3 | 12.8 | 55.2% |
需要注意表 2 不是控制所有条件后的 encoder 单独比较,wav2vec 2.0 基线是经过 ASR 微调、未接外部语言模型的系统,双方的训练数据、模型规模和 decoder 都不同。所以,不能据此直接断言“Whisper 的每一层特征一定比 WavLM 更适合所有任务”。
7.2 局限
第一,不是天然的说话人日志系统。
原生输出没有稳定的 speaker_0 / speaker_1 身份序列,也没有完成重叠说话人的独立转写。论文发现模型会猜测说话人姓名,因此又在不带说话人标注的子集上短暂微调,抑制这种行为。
第二,不是原生因果流式模型。
Encoder 可以访问当前窗口的未来声音,输入接口也按固定窗口设计,并不能直接做流式识别。
第三,静音、噪声与低资源语言仍可能失败。
无语音 token、阈值过滤和温度回退只能解决部分问题,不能保证消灭幻觉,低资源语言的训练数据不足。
7.3 五档原始模型
| 模型 | Encoder / decoder 层数 | 宽度 d | 注意力头数 | 总参数量 |
|---|---|---|---|---|
| Tiny | 4 / 4 | 384 | 6 | 39M |
| Base | 6 / 6 | 512 | 8 | 74M |
| Small | 12 / 12 | 768 | 12 | 244M |
| Medium | 24 / 24 | 1024 | 16 | 769M |
| Large | 32 / 32 | 1280 | 20 | 1550M |
总结
Whisper 算法如下
收集并清洗大规模音频—字幕对
↓
波形 → log-mel → 两层卷积 → 双向 encoder
↓
decoder 用 self-attention 读前缀,用 cross-attention 读音频
↓
把语言、任务、时间戳、正文统一成下一 token 预测
↓
训练:真实前缀 + 因果掩蔽 + 交叉熵
推理:任务前缀 + 自回归搜索 + 格式约束
↓
长录音:解析已完成片段,结合时间戳移动窗口,并管理历史文本
它的关键不在于发明一种全新的注意力或损失,而在于让数据、序列协议、标准模型与实际解码流程配合起来,用规模和多样性学习可泛化的音频到文本映射,用统一输出形式承载多种任务。
632

被折叠的 条评论
为什么被折叠?



