【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θ(Y∣X,c)=n=1∏Npθ(yn∣y<n,H,c)

即先把声音编码一次,然后每一步同时参考"这段声音"和"前面已经生成的内容",预测下一个 token。

  • H 告诉模型音频里有什么声学证据
  • y < n y_{<n} y<n 和 c 告诉模型现在在做什么任务,已经写到哪里,下一步应该输出什么格式

训练时,语言、任务等 token 本身也会作为预测目标;推理时,它们可以由用户指定,作为已知前缀输入。

1.3 68 万小时组成

论文的数据构成:

text 复制代码
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 层:

text 复制代码
音频波形: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(ℓ)))

对应三步:

  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}. 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) \approx0.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 \approx0.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 项。按互不重叠的类别划分:

text 复制代码
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 秒,完整序列示意为:

text 复制代码
<|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 换任务、换格式

同一段中文音频,三种格式可以写成:

text 复制代码
中文转写,带时间戳:
SOT <|zh|> <|transcribe|> <|0.30|> 你好 <|0.92|> EOT

中文转写,不带时间戳:
SOT <|zh|> <|transcribe|> <|notimestamps|> 你好 EOT

翻译为英语,不带时间戳:
SOT <|zh|> <|translate|> <|notimestamps|> Hello EOT

翻译时仍然用 <|zh|>,因为它标记的是源音频语言;原论文这里的语音翻译目标是英语,不是任意目标语言互译。

训练时模型学习完整序列的分布;实际使用时,用户可以指定语言、任务与格式,模型在这个前缀后继续生成。

所以,"训练过预测 <|translate|>"不等于"模型会自动知道用户今天想要翻译,而不是转写"。任务选择仍然需要明确输入。

4.4 无语音

无语音分支的关键预测关系是:

text 复制代码
有语音: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 历史文本怎样进入下一窗

如果启用上下文条件,形式是

text 复制代码
<|startofprev|> 上一窗的部分文字 SOT <|zh|> <|transcribe|> ...

模型可以参考前文处理术语、指代和上下句衔接。训练时提供的历史是真实转写文本,推理时通常变成先前的识别结果。

历史文本、任务前缀和新生成内容会共同占用 decoder 的上下文。原始模型的文本上下文长度是 448 个位置

至此,Whisper 的"多任务"可以概括成一句话:

把不同任务的条件和答案写成同一种序列协议,再让同一个 decoder 学习这个协议。


五、训练

5.1 Teacher forcing:输入与标签必须错开一位

仍用"你好"的完整序列:

text 复制代码
SOT  <zh>  <transcribe>  <0.30>  你  好  <0.92>  EOT

其中 <zh><transcribe> 等为缩写。构造一组等长的输入与标签:

text 复制代码
位置:       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,再把它接回前缀:

text 复制代码
训练:真实完整序列 → 右移与因果掩蔽 → 一次前向计算所有位置
推理:已有前缀     → 生成一个 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,但依然参与注意力计算。

例如历史文本"上一句"作为条件:

text 复制代码
完整输入条件:<|startofprev|> 上一句 SOT <zh> <transcribe> ...
损失处理:             历史区域忽略     当前任务序列参与预测
注意力处理:             历史仍可被后续位置读取

六、解码

6.1 单窗口解码

一次常规解码尝试可以概括为:

text 复制代码
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 则随生成逐渐增长。

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。

因此,典型多段结果是:

text 复制代码
<|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 秒设计。长录音的处理发生在模型外层的转写循环中:

text 复制代码
取当前窗口 → 编码与解码 → 解析字幕及时间戳 → 更新音频起点 → 处理下一窗
                                     │
                                     └→ 可把已确认文字作为下一窗的文本条件

新窗口会重新编码自己的音频。传递历史文字。

举个例子。第一窗从绝对时间 0 秒开始,范围为 [0.00,30.00]

text 复制代码
<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

所以它可以被输出为

text 复制代码
第二窗中的片段:<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 算法如下

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

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

相关推荐
MicrosoftReactor1 小时前
技术速递|如何在不牺牲任务质量的前提下,让 AI 编码更具成本效益
人工智能·ai·github·copilot
陕西企来客1 小时前
2026年9月企来客科技GEO优化实战指南与本地落地方法
人工智能·科技·企来客科技geo优化
手写码匠1 小时前
DeepSeek 函数调用实战:从零搭建一个会“动手“的 AI 助手
人工智能·深度学习·算法·aigc
百度Geek说1 小时前
都在开源 Harness,Codex 和 DeepSeek 到底有什么不一样?
人工智能
科研小牛马1 小时前
北航何静:AI时代,热门专业十年后怎么样了
人工智能
weixin_446260851 小时前
JarvisGUI:面向跨设备GUI智能体的动态任务组合评测基准
人工智能
Splashtop高性能远程控制软件2 小时前
AI 辅助端点运维先接手补丁分级、合规可视和同台处置
运维·网络·人工智能·自动化·远程工作·splashtop
Yanjun2i2 小时前
Agent学习记录四:多工具时如何处理
人工智能·python·学习·agent
creator_Li2 小时前
深度学习 学习笔记
pytorch·深度学习