【ASR】Whisper:Robust Speech Recognition via Large-Scale Weak Supervision

前言

相比 wav2vec 2.0HuBERTWavLM 等自监督模型。Whisper(Radford et al.,OpenAI,2022)的想法是,互联网已经有大量音频、字幕对,能不能接受标签不够精确,以更大的规模和更多样的来源,直接训练一个能转写、能翻译的模型?

它采用的方法是,68 万小时弱监督数据 + 一个标准的 encoder-decoder Transformer + 统一的下一 token 预测。

重点理解下面 5 个问题:

  1. 一段声音怎样变成 encoder 的 1500 个向量?
  2. Decoder 不是简单的文字续写,它如何利用音频信息?
  3. 语言、任务、文字和时间戳,怎么共用一个交叉熵损失?
  4. 训练时一次算出所有位置,推理时为什么必须逐步生成?
  5. 模型一次只处理 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θ(YX,c)=n=1Npθ(yny<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(k1)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()))

对应三步:

  1. Masked self-attention:读已知前缀。
  2. Cross-attention:按当前需要,从音频表示中取信息。
  3. 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(dh QK)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}. QRN×dh,K,VR1500×dh,QKRN×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= 10210210 ,

取回的音频信息就是加权和

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} znRd,词嵌入矩阵为 E ∈ R ∣ V ∣ × d E\in\mathbb{R}^{|\mathcal{V}|\times d} ERV×d。官方实现共享输入词嵌入与输出投影权重,

ℓ n = E z n ∈ R ∣ V ∣ , \ell_n=Ez_n\in\mathbb{R}^{|\mathcal{V}|}, n=EznRV

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=vy<n,H,c)=uVexp(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

下文用 SOTEOT 简写起止标记。论文示意图中的 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=nmn1nmnlogpθ(yny<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.8026.40=0.40,30.2026.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 LargeWhisper Large V2相对降错
LibriSpeech test-clean2.72.70.0%
Common Voice29.99.069.9%
TED-LIUM10.54.061.9%
CHiME-665.825.561.2%
AMI IHM37.016.954.3%
AMI SDM167.636.446.2%
原表除 test-clean 外 13 个评测项的平均29.312.855.2%

需要注意表 2 不是控制所有条件后的 encoder 单独比较,wav2vec 2.0 基线是经过 ASR 微调、未接外部语言模型的系统,双方的训练数据、模型规模和 decoder 都不同。所以,不能据此直接断言“Whisper 的每一层特征一定比 WavLM 更适合所有任务”。

7.2 局限

第一,不是天然的说话人日志系统。

原生输出没有稳定的 speaker_0 / speaker_1 身份序列,也没有完成重叠说话人的独立转写。论文发现模型会猜测说话人姓名,因此又在不带说话人标注的子集上短暂微调,抑制这种行为。

第二,不是原生因果流式模型。

Encoder 可以访问当前窗口的未来声音,输入接口也按固定窗口设计,并不能直接做流式识别。

第三,静音、噪声与低资源语言仍可能失败。

无语音 token、阈值过滤和温度回退只能解决部分问题,不能保证消灭幻觉,低资源语言的训练数据不足。

7.3 五档原始模型

模型Encoder / decoder 层数宽度 d注意力头数总参数量
Tiny4 / 4384639M
Base6 / 6512874M
Small12 / 1276812244M
Medium24 / 24102416769M
Large32 / 321280201550M

总结

Whisper 算法如下

收集并清洗大规模音频—字幕对
        ↓
波形 → log-mel → 两层卷积 → 双向 encoder
        ↓
decoder 用 self-attention 读前缀,用 cross-attention 读音频
        ↓
把语言、任务、时间戳、正文统一成下一 token 预测
        ↓
训练:真实前缀 + 因果掩蔽 + 交叉熵
推理:任务前缀 + 自回归搜索 + 格式约束
        ↓
长录音:解析已完成片段,结合时间戳移动窗口,并管理历史文本

它的关键不在于发明一种全新的注意力或损失,而在于让数据、序列协议、标准模型与实际解码流程配合起来,用规模和多样性学习可泛化的音频到文本映射,用统一输出形式承载多种任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值