Alec Radford, Jong Wook Kim, Tao Xu, Greg Brockman, Christine McLeavey, Ilya Sutskever (OpenAI) — arXiv:2212.04356, December 2022

Robust Speech Recognition via Large-Scale Weak Supervision

A completely ordinary encoder–decoder transformer, fed 680,000 hours of the messy, mislabelled, machine-transcribed internet, ends up more robust than every specialist trained on clean data — and roughly as robust as a professional human transcriber. This lesson rebuilds the argument number by number.

Prerequisites: the Whisper gleam (sound → spectrogram → transformer, at intuition level) + self-supervised speech. Everything paper-grade is rebuilt here from zero.
10
Chapters
20
Interactive Sims
680k
Hours of Supervision
55.2%
Relative Error Reduction

Chapter 0: The Machine That Was Superhuman and Also Terrible

In 2015 the Deep Speech 2 team measured something that felt like a finish line. On the LibriSpeech test-clean split — audiobooks, read aloud, clean microphones — their system reached a word error rate of 5.3%. They also paid humans to transcribe the same audio. The humans got 5.8%.

The machine had won. And the authors wrote down the natural conclusion: "Given this result, we suspect that there is little room for a generic speech system to further improve on clean read speech without further domain adaptation."

Seven years later, the state of the art on that same split was 1.4% (Zhang et al., 2021). Not a small correction — a further 73% relative drop, to a quarter of the human error rate. The finish line was not a finish line.

Here is the part that should bother you. Over those same seven years, if you took one of those record-breaking LibriSpeech models and pointed it at a phone call, a pub, a meeting room, or an African American English interview, it made roughly twice as many errors as a human. Superhuman on the benchmark. Comfortably subhuman in a restaurant.

The question this entire paper is an answer to: what explains the gap between reportedly superhuman performance in-distribution and subhuman performance out-of-distribution? Note that this is not a question about model capacity, architecture, or optimisation. Every candidate answer in this lesson is about what the model was trained on.

Two tests wearing the same clothes

The paper's diagnosis is disarmingly simple, and once you see it you cannot unsee it. When a human and a machine are handed the same test set, they are not taking the same test.

A human transcriber has never heard the specific LibriSpeech audiobooks, has never been shown the dataset's transcript conventions, has no idea whether the corpus prefers "okay" or "OK". Their score measures out-of-distribution generalisation: how well a general listening skill transfers to a distribution they have never seen.

A machine learning model, by the usual protocol, has been trained on hundreds of hours drawn from exactly that distribution — same recording chain, same speakers' reading style, same normalisation of numbers and contractions. Its score measures in-distribution generalisation: how well it interpolates within a distribution it has thoroughly memorised the shape of.

Same audio, same reference transcripts, same metric. Two different abilities. Averaging them into a single leaderboard number, and then declaring "superhuman", conflates the two.

What the human score measures
A general listening skill, applied cold to a distribution never seen during "training". Out-of-distribution.
↓ scored on the identical test set
What the fine-tuned machine score measures
Interpolation inside a distribution that supplied hundreds of hours of matched supervision. In-distribution.
↓ therefore
"Superhuman" is not a comparable claim
Unless the machine is also evaluated cold. Which is exactly what zero-shot evaluation does.

Fine-tuning as benchmark overfitting

Why would training on the evaluation distribution be actively harmful to generalisation, rather than merely uninformative about it? Because gradient descent is an extraordinarily effective pattern finder, and a dataset is full of patterns that are true of the dataset and false of the world.

Geirhos et al. (2020) named this shortcut learning: a model that can hit the target using a spurious regularity will use it, because the spurious regularity is often easier to fit than the real thing. In speech, the shortcuts are everywhere — the recording chain's frequency response, one narrow reading style, a fixed vocabulary of names, a house convention for writing numbers.

The most alarming published demonstration is not even in speech. The CLIP paper (Radford et al., 2021) fine-tuned a vision model on ImageNet and measured a 9.2 percentage-point increase in ImageNet accuracy. On seven other natural-image datasets containing the same object categories, the average accuracy did not improve at all. The whole 9.2 points went into ImageNet-specific quirks.

Read that result again, slowly. The fine-tuning did not fail. It produced a genuine, reproducible, statistically solid improvement — on one dataset. Every point of it was dataset-specific. If your only instrument is held-out data from the training distribution, this failure mode is completely invisible. It looks exactly like progress.

Now transplant that to speech, where the deployment story makes the problem worse. The recommended protocol for the strongest self-supervised encoders of the era — wav2vec 2.0 and its descendants — was: pre-train on unlabelled audio, then fine-tune a decoder on your deployment distribution. Every new domain means new labelled audio, a new fine-tuning run, and a skilled practitioner to do it.

That protocol has two costs. The obvious one is friction: you cannot ship a system that requires a machine learning engineer per customer. The subtle one is the CLIP failure mode: each fine-tune buys in-distribution performance that looks like robustness on your own held-out split and is not.

Why the unsupervised encoders needed fine-tuning at all

It is worth being precise about the technical gap, because it explains what Whisper actually changes. Self-supervised methods such as wav2vec 2.0 learn from raw audio with no human labels, which is why they scaled to 1,000,000 hours of unlabelled speech while academic supervised corpora sat at around 1,000 hours.

What they learn is a very good encoder: a map from waveform to a representation in which phonetic structure is linearly accessible. What they do not learn is a decoder: nothing in the objective ever forces the model to emit English text, with spelling, punctuation and capitalisation. The supervision for "what does this sound spell?" simply is not present.

So a fine-tuning stage is not an optional polish step. It is the only place a decoder exists at all. And because the fine-tuning data is by construction a single narrow distribution, the decoder you get is a specialist — grafted onto a general encoder.

ApproachEncoder qualityDecoderData scaleDeployment
Supervised on one corpusLimited by corpusTrained, narrow~1,000 hWorks on its own turf
Multi-corpus supervised (SpeechStew)BetterTrained, broader5,140 hMore robust, still small
Self-supervised (wav2vec 2.0 line)ExcellentAbsent — must be fine-tunedup to 1,000,000 h unlabelledNeeds a per-domain fine-tune
WhisperGood enoughTrained at the same scale as the encoder680,000 h weakly labelledOut of the box, zero-shot

The last row is the entire thesis in one line: give the decoder the same scale treatment the encoder already got. Nothing else in Whisper is novel, and the authors say so explicitly — they deliberately chose an off-the-shelf architecture "to avoid confounding our findings with model improvements."

Watch the failure mode happen

The simulation below is the argument in motion. On the left is the specialist story: pour supervision from the benchmark's own distribution into a model and watch its in-distribution error collapse while its out-of-distribution error refuses to move. On the right is where zero-shot Whisper lands.

The endpoints are the paper's real numbers. In-distribution runs from Deep Speech 2's 5.3 down to the 1.4 state of the art; the human reference on that split is 5.8. The out-of-distribution axis is the average across the twelve other academic datasets the paper evaluates on, where the best benchmarked supervised LibriSpeech model averages 29.3 and zero-shot Whisper Large-V2 averages 12.8.

Sim 1 · The specialist trap — supervision in, robustness out

Drag the supervision dial. The teal curve is error on the benchmark's own distribution (LibriSpeech test-clean). The orange curve is average error on twelve other datasets. Watch the two diverge: every unit of benchmark supervision buys in-distribution accuracy and almost nothing else. The dashed markers are the human reference and zero-shot Whisper.

LibriSpeech supervision poured in0.15

Three things to notice while you drag:

  1. The teal curve crosses the human line early and keeps going. That crossing is the "superhuman" headline, and it is real — it is just a statement about one distribution.
  2. The orange curve barely moves. Nothing about the extra supervision generalises, because the extra supervision only ever described one distribution more precisely.
  3. Whisper's pair of markers sits at an unremarkable in-distribution error and a dramatically lower out-of-distribution error. It never wins the leaderboard it is being compared on. That is the point.
The concrete number to hold onto. Take the supervised LibriSpeech model whose test-clean WER is closest to Whisper's — wav2vec 2.0 Large without a language model. Both sit at 2.7 on LibriSpeech Clean, within 0.1 of each other. On the other twelve datasets the supervised model averages 29.3 and Whisper averages 12.8. Identical on the reference distribution; less than half the errors everywhere else. Chapter 5 derives the 55.2% figure the paper reports from this table, by hand.

What the out-of-distribution axis actually contains

"Twelve other datasets" is abstract, and the abstraction hides the point. Each of those datasets is a specific way the world differs from an audiobook. Here is the suite, with what each one stresses — because the argument only lands once you can picture the audio.

DatasetWhat the audio isWhat it stresses
LibriSpeech test-clean / test-otherRead audiobooks, clean and harder splitsThe reference distribution itself
TED-LIUM 3TED talksRehearsed public speaking, applause, stage acoustics
Common Voice 5.1Crowdsourced read sentences, worldwide accentsAccent and microphone diversity
Artie bias corpusA demographic-bias subset of Common VoiceWhether errors are distributed fairly across speakers
CallHome / SwitchboardTelephone conversationsNarrow-band audio, overlapping natural speech, contractions
WSJRead Wall Street Journal textDense numerals, financial terminology
CORAALInterviews from the Corpus of Regional African American LanguageA dialect badly served by most training corpora
CHiME-6Dinner-party recordings, multiple speakers, real roomsThe hardest realistic condition in the suite
AMI-IHM / AMI-SDM1Meetings, head-worn microphone versus a single distant microphoneThe exact same speech at two microphone distances
VoxPopuli (English)European Parliament recordingsFormal register, non-native English, chamber acoustics
Fleurs (English)Read parallel sentences, many-language corpusA controlled multilingual reference

Look at the AMI pair in particular. AMI-IHM and AMI-SDM1 are the same meetings, recorded by a head-worn microphone and by a single distant microphone in the middle of the table. Nothing about the language, speakers or content changes — only the acoustics. In Chapter 5's Table 2 the supervised model goes from 37.0 to 67.6 across that pair; Whisper goes from 16.9 to 36.4. Both degrade, because a distant microphone is genuinely harder. One degrades from a much better starting point.

A second thing to notice: CORAAL and Artie are in the suite deliberately. Robustness is not only an engineering property. A system whose errors concentrate on particular dialects and demographics is unreliable in a way that an average number hides, which is why the FairSpeech project's normaliser turns up as a control in Chapter 5.

Making the numbers concrete

Word error rates are percentages, and percentages are easy to nod at without feeling. Convert them.

A WER of 5.3% means about 5 wrong words in every 100 — roughly one error per two sentences of ordinary speech. A WER of 1.4% is about one error every seven sentences. A WER of 29.3% — the supervised model's out-of-distribution average — is nearly three wrong words in every ten. That is not a transcript with mistakes in it; that is a transcript you cannot trust to read.

And 12.8%? Between one and two wrong words per sentence. Still imperfect, still obviously worse than the 2.7 it scores on audiobooks, but the difference between "needs correction" and "needs rewriting".

Why this framing matters for the rest of the lesson. The gap being argued about is not a leaderboard nicety. It is the gap between a system that works in the room you are standing in and one that does not. Every chapter from here is in service of moving 29.3 to 12.8 without touching the 2.7 — and the whole point is that you cannot get there by optimising the 2.7 harder.

What "zero-shot" means here, precisely

Because the word gets used loosely, pin it down now. When the paper evaluates Whisper on TED-LIUM 3 or CHiME-6 or CORAAL, it uses none of that dataset's training split. No fine-tuning, no adapters, no prompt tuning on in-domain examples, no per-dataset decoding hyper-parameters. The model that transcribes CHiME-6 dinner-party audio is byte-identical to the one that transcribes an audiobook.

That is a much stronger claim than "we did not train on the test set". It means the evaluation is measuring the same thing the human evaluation measures: transfer to a distribution never seen during training.

It also means the comparison is deliberately unfair to Whisper on any single benchmark, which is why you should expect — and will find — that Whisper loses to specialists on their home turf. Chapter 5 shows it losing on VoxPopuli. Chapter 8 shows it losing at language identification. Those losses are load-bearing evidence, not embarrassments.

TermWorking definitionFirst used
WERWord error rate: (substitutions + deletions + insertions) divided by reference length. Derived by hand in Ch 5.Ch 0
Weak supervisionReal (audio, transcript) pairs where the transcript was never human-validated for this purpose. Noisy labels, at enormous scale.Ch 1
Zero-shot transferEvaluation on a dataset none of whose training data the model ever saw, with no per-dataset adaptation of any kind.Ch 0
Effective robustnessHow much better a model does out-of-distribution than its in-distribution score predicts. Formalised in Ch 5.Ch 5
Multitask token formatThe decoder prefix that turns one model into transcriber, translator, language ID and voice activity detector. The showcase of Ch 4.Ch 4

The shape of the argument ahead

Everything from here is the construction of a system that is measured the way a human is measured, and the evidence that it survives that measurement.

Ch 1–2 — buy diversity, then clean it
Why 680,000 weakly labelled hours beat 5,140 gold ones, and the unglamorous filtering pipeline that makes weak labels usable at all.
Ch 3–4 — the deliberately boring model
An off-the-shelf encoder–decoder on 80-bin log-mel, and the token format that makes one set of weights do five jobs.
Ch 5–6 — the evidence
Effective robustness, noise curves, the human comparison, and what happens as models and datasets grow.
Ch 7–9 — the parts that are held together with tape
Long-form decoding heuristics, honest failure modes, and where the line leads next.

This diagnosis is older than deep learning

It would be easy to read Chapter 0 as a 2022 observation about speech. It is not. Torralba and Efros made the same argument in 2011, in a paper called "Unbiased look at dataset bias", and the demonstration was brutally simple: train a classifier to predict which dataset an image came from, and find that it works far better than it should. The datasets had fingerprints.

The finding has been rediscovered continuously since — in reading comprehension, in object recognition under unusual poses, in the ImageNet-v2 replication study, in question answering. The paper's related-work section lists them, and the pattern is always identical: strong in-distribution numbers, weak transfer, and a community that measured only the first.

What is different here is the remedy on offer. Most of that literature diagnoses the problem and proposes better evaluation. Whisper proposes a training answer: if the model has seen enough distributions, the notion of "which dataset is this" stops being informative, and there is no fingerprint left to exploit.

What would have falsified all of this

Keep score as you read the later chapters. The argument has several joints where it could have broken:

Notice how many of those are controls the authors ran on themselves. That is the actual reason to trust the result.

One reading habit will pay for itself throughout: whenever a number appears, ask what is it being compared against, and were both measured the same way? That question is the entire paper.

A LibriSpeech-trained model reaches 1.4% WER on LibriSpeech test-clean, well below the 5.8% human error rate on the same split. Why does the paper refuse to call this superhuman speech recognition?
CLIP's fine-tuning experiment found a 9.2 point ImageNet accuracy gain with zero average gain on seven other datasets containing the same object classes. What does that tell you about held-out validation?

Chapter 1: The 680,000-Hour Bet

Chapter 0 left us with a diagnosis: models trained on one distribution learn that distribution, not the task. The obvious prescription follows immediately — train on many distributions at once.

This is not a new idea, and the paper is careful to credit it. Narayanan et al. (2018), Likhomanenko et al. (2020) and Chan et al. (2021) all showed that supervised training across many datasets and domains produces systems that generalise far better to held-out datasets than single-source training. SpeechStew (Chan et al., 2021) simply mixed seven existing corpora together, totalling 5,140 hours, and got a more robust model for free.

So why is the field not done? Because of a wall you hit almost immediately: there is only a moderate amount of gold-standard supervised speech data in existence. You can mix every high-quality corpus humanity has published and you are still at five thousand hours. Meanwhile the unsupervised line had already scaled to a million.

The constraint that shapes everything. Human-validated transcripts do not scale, because a human has to listen to every hour. Anything that scales to hundreds of thousands of hours must accept transcripts nobody validated for this purpose. The design question is therefore not "how do we get more gold data" but "how noisy can labels be before they stop teaching?"

The quality–quantity dial

Once you accept that, the field's history becomes one dial with two ends. At one end: small, perfect, hand-checked. At the other: enormous, unlabelled, and free.

Two efforts had already started moving along it. GigaSpeech (Chen et al., 2021) reached 10,000 hours and The People's Speech (Galvez et al., 2021) reached 30,000 hours, both by relaxing the gold-standard requirement and building sophisticated automated pipelines to produce usable-if-noisy transcripts.

The paper's own framing of this is worth quoting in spirit: this trade-off between quality and quantity is often the right call. Not always. Often. Chapter 2 is about the machinery that decides which of the two it is on any given hour of audio.

And there was a precedent from a neighbouring field. In vision, Mahajan et al. (2018) trained on billions of Instagram images labelled only by their hashtags, and Kolesnikov et al. (2020) built Big Transfer on similarly weak web-scale labels. Both found the same thing: moving beyond gold-standard crowdsourced datasets to much larger but weakly supervised ones significantly improves robustness and generalisation. Speech had simply not tried it at scale.

Sim 2 · The supervision ladder — every scale the field has stood on

A log-scale number line of training-set sizes, coloured by label type: green = human-validated gold, orange = weakly supervised (real transcripts, unvalidated), blue = unlabelled. Drag the marker across five orders of magnitude and read what each rung bought. Whisper's rung is the first weakly supervised one past 100,000 hours.

position on the ladder0.93

Look at where the colours sit. Everything green stops before 10,000 hours. Everything blue is enormous but carries no transcript at all, which is precisely why it needs a fine-tuned decoder bolted on afterwards. The orange band in between is the region Whisper decided to occupy, and it pushed it an order of magnitude further than anyone had.

What 680,000 hours actually contains

"680,000 hours" is a headline. The composition is where the design decisions live, and the paper gives it precisely in Appendix E. Three streams:

StreamHoursShareWhat it teaches
English speech recognition438,21865%English audio → English text, the bulk task
Multilingual speech recognition117,11317%X audio → X text, across 96 other languages
X→English translation125,73918%X audio → English text, a genuinely different task
Total681,070100%

Do the addition yourself: 438,218 + 117,113 + 125,739 = 681,070. That is not a coincidence — it is exactly the largest row of the dataset-scaling table in Section 4.2. The abstract's "680,000 hours" is that number, rounded. Small checks like this are worth doing; they tell you which numbers in a paper are the same number.

Sim 3 · The composition of the pile

The three streams as a stacked bar, with the per-language distribution underneath. Switch streams to see how brutally skewed the language tail is: the top language has tens of thousands of hours, the bottom ones have fractions of an hour. Chapter 6 turns this skew into a prediction.

Two features of that distribution matter later. First, it is a straight line on a log axis over four orders of magnitude — a textbook long tail. Second, the ordering is not the ordering of world languages by speaker count; it is the ordering of English-centric parts of the internet by how much of each language happens to be sitting there with a transcript.

The paper says this plainly in its limitations: the pre-training dataset is "very English-heavy due to biases of our data collection pipeline". Most languages get under 1,000 hours. Hold that thought — in Chapter 6 it becomes a quantitative prediction of per-language word error rate, and in Chapter 8 it becomes an honest admission.

A translation stream is a strange thing to find in a speech recogniser. Notice that 18% of the pile is audio in one language paired with text in another. Nobody set out to collect that; it fell out of the filtering rule you will meet in Chapter 2 — when the spoken language and the transcript language disagree and the transcript is English, the pair is reclassified as a translation example instead of being thrown away. A data-cleaning rule accidentally created a state-of-the-art speech translation system. Chapter 5 has the BLEU scores.

How big is 680,000 hours, really?

Numbers this large stop meaning anything, so anchor them. A year is 8,760 hours.

680,000 ÷ 8,760 = 77.6 years of continuous, unbroken audio

Played end to end without pause, the training set outlives the person who started it. Put it on a human schedule instead — someone listening attentively eight hours a day, every single day:

680,000 ÷ (8 × 365) = 680,000 ÷ 2,920 = 233 years

Compare that to a 1,000-hour academic corpus, which is four months of eight-hour days, or SpeechStew's 5,140 hours, which is under two years. And compare it to a human child, who reaches fluent listening comprehension on something in the low tens of thousands of hours of speech — considerably less than Whisper, spread over a decade, with a body attached and a caregiver pointing at things.

Two lessons hide in that comparison. Whisper is not data-efficient by human standards; it needs an order of magnitude more listening than a child to reach worse comprehension. But it is doing something a child does not: covering 99 languages, thousands of recording conditions, and every register from parliamentary debate to a podcast recorded in a car.

Cost as a design constraint, briefly. Chapter 3's hyper-parameters imply roughly 268 million thirty-second segments processed during training, which is around 2.2 million hours of audio pushed through the model — more than three passes over the entire dataset. The reason this project was possible in 2022 and not 2018 is not an algorithmic insight; it is that the encoder is 1,500 tokens long, the decoder targets are short, and the whole thing fits comfortably in the FP16 data-parallel training regime that had just become routine.

The other bet: predict the raw text

There is a second, quieter decision in this chapter that shapes the whole system. Classical speech pipelines predict a normalised, restricted output — often lowercase, unpunctuated, numbers spelled out — and then run a separate inverse text normalisation stage to turn "twenty three dollars" into "$23", to add capitals, and to insert punctuation.

Whisper does not. It trains to predict the raw text of transcripts without any significant standardisation, relying on the expressiveness of sequence-to-sequence models to learn the mapping from utterance to written form directly.

This is a real engineering trade, so weigh both sides:

Predict normalised text + ITN stagePredict raw text (Whisper)
Output spaceSmall, restricted grapheme setAny UTF-8 string
Punctuation, casingRule-based, bolted on afterwardsLearned, in-model, context-sensitive
System complexityTwo components to build and maintainOne
Label noise toleranceNormalisation hides transcript style noiseStyle noise goes straight into the target
EvaluationReference and hypothesis already share a styleNeeds a normaliser at eval time (Ch 5)

The last row is the bill for this decision, and the paper pays it in Section 4.4: because Whisper emits naturalistic text and each benchmark has its own house style, raw WER punishes it for differences a human would call irrelevant. Chapter 5 shows exactly how much — and how the authors checked they had not cheated by writing a normaliser that flatters their own model.

What Whisper deliberately does not do

Given the era, the omissions are as informative as the inclusions. There is no unsupervised pre-training. No self-training or pseudo-labelling loop. No consistency regularisation. No novel architecture. No data augmentation or regularisation at all in the original models — the authors rely on "the diversity contained within such a large dataset to encourage generalisation and robustness".

The claim being tested is therefore unusually clean: hold everything else fixed and turn only the supervision dial. If robustness appears, it is attributable to scale and diversity of supervision, not to a clever trick.

How this idea was probably found. Two of the six authors are Radford and Kim, who a year earlier had written CLIP — a model whose entire thesis is that noisy web-scale (image, text) pairs beat curated labels for robustness, and whose paper contains the 9.2-point ImageNet result from Chapter 0. Whisper reads like the same hypothesis carried, almost mechanically, into a new modality: swap images for audio, alt-text for transcripts, and check whether the robustness story replicates. It does. The acknowledgements even credit "the conversation on the waterfall hike that inspired this project".

The bet stated as a falsifiable claim

Before moving on, write the bet down in a form that could have failed:

Hypothesis
A vanilla encoder–decoder trained on 680k hours of noisy internet (audio, transcript) pairs will transfer zero-shot to unseen datasets better than specialists trained on gold data from those datasets.
↓ would have been falsified if…
Failure mode A — noise floor
Performance saturates at the quality level of the noisy labels, far below human. Tested in Ch 6 by scaling the dataset and watching for a ceiling.
↓ or if…
Failure mode B — negative transfer
Cramming 99 languages and 2 tasks into one set of weights makes each worse than a dedicated model. Tested in Ch 6, and it does happen — below a compute threshold.
↓ neither happened, so…
Conclusion
"Simple scaling of weakly supervised pre-training has been underappreciated so far for speech recognition."

Notice that both failure modes are empirical questions with numbers attached, and the paper measures both rather than asserting them away. That is why Chapter 6 exists.

SpeechStew mixed seven corpora into 5,140 hours and got a more robust model. Why did the field not simply keep doing that?
Whisper trains on raw, unstandardised transcript text rather than a normalised output form. What does this buy, and what does it cost?

Chapter 2: The Unglamorous 80% — Building the Pile

Papers get remembered for their architectures. Whisper's architecture is a 2017 transformer with two convolutions in front of it, and the authors chose it precisely because it is unremarkable. If you want to know what actually made Whisper work, you are reading the right chapter.

Start from the raw material: audio paired with transcripts, harvested from the internet. That gives you enormous diversity of recording environments, microphones, speakers, accents, languages, background noise. Diversity in audio is exactly what you want — it is the thing Chapter 0 said the specialists lacked.

But the same harvest gives you diversity in transcript quality, and that is not similarly beneficial. The paper's understated sentence is: "Initial inspection showed a large amount of subpar transcripts in the raw dataset."

The asymmetry that organises this whole chapter. Noise on the input side (bad microphones, reverberant rooms, crosstalk) is training signal: it teaches robustness. Noise on the output side (wrong words, machine artefacts, misalignment) is corruption: it teaches the model to produce garbage. So the pipeline's job is to preserve every kind of audio diversity while ruthlessly filtering label diversity.

Filter 1 — do not learn "transcript-ese"

A large fraction of transcripts on the internet were never typed by a human. They are the output of some other ASR system, uploaded as captions. Training on them sounds harmless — more data is more data — and it is not.

Ghorbani et al. (2021) had already shown, for translation, that training on a mixture of human and machine-generated data significantly impairs the resulting system. The mechanism is straightforward: you are no longer learning "what did this person say", you are learning "what would that other model have written", including all of its systematic mistakes and, worse, its systematic omissions.

So the authors built heuristics to detect and remove machine-generated transcripts. Every one of them keys on the same underlying fact: existing ASR systems output only a restricted subset of written language. They remove or normalise away exactly the things that are hard to predict from audio alone.

Signal in the transcriptWhy it betrays a machine
Entirely uppercase, or entirely lowercaseA human typing a transcript uses sentence case. A system that never learned casing emits one register for everything.
No commas anywhere, across a long transcriptComma placement depends on syntax, not sound. Many systems simply never emit one; the absence is detectable over enough text.
No exclamation marks or question marksComplex punctuation encodes prosody plus intent. Rule-based inverse text normalisation rarely attempts it.
No paragraph or formatting whitespaceLayout is a document-level human decision with no acoustic correlate at all.
Partial inverse text normalisationSome systems do handle numbers and currency — but the handling is simple and rule-based, and the unhandled aspects give the game away.

Notice the shape of the argument. Each individual signal is weak — a human might well write an all-lowercase note. The heuristics work because the things machines cannot predict from audio are correlated: a transcript missing all of them at once is overwhelmingly likely to be machine output.

Concept → realisation. The signals share a single generative story: information present in written text but absent from the acoustic signal. Casing, commas, paragraph breaks, "$68 million" versus "sixty-eight million dollars" — none of these are audible. So any transcript lacking all of them was probably produced by something that could only hear. This is a filter derived from first principles about the channel, not a bag of ad-hoc string rules.

Filter 2 — does the transcript language match the spoken language?

The second filter is the one with the most interesting consequences. The pipeline runs two independent language detectors:

Audio language detector
A prototype Whisper model, trained on a prototype version of the dataset, then fine-tuned on VoxLingua107 (Valk & Alumäe, 2021). Listens to the audio and names the spoken language.
↓ compare
Text language detector (CLD2)
Reads the transcript and names the written language. Entirely independent of the audio.
↓ three outcomes
Match → keep as transcription. Mismatch → drop. Mismatch and the text is English → keep as X→English translation.
That third branch is where 125,739 hours of translation supervision came from.

Read that third branch again. It is a rescue rule for a failure case, and it accidentally created the training set for a task nobody was targeting. Chapter 5 reports the result: state-of-the-art zero-shot X→English translation, 29.1 BLEU on CoVoST2, beating systems trained directly for it.

It also created a bug. The rule trusts the audio language detector, and detectors are wrong sometimes — systematically, not randomly. Chapter 6 shows the Welsh disaster: thousands of hours of "Welsh translation data" that is actually English audio with English captions, mis-classified as Welsh and therefore routed into the translation stream. The rule that built the feature also poisoned it.

Filter 3 — fuzzy de-duplication

The web repeats itself. The same talk is reposted, the same boilerplate appears under thousands of videos, the same auto-generated description propagates across a channel. The pipeline uses fuzzy de-duping of transcript texts — near-duplicate matching, not exact-string matching — to reduce both duplication and automatically generated content.

Why fuzzy rather than exact? Because the duplicates are rarely byte-identical. A timestamp changes, a channel name is inserted, a sponsor line differs. Exact matching would catch almost none of them.

And why does duplication hurt? Two reasons, worth separating. Duplicated content silently reweights the training distribution toward whatever gets reposted, which is not what you want a robustness argument to rest on. And duplication between train and evaluation quietly inflates your results — which is why the authors additionally performed transcript-level de-duplication between the training set and the evaluation sets they judged to be at highest risk of overlap, naming TED-LIUM 3 specifically.

Segmentation: everything becomes 30 seconds

Now the mechanical step that shapes the entire model. Audio files are broken into 30-second segments, each paired with the subset of the transcript that occurs within that time window.

Three consequences fall out immediately, and all three come back later:

  1. The model's context is permanently 30 seconds. It cannot consume longer audio at once. Chapter 7 is entirely about working around this.
  2. The transcript subsetting depends on the alignment being right. If the caption timings are off, the model is trained to hear one thing and write another — the classic recipe for hallucination.
  3. Sentences get cut in half by window boundaries. Chapter 4's timestamp format has a special rule for exactly this case.

Some arithmetic to make the scale concrete. 680,000 hours is 680,000 × 3,600 = 2,448,000,000 seconds. Divide by 30 and you get roughly 81.6 million thirty-second segments. Each one carries a target sequence of a few dozen tokens. That is the pile.

And a decision that looks like a mistake until you see the purpose: segments with no speech at all are kept, at a reduced sampling rate (the hyper-parameter table gives a 10× subsample factor for speechless audio). Why keep silence and background music in a speech recogniser's training set? Because those segments are the supervision for voice activity detection — the model learns to emit a "no speech here" token instead of inventing words. Chapter 4 shows the token; Chapter 7 shows the decoder threshold that consumes it.

Sim 4 · The filtering bench — route real-looking pairs through the pipeline

Ten candidate (audio, transcript) pairs arrive from the crawl. Toggle each heuristic on or off and watch the destination column change: KEEP as transcription, TRANSLATE, VAD, or DROP. Turn everything off to see what an unfiltered crawl would have fed the model.

Play with one control at a time. Turning off the English-text rescue rule alone converts the translation rows into drops — that single branch is the difference between a monolingual transcriber and a translation system. Turning off the machine-transcript heuristics lets the all-caps, comma-free rows back in, which is how you train a model to write like a 2015 captioning service.

The second pass: use the model to audit its own data

Everything above is a static filter, written before any training. The most interesting step in the pipeline happens after a model exists.

The authors trained an initial model, then aggregated its error rate per training data source. Then they sorted sources by a combination of high error rate and source size, and manually inspected the top of that list.

Why that particular sort key? Because it ranks by expected damage. A source with terrible error rate but two hours of audio cannot hurt you much. A source with terrible error rate and forty thousand hours is a catastrophe. Multiplying the two focuses scarce human attention where a single inspection removes the most bad supervision.

What the inspection found is a useful catalogue of what the static filters miss:

Defect found by manual inspectionWhy the static heuristics missed it
Only partially transcribed audioThe transcript is perfectly human, well punctuated, correctly language-matched. It just stops halfway.
Poorly aligned or misaligned transcriptsText and audio are both fine in isolation; only their timing is wrong, which no text-only heuristic can see.
Remaining machine-generated captionsBetter captioning systems do emit casing and commas. The heuristics have a false-negative rate.
The idea worth stealing from this paper, whatever field you work in. A trained model is a data-quality instrument. Per-source error rate is a cheap, automatic proxy for "how much does this source disagree with everything else I have learned", and sorting by error × size turns an impossible manual audit into a tractable afternoon. This is a general recipe for cleaning any web-scale corpus, and it costs one training run you were going to do anyway.

Notice, too, what this reveals about misalignment specifically. A misaligned transcript is the most dangerous label in the entire pile, because it is fluent, plausible text paired with the wrong audio. Train on enough of that and you teach the model that its job is to produce fluent plausible text regardless of what it hears. Chapter 8's hallucination failure mode is exactly this lesson, learned too well.

Sim 5 · Alignment — why the 30-second window is where labels go wrong

A caption track laid over a 30-second window. Drag the alignment offset and watch which words land inside the window and therefore become the training target. At zero offset the pairing is honest; at a two-second drift the model is being taught to hear words that are no longer in the audio.

caption drift (seconds)0.0
window start (s)0.0

The drift slider is a simulation of a real defect: caption tracks that were authored against a slightly different cut of the video, or that accumulate offset over an hour. At small drift you get one wrong word at each boundary. At large drift the entire target is fiction, and the model's loss is happily minimised by learning to guess plausible sentences.

The pipeline as one diagram

0 · Crawl
Audio paired with transcripts on the internet. Maximal audio diversity, unknown label quality.
1 · Machine-transcript heuristics
Casing, commas, complex punctuation, formatting whitespace, ITN artefacts. Drop suspected ASR output.
2 · Audio LID vs CLD2
Match → transcription. Mismatch → drop, unless the text is English → translation example.
3 · Fuzzy transcript de-dup
Near-duplicate removal, plus transcript-level de-dup against high-risk eval sets (TED-LIUM 3).
4 · Segment into 30 s windows
Pair each window with the transcript subset inside it. Keep speechless windows at 10× subsampling as VAD supervision.
↓ train an initial model ↓
5 · Model-in-the-loop source audit
Per-source error rate × source size, sorted, manually inspected. Remove partial, misaligned and surviving machine transcripts.

Five stages, none of them clever, all of them necessary. The paper spends about one page on this and it is the page that made the other twenty pages possible.

Why does the pipeline route a mismatched pair to the translation stream when the transcript is English, instead of simply discarding it?
The second-pass audit sorts training sources by high error rate combined with source size. Why is size in the sort key at all?
Which defect is the most dangerous for a sequence-to-sequence model, and why?

Chapter 3: The Deliberately Boring Model

Here is a sentence you rarely read in a machine learning paper: "Since the focus of our work is on studying the capabilities of large-scale supervised pre-training for speech recognition, we use an off-the-shelf architecture to avoid confounding our findings with model improvements."

That is a scientific choice, not a lazy one. If you want to attribute a result to supervision scale, you must hold everything else constant — and the only way to hold "architecture" constant is to use one whose behaviour is already understood. So: an encoder–decoder transformer, Vaswani et al. 2017, essentially unmodified.

This chapter traces one thirty-second clip all the way from air pressure to a parameter count you can compute yourself. Every number is either in the paper or derived from numbers that are.

Step 1 — the front end, in exact numbers

All audio is resampled to 16,000 Hz. An 80-channel log-magnitude Mel spectrogram is computed on 25-millisecond windows with a 10-millisecond stride.

Let us turn that into shapes, one arithmetic step at a time. Take a full 30-second segment.

30 s × 16,000 samples/s = 480,000 samples

The analysis window is 25 ms wide, so in samples:

0.025 s × 16,000 = 400 samples per window

The stride (hop) is 10 ms:

0.010 s × 16,000 = 160 samples per hop

With the standard centred-padding convention the number of frames is the signal length divided by the hop:

480,000 ÷ 160 = 3,000 frames

Each frame carries 80 Mel channels, so the tensor entering the network is:

x ∈ R80 × 3000   (Mel channels × time frames)

Sanity-check the compression. We started with 480,000 numbers and now hold 80 × 3,000 = 240,000. Only a factor of two — the spectrogram is not primarily a compression, it is a reorganisation. The win is that the information is now laid out along the axes speech actually varies in.

The normalisation detail almost everyone skips. The paper says the input is globally scaled to lie between −1 and 1 with approximately zero mean across the pre-training dataset. Not per-utterance. That distinction matters: per-utterance normalisation would erase absolute loudness, so a whisper in a quiet room and a shout in a stadium would arrive identical. Global scaling keeps loudness as a real feature — and loudness is exactly the cue that separates speech from background, which the voice-activity-detection task needs.
Sim 6 · Framing arithmetic — window, hop and frame count

Whisper's settings are 25 ms window and 10 ms hop. Drag them and watch the frame count, the overlap and the resulting tensor shape move. Notice that the hop — not the window — sets the frame rate, and that windows deliberately overlap so no transient falls between two frames.

window (ms)25
hop (ms)10

Step 2 — the convolutional stem, and where 20 milliseconds comes from

The encoder does not feed 3,000 frames straight into attention. First comes "a small stem consisting of two convolution layers with a filter width of 3 and the GELU activation function, where the second convolution layer has a stride of two."

LayerInOutKernelStrideShape after
Conv1D + GELU80d31d × 3000
Conv1D + GELUdd32d × 1500
+ sinusoidal position embeddingadded to the stem outputd × 1500

So the encoder attends over 1,500 positions. Divide the segment duration by that:

30 s ÷ 1500 positions = 0.02 s = 20 milliseconds per encoder position

Remember that number. In Chapter 4 the paper writes that timestamps are quantised "to the nearest 20 milliseconds, which matches the native time resolution of Whisper models". This is where that resolution comes from — not a design preference, but the arithmetic consequence of a 10 ms hop followed by one stride-2 convolution.

Why two convolutions at all, rather than a linear projection of frames? Two reasons, both practical. A width-3 kernel lets each output position see a small local neighbourhood in time before any attention happens — cheap local context, exactly what phonetic transitions need. And the stride-2 halves the sequence length before the quadratic-cost attention stack, cutting encoder attention cost by 4×. It is the cheapest possible acknowledgement that audio is locally smooth.

Step 3 — the transformer, and the four small choices inside it

From here it is the standard machine, with four details the paper names explicitly. Each one is a fix for a known problem.

ChoiceWhat it doesWhy
Pre-activation residual blocks (Child et al., 2019)LayerNorm goes before the sublayer, not afterKeeps the residual path an identity, which makes very deep stacks trainable without warmup gymnastics
Final layer normalisation on the encoder outputOne extra LN after the last blockPre-activation stacks leave the output un-normalised; the decoder's cross-attention wants a well-scaled memory
Sinusoidal positions in the encoder, learned in the decoderTwo different position schemes in one modelEncoder length is always exactly 1500, but sinusoidal costs nothing and extrapolates; decoder length varies per example, and learned embeddings fit text position statistics better
Tied input–output token representations (Press & Wolf, 2017)The embedding matrix is reused as the output projectionSaves V × d parameters and ties "what this token means as input" to "what predicting it means" — a large saving when V ≈ 51,865

The encoder and decoder have the same width and the same number of blocks. That symmetry is worth noticing: this is a model that spends as much capacity on writing text as on hearing sound, which is precisely the imbalance Chapter 0 said the self-supervised line suffered from.

Step 4 — the tokenizer

The English-only models use the same byte-level BPE tokenizer as GPT-2. For the multilingual models the vocabulary is refit — retrained on multilingual text — while keeping the same size, "to avoid excessive fragmentation on other languages since the GPT-2 BPE vocabulary is English only."

That phrase, excessive fragmentation, is worth unpacking. A BPE vocabulary fit on English spends its merges on English substrings. Feed it Korean and almost nothing merges, so each character costs several byte-level tokens. Sequences balloon, the effective context shrinks, and per-token loss stops being comparable across languages. Refitting fixes the merges without changing the budget.

Chapter 4 reconstructs the exact vocabulary size from its parts — it is a satisfying piece of arithmetic and it lands exactly on the released number.

Step 5 — the model family, and a parameter formula you can check

ModelLayersWidth dHeadsHead dimParametersMax learning rate
Tiny438466439 M1.5 × 10-3
Base651286474 M1 × 10-3
Small127681264244 M5 × 10-4
Medium2410241664769 M2.5 × 10-4
Large32128020641550 M1.75 × 10-4
Large V232128020641550 M2.0 × 10-4

The head-dimension column is not in the paper — it is width divided by heads. Compute it for every row and you get 64 every single time. That is a deliberate constant: the family scales by adding heads and layers, never by making an individual attention head fatter.

A parameter count, entirely by hand

Let us derive the count for Tiny (L = 4, d = 384) with every intermediate step. Write V for the vocabulary size, 51,865 (reconstructed in Chapter 4).

Encoder block. Self-attention needs four d × d projections — query, key, value, output:

4 × 384 × 384 = 4 × 147,456 = 589,824

The feed-forward network expands to 4d and back, so two matrices of size d × 4d:

2 × 384 × 1536 = 8 × 147,456 = 1,179,648

Encoder block total: 589,824 + 1,179,648 = 1,769,472, which is 12d2. Four of them:

4 × 1,769,472 = 7,077,888

Decoder block. Same as the encoder block plus a cross-attention, which is another four d × d projections:

12d2 + 4d2 = 16d2 = 16 × 147,456 = 2,359,296 per block
4 × 2,359,296 = 9,437,184

Convolutional stem. Kernel width 3, first 80→384, second 384→384:

3 × 80 × 384 = 92,160    and    3 × 384 × 384 = 442,368
92,160 + 442,368 = 534,528

Token embedding (tied, so counted once):

51,865 × 384 = 19,916,160

Decoder learned positions (the released models use a 448-token decoder context):

448 × 384 = 172,032

Encoder positions are sinusoidal and therefore free. Add everything:

7,077,888 + 9,437,184 + 534,528 + 19,916,160 + 172,032 = 37,137,792

So roughly 37.1 M, against the paper's reported 39 M. The missing ~1.9 M is biases and LayerNorm scale/shift vectors, which we ignored, plus rounding. Let us not pretend that is exact — but let us also check whether the method is sound by applying it to the largest model, where the embedding term stops dominating.

Collect the general formula. Per layer, encoder contributes 12d2 and decoder 16d2, so:

P ≈ 28 · L · d2 + V · d + 448 · d + (240d + 3d2)

For Large (L = 32, d = 1280): 28 × 32 × 1,638,400 = 1,468,006,400. The embedding adds 51,865 × 1280 = 66,387,200. Positions add 573,440. The stem adds 3 × 80 × 1280 + 3 × 1280 × 1280 = 307,200 + 4,915,200 = 5,222,400. Total:

1,468,006,400 + 66,387,200 + 573,440 + 5,222,400 = 1,540,189,440 ≈ 1,540 M

The paper reports 1550 M. Our reconstruction is within 0.6%. The formula is right; the small-model discrepancies are the fixed overheads we dropped, which matter proportionally more when d is small.

Sim 7 · Data-flow tracer — shapes and parameters, model by model

Pick a family member and follow one 30-second clip through every stage, with the tensor shape at each arrow. The bar underneath splits the parameter budget into stem, encoder, decoder and embedding — watch the embedding go from dominating Tiny to being a rounding error in Large. That single crossover explains why small speech models are mostly vocabulary.

Step 6 — the same front end in three forms of code

Form one, the arithmetic we just did by hand, for a single frame at time index t:

by hand
frame t covers samples [t*160, t*160 + 400)
apply a 400-point Hann window
take the real FFT  -> 201 complex bins (400/2 + 1)
square the magnitudes -> power in each bin
multiply by the 80 x 201 Mel filterbank -> 80 numbers
take log10, clamp the floor, rescale -> one column of the input

Form two, the same thing step by step in numpy, so nothing is hidden:

python
import numpy as np

SR, N_FFT, HOP, N_MELS = 16000, 400, 160, 80

# mel_filterbank(n_mels, n_fft, sr) -> (80, 201) matrix of triangular
# bands, equally spaced on the Mel (perceptual pitch) scale. The release
# ships this matrix precomputed; librosa.filters.mel gives the same thing.

def log_mel(audio):
    # 1. pad so frame k is centred on sample k*HOP
    x = np.pad(audio, N_FFT // 2, mode="reflect")
    # 2. cut into overlapping frames: (n_frames, 400)
    n_frames = 1 + (len(x) - N_FFT) // HOP
    idx = np.arange(N_FFT)[None, :] + HOP * np.arange(n_frames)[:, None]
    frames = x[idx]
    # 3. window each frame (Hann) to stop spectral leakage at the edges
    frames = frames * np.hanning(N_FFT + 1)[:-1]
    # 4. real FFT -> (n_frames, 201) complex; drop the final frame like the release
    spec = np.fft.rfft(frames, axis=-1)[:-1]
    # 5. power spectrum
    power = np.abs(spec) ** 2
    # 6. project 201 linear bins onto 80 Mel bands: (80, 201) @ (201, T)
    mel = mel_filterbank(N_MELS, N_FFT, SR) @ power.T
    # 7. compress the dynamic range; ears are logarithmic, and so is this
    log_spec = np.log10(np.maximum(mel, 1e-10))
    # 8. floor 80 dB below the peak so silence cannot dominate the scale
    log_spec = np.maximum(log_spec, log_spec.max() - 8.0)
    # 9. map roughly into [-1, 1] — the paper's global scaling
    return (log_spec + 4.0) / 4.0          # -> (80, 3000) for 30 s

Form three, what you actually call:

python
import whisper
mel = whisper.log_mel_spectrogram(whisper.pad_or_trim(audio))   # (80, 3000)

All three produce the same tensor. Read form one when you want to know what a frame is, form two when you want to know what the library does, and form three when you want to get on with your day.

The single most important line above is step 8. Flooring the log spectrogram 80 dB below its own peak makes the representation invariant to the absolute noise floor of the recording. Without it, a hissy 1970s tape and a modern studio recording would live in wildly different numeric ranges and the model would waste capacity learning to compensate. With it, both are normalised to their own dynamic range while step 9 keeps overall loudness meaningful. This is the sort of detail that never appears in an architecture diagram and entirely determines whether a model is robust.

Step 7 — training, and an epoch count you can verify

Hyper-parameterValueNote
Updates1,048,576 (220)Between two and three passes over the dataset, per the paper
Batch size256 segmentsEach segment is 30 s
Warmup2,048 updatesThen linear decay of the learning rate to zero
OptimiserAdamWβ1 = 0.9, β2 = 0.98, ε = 10-6
Weight decay0.1Decoupled, as in AdamW
Max gradient norm1.0Gradient clipping
PrecisionFP16 + dynamic loss scalingPlus activation checkpointing for memory
Augmentation / regularisationNone"Rely on the diversity contained within such a large dataset"
Speechless-audio subsample10×Silence kept, but rarer than speech
Condition on prior text rate50%Half the training examples carry previous-segment context (Ch 4)

Check the epoch claim. Segments seen during training:

256 × 1,048,576 = 268,435,456 segment presentations
268,435,456 × 30 s = 8,053,063,680 s = 2,236,962 hours
2,236,962 ÷ 681,070 = 3.28 passes

The paper says "between two and three passes over the dataset". Our arithmetic gives 3.28, slightly above. The likely explanation is that not every hour of audio yields a full 30-second segment — short files, dropped windows and the 10× subsampling of speechless audio all shrink the effective epoch. Worth flagging rather than papering over: the reconstruction is in the right region, not exact.

Now use the same arithmetic on Large V2, which the paper says was trained for 2.5× more epochs with batch 1024 and 655,360 updates:

1024 × 655,360 = 671,088,640 segments  →  671,088,640 ÷ 268,435,456 = 2.5×

Exactly 2.5. Two independent numbers from a hyper-parameter table reproduce a claim from the prose. That is what it feels like when you have understood a training setup correctly.

Large V2 also adds the regularisation the original models did without: SpecAugment (LibriSpeech Basic policy), Stochastic Depth 0.1, and BPE dropout 0.1. This is the expected consequence of more epochs — once you pass over the data enough times, over-fitting stops being hypothetical.

Where does Whisper's 20-millisecond timestamp resolution come from?
Why does Whisper scale its log-mel input globally across the dataset instead of normalising each utterance to zero mean and unit variance?
Using P ≈ 28·L·d2 + V·d, why does the reconstruction land within 0.6% for Large but ~5% low for Tiny?

Chapter 4: Showcase — One Model, Five Jobs, One Token Sequence

Predicting which words were spoken is only part of what a deployed speech system does. Around the recogniser sits a constellation of other components: voice activity detection to find where speech is, speaker diarization to say who spoke, inverse text normalisation to make the output look like writing, plus language identification and alignment. Each is its own model, its own failure surface, its own thing to maintain.

The paper's ambition is to collapse that stack: "we would like to have a single model perform the entire speech processing pipeline, not just the core recognition part."

Which immediately creates a problem the paper names precisely. The same audio admits many different correct outputs. Given thirty seconds of Spanish, should the model write Spanish, write English, write timestamps, or say "this is Spanish"? All of those are correct. A one-to-many mapping needs some form of task specification.

The key move, and it is a small one. Whisper does not add task heads, adapters, or a routing network. It notes that the decoder is already an autoregressive language model over tokens, and that a language model conditioned on a prefix will produce whatever that prefix implies. So the task specification becomes part of the token sequence. Everything — language, task, output format, prior context — is expressed as special tokens in the decoder prompt. This is the same trick GPT-2 used for NLP tasks, carried into audio.

The sequence, token by token

Here is the full grammar of a training target. Read it top to bottom; every slot has a reason.

#Token(s)RoleTrained on?
0<|startofprev|> + previous text tokensOptional history: the transcript text preceding this audio segmentNo — loss is masked here
1<|startoftranscript|>Marks the beginning of predictionYes
2<|en|><|yue|> (99 tokens)  or  <|nospeech|>Which language is being spoken — or the assertion that nobody is speakingYes
3<|transcribe|> or <|translate|>Same language out, or English outYes
4<|notimestamps|> (present or absent)Output format: plain text, or time-interleavedYes
5text tokens, optionally wrapped in timestamp tokensThe actual contentYes
6<|endoftranscript|>StopYes

Slot 2 is doing double duty and it is worth pausing there. The very first thing the model must predict after the start token is the language. That means language identification is not a separate system — it is one forward pass and one argmax over 99 logits. The paper's language-ID results in Chapter 8 are literally just this token read out.

Slot 2 also holds <|nospeech|>, which is how voice activity detection becomes free. Remember from Chapter 2 that speechless segments were deliberately kept in the training set at 10× subsampling. This is the token they were teaching.

Slot 0 — the previous-text slot — is the subtlest. Because the decoder is an audio-conditional language model, the authors also train it to condition on the transcript history, "in the hope that it will learn to use longer-range text context to resolve ambiguous audio". The hyper-parameter table gives the rate: 50% of training examples carry prior context.

Why mask the loss over the previous context? Because you want the model to read the history, not to reproduce it. If the loss covered those tokens, a large share of the gradient would go into copying text the model was handed for free — easy loss, zero learning about audio. Masking makes the history pure conditioning. The same reasoning is why instruction-tuned language models mask the prompt and train only on the completion.

Reconstructing the vocabulary, exactly

The paper says the GPT-2 byte-level BPE vocabulary is reused and refit at the same size, and that timestamp tokens are added "for each of these" quantised times. Let us count what that implies.

The GPT-2 vocabulary has 50,257 entries.

Timestamps run from the start of the window to its end, quantised to 20 ms:

30.00 s ÷ 0.02 s = 1,500 intervals  →  1,500 + 1 = 1,501 timestamp tokens

The "+1" is the fencepost: you need a token for 0.00 and one for 30.00, because a caption can both begin at the very start and end at the very end. Language tokens number 99. Then the control tokens:

<|startoftranscript|>, <|translate|>, <|transcribe|>, <|nospeech|>, <|notimestamps|>, <|startoflm|>, <|startofprev|>, <|endoftext|>  =  8

Add them all up:

50,257 + 1,501 + 99 + 8 = 51,865

That is exactly the vocabulary size of the released multilingual models. Four numbers, three of which we derived from the text of the paper, landing on the fourth to the unit. When a reconstruction closes like that, you have understood the design rather than memorised it.

Feel the leverage of that 1,501. Adding timestamps to a speech model is usually an architecture project: a separate alignment model, a forced aligner, a CTC head. Whisper adds 1,501 rows to an embedding matrix and lets next-token prediction do the rest. The cost is 1,501 × d parameters — for Large, 1.9 M out of 1,550 M, about 0.12% of the model. Alignment becomes a vocabulary problem.

The showcase: build a sequence and watch the task change

This is the paper's Figure 1, made interactive. Choose what goes in each slot and watch two things update: the exact token sequence the decoder is prompted with, and which of the paper's five task rows you have just selected.

Sim 8 · The multitask token-format builder — the paper's Figure 1, live

The audio is fixed: thirty seconds of a Spanish speaker saying "el rápido zorro marrón salta sobre el perro perezoso". Only the prompt changes. Flip the task token and the same weights, on the same audio, start writing English. Flip the timestamp token and the output grows time markers. Set no-speech and the model is asserting silence.

Five toggles, five distinct behaviours out of one set of weights. Map them onto the paper's Figure 1 rows:

Task in Figure 1Prefix you buildWhat the model emits
English transcriptionSOT · <|en|> · <|transcribe|>English text for English audio
Non-English transcriptionSOT · <|ko|> · <|transcribe|>Korean text for Korean audio
Any-to-English translationSOT · <|es|> · <|translate|>English text for Spanish audio
Language identificationSOT · let the model choose slot 2The language token itself is the answer
Voice activity detectionSOT · let the model choose slot 2<|nospeech|> when nobody is speaking
Time-aligned transcriptionomit <|notimestamps|>Text interleaved with 20 ms-quantised time tokens

Notice the difference between rows 1–3 and rows 4–5. In the first three you supply the language token to force a behaviour. In the last two you withhold it and read what the model predicts. The same slot is an input when you know the answer and an output when you do not. That duality is the whole reason a single token format can be both a controller and a classifier.

Timestamps: the interleaving rule and its boundary case

When timestamps are on, the format interleaves them with the text: the start time token is predicted before each caption's text, and the end time token after it.

token sequence, timestamps on
<|startoftranscript|> <|en|> <|transcribe|>
  <|0.00|>  The quick brown fox   <|2.44|>
  <|2.44|>  jumps over the lazy   <|5.12|>
  <|5.12|>  dog and keeps going   <|8.06|>
<|endoftranscript|>

Now the boundary case, which is where long-form transcription is born. What happens when the last caption in the window is only partially inside it — the speaker is mid-sentence when the thirty seconds run out?

The paper's rule: predict only the start time token for that segment, and no text. A start time with nothing after it is a message to the decoding loop, and the message is: stop here, and place the next 30-second window at this timestamp. If timestamps are off, the audio is simply truncated so the partial segment is not included at all.

Sim 9 · Timestamp interleaving and the partial-segment rule

Four captions laid across the 30-second window. Drag the last caption so it straddles the boundary and watch the emitted sequence change: a complete caption gets start-text-end, a straddling one gets a lone start token — the instruction that tells the buffered decoder where to place the next window.

last caption start (s)22.0
last caption length (s)5.0

That lone start-time token is a beautifully economical piece of protocol design. The model needs a way to tell the surrounding loop "I ran out of audio mid-sentence, resume from here" — and rather than inventing a side channel, the authors expressed it as a legal, learnable token sequence. The decoding loop in Chapter 7 does nothing more than read that token and slide the window.

What this format does not contain, and why it matters. There is no speaker token, no diarization slot, no channel token. The paper lists diarization as one of the pipeline components it would like to absorb — and then does not absorb it. Chapter 8 shows the consequence: because many web transcripts do contain speaker names, the model learned to guess them, badly, from audio in which the name is simply not present. The fix was a brief fine-tune on transcripts without speaker annotations. A missing slot in the format became a hallucination in the output.

The same format, as code

python
# Building the decoder prompt is literally list concatenation.
sot          = tokenizer.sot                 # <|startoftranscript|>
lang         = tokenizer.to_id("<|es|>")     # one of 99
task         = tokenizer.to_id("<|translate|>")
no_ts        = tokenizer.to_id("<|notimestamps|>")

prompt = [sot, lang, task]
if without_timestamps:
    prompt.append(no_ts)

if prev_text is not None:                # slot 0, loss-masked
    prompt = [tokenizer.sot_prev] + tokenizer.encode(" " + prev_text.strip()) + prompt

# A timestamp token id is a linear function of time — no lookup table needed.
def ts_token(seconds):
    assert 0.0 <= seconds <= 30.0
    return tokenizer.timestamp_begin + round(seconds / 0.02)   # 0 .. 1500

# Decoding is then ordinary autoregressive generation with this prefix.
tokens = model.decode(mel, prompt)

Read ts_token closely. Because the timestamp tokens are contiguous and evenly spaced in the vocabulary, converting a time to a token id is one multiply and one add. The decoder's softmax over those 1,501 ids is, in effect, a discrete distribution over time — a soft alignment, produced by the same machinery that predicts words.

Why is the language slot the second token, immediately after the start-of-transcript token?
The multilingual vocabulary is 51,865 entries. Which decomposition is correct?
A caption begins at 27.4 s and runs past the end of the 30-second window. In timestamp mode, what does the model emit for it?

Chapter 5: Effective Robustness — Measuring the Thing That Matters

We have a model. Chapter 0 argued that the usual way of scoring it is misleading. So before any result, we need two instruments: a metric that measures mistranscription rather than formatting, and a comparison that isolates generalisation rather than memorisation.

Word error rate, entirely by hand

WER is the edit distance between the reference and the hypothesis, at the word level, divided by the reference length:

WER = (S + D + I) ÷ N

where S is substitutions (a wrong word), D deletions (a missing word), I insertions (an invented word), and N the number of words in the reference. Note the asymmetry: the denominator is the reference length, so a model that hallucinates fifty extra words on a five-word reference can exceed 100% WER. Chapter 8 will need that fact.

Take a concrete pair:

Referencesea shells by the shoreN = 5
Hypothesissea shell by the sea shore6 words

You can eyeball the answer, but eyeballing does not generalise. The algorithm is dynamic programming: build a table where cell (i, j) holds the cheapest edit distance between the first i reference words and the first j hypothesis words. Each cell is the minimum of three moves:

D[i][j] = min( D[i-1][j] + 1  (deletion),   D[i][j-1] + 1  (insertion),   D[i-1][j-1] + cost )

where cost is 0 if the two words match and 1 if they do not (a substitution). Row 0 and column 0 are filled with 0, 1, 2, 3… because turning an empty string into j words costs j insertions.

Here is the completed table. Every number is the minimum of the three neighbours above, and you should check two or three of them yourself.

seashellbytheseashore
0123456
sea1012345
shells2112345
by3221234
the4332123
shore5443222

Work one cell to be sure. Take row "shells", column "shell". The three candidates are: deletion, D[sea][shell] + 1 = 1 + 1 = 2; insertion, D[shells][sea] + 1 = 1 + 1 = 2; substitution, D[sea][sea] + cost = 0 + 1 = 1, because "shells" and "shell" are different words. The minimum is 1, and it came from the diagonal, which means a substitution.

Now read the answer out of the bottom-right corner: D = 2. Then walk the bold path backwards to find out which two errors they were:

StepCellMoveMeaning
1(shore, shore) = 2diagonal, cost 0match
2(the, sea) = 2from the left, +1insertion of "sea"
3(the, the) = 1diagonal, cost 0match
4(by, by) = 1diagonal, cost 0match
5(shells, shell) = 1diagonal, cost 1substitution
6(sea, sea) = 0diagonal, cost 0match

So S = 1, D = 0, I = 1, N = 5:

WER = (1 + 0 + 1) ÷ 5 = 2 ÷ 5 = 0.40 = 40%

Six words hypothesised, five words referenced, four of them perfect — and the score is 40%. WER is a harsh metric, and that harshness is exactly why the next section exists.

The same computation, step by step in numpy

python
import numpy as np

def wer_counts(ref, hyp):
    r, h = ref.split(), hyp.split()
    N, Mh = len(r), len(h)

    # D[i][j] = cheapest edits turning r[:i] into h[:j]
    D = np.zeros((N + 1, Mh + 1), dtype=int)
    D[:, 0] = np.arange(N + 1)      # delete every reference word
    D[0, :] = np.arange(Mh + 1)     # insert every hypothesis word

    back = np.zeros((N + 1, Mh + 1), dtype=int)   # 0=diag 1=del 2=ins
    for i in range(1, N + 1):
        for j in range(1, Mh + 1):
            cost = 0 if r[i - 1] == h[j - 1] else 1
            cand = [D[i - 1, j - 1] + cost,   # match or substitute
                    D[i - 1, j] + 1,             # deletion
                    D[i, j - 1] + 1]             # insertion
            back[i, j] = int(np.argmin(cand))
            D[i, j] = min(cand)

    # walk the pointers back to attribute each error
    i, j, S, Dl, I = N, Mh, 0, 0, 0
    while i > 0 or j > 0:
        if i > 0 and j > 0 and back[i, j] == 0:
            if r[i - 1] != h[j - 1]: S += 1
            i, j = i - 1, j - 1
        elif j == 0 or (i > 0 and back[i, j] == 1):
            Dl += 1; i -= 1
        else:
            I += 1; j -= 1
    return S, Dl, I, N

S, Dl, I, N = wer_counts("sea shells by the shore",
                         "sea shell by the sea shore")
print(S, Dl, I, N, (S + Dl + I) / N)     # 1 0 1 5 0.4

And the one-liner you will actually use

python
import jiwer
jiwer.wer("sea shells by the shore", "sea shell by the sea shore")   # 0.4

Three forms, one number. Now that you know what the number counts, you can see the problem the paper had to solve.

The normaliser, and the honesty check on it

WER penalises all differences from the reference, including innocuous ones. "you're" versus "you are". "$68 million" versus "sixty-eight million dollars". A dataset that separates contractions with whitespace. None of these are mistranscriptions; all of them are counted as errors.

This hurts every system, but it is acute for a zero-shot model, which by definition never saw any benchmark's transcript conventions. So the authors built a text normaliser — twelve steps for English, applied to both reference and hypothesis before scoring:

  1. Remove phrases between matching brackets.
  2. Remove phrases between matching parentheses.
  3. Remove filler words: hmm, mm, mhm, mmm, uh, um.
  4. Remove whitespace before an apostrophe.
  5. Expand standard and informal English contractions.
  6. Remove commas between digits.
  7. Remove periods not followed by numbers.
  8. Strip symbols and diacritics (Unicode categories M, S, P) except period, percent and currency.
  9. Convert spelled-out numbers and currencies to Arabic numerals: "ten thousand dollars" → "$10000".
  10. Convert British spellings to American.
  11. Remove remaining symbols not part of a numeric expression.
  12. Collapse repeated whitespace.

For several datasets this reduces WER by up to 50 percent. That is an enormous intervention, and the authors say so.

The obvious objection, and the paper's answer. If you develop a normaliser jointly with your model, by iterative manual inspection of the cases where WER penalised your model, you might simply be building a device that forgives your model's peculiarities. The authors state this risk explicitly and then test it: they re-score everything with an independently developed normaliser from the FairSpeech project. On most datasets the two behave the same for Whisper and for the open-source baselines alike. On CallHome and Switchboard (rich in contractions) and WSJ (rich in numeric expressions) their normaliser helps Whisper more — and they trace exactly why, to contraction handling and number standardisation. Naming the confound and running the control is the difference between a result and a claim.

Effective robustness, defined

Now the second instrument. Effective robustness (Taori et al., 2020) measures the difference between a model's performance on a reference distribution and its performance on out-of-distribution data.

The construction is: plot every model as a point, with in-distribution error on the x-axis and out-of-distribution error on the y-axis. Models trained on the reference distribution trace out a curve — better in-distribution error usually buys some out-of-distribution improvement. A model with high effective robustness sits below that curve: it does better out of distribution than its in-distribution score predicts.

The ideal is the line y = x: equal performance everywhere, which is what "the task has been learned rather than the dataset" would look like.

LibriSpeech is chosen as the reference distribution for a practical reason — its central role in speech research means many trained models exist for it, so the supervised curve can actually be drawn. Twelve other academic datasets supply the out-of-distribution axis.

Sim 10 · The effective-robustness plane

In-distribution error across, out-of-distribution error up. The dashed diagonal is the ideal y = x. The orange band is where LibriSpeech-supervised models live — slide along it and watch the vertical distance to the ideal refuse to close. The two labelled points are the paper's Table 2 pair: both at 2.7 on LibriSpeech Clean, 29.3 versus 12.8 on everything else.

move along the supervised trend0.45

The geometry is the argument. Improving a supervised model's LibriSpeech number moves it left along the orange band, and the band is far above the diagonal. Whisper is not further left — it is further down. Those are different achievements, and only one of them is robustness.

Table 2, dataset by dataset

Here is the comparison in full. Both models sit at 2.7 on LibriSpeech Clean. The right-hand column is the relative error reduction (RER) of Whisper over the supervised model on each dataset.

Sim 11 · Table 2 explorer — where the 55.2% comes from

Every dataset from the paper's Table 2, sorted by relative error reduction. Teal is wav2vec 2.0 Large (no LM); purple is Whisper Large-V2. Sweep the slider to include datasets one at a time and watch the running mean of the RER column converge on the reported 55.2%.

datasets included13

Deriving 55.2% by hand — and why it is not 56.3%

The paper reports "an average relative error reduction of 55.2% when evaluated on other speech recognition datasets". There are two plausible ways to compute that number, and only one of them gives 55.2. Work both.

Route A — reduce the averages. The average row of Table 2 gives 29.3 for the supervised model and 12.8 for Whisper:

(29.3 − 12.8) ÷ 29.3 = 16.5 ÷ 29.3 = 0.5631 = 56.3%

Route B — average the reductions. Compute RER per dataset first, then take the mean of the thirteen values:

74.7 + 69.9 + 69.9 + 61.9 + 61.2 + 59.2 + 54.5 + 54.3 + 51.2 + 49.4 + 49.4 + 46.2 + 16.1 = 717.9
717.9 ÷ 13 = 55.22 → 55.2%

Route B is the reported number. So the paper's headline is the mean of the per-dataset relative reductions, not the relative reduction of the mean.

Why does the distinction matter? Because the two weight datasets differently. Route A is dominated by the datasets with the largest absolute WER — CHiME-6 at 65.8 and AMI-SDM1 at 67.6 swamp everything else. Route B gives every dataset one equal vote, so LibriSpeech Other, where Whisper gains only 16.1%, drags the mean down as hard as CHiME-6's 61.2% lifts it.

Check one RER by hand to be certain of the definition. Artie: supervised 24.5, Whisper 6.2.

(24.5 − 6.2) ÷ 24.5 = 18.3 ÷ 24.5 = 0.7469 = 74.7%  ✓
The one row that keeps everyone honest. LibriSpeech Other — still LibriSpeech, just the harder split — shows only a 16.1% reduction, far below every other row. Of course it does: it is the one "out-of-distribution" dataset that is not really out of distribution for the supervised model. The paper leaves it in the average rather than dropping it, which costs them about three points of headline. That is what an honest table looks like.

The tiny model is the sharper result

Buried in the prose is a sentence more striking than the headline. The smallest zero-shot Whisper — 39 million parameters, 6.7 WER on LibriSpeech test-clean, which is a bad number by 2022 standards — is "roughly competitive with the best supervised LibriSpeech model when evaluated on other datasets."

Sit with that. A model that would place nowhere on the LibriSpeech leaderboard matches the leaderboard champion in the real world. If you needed one sentence to show that leaderboard position and deployment reliability are different quantities, that is it.

Noise: where the specialists fall off the cliff

The robustness argument gets a second, independent test. The authors added noise to LibriSpeech test-clean at controlled signal-to-noise ratios and measured 14 LibriSpeech-trained models plus Whisper. Two noise types: white noise (synthetic, flat spectrum) and pub noise from the Audio Degradation Toolbox — ambient chatter in a crowded room, which is what actual deployment sounds like.

Sim 12 · Degradation under additive noise

Drag the signal-to-noise ratio from a quiet 40 dB down to a hostile −10 dB and watch the ordering change. At low noise several specialists beat Whisper — unsurprising, since they were trained on this exact audio. Below about 10 dB of pub noise every one of them has crossed above Whisper. Switch noise types to see how much harder structured chatter is than flat hiss.

signal-to-noise ratio (dB)20

The paper's own summary: many models outperform Whisper's zero-shot performance at 40 dB SNR, "which is unsurprising given those models are trained primarily on LibriSpeech, but all models quickly degrade as the noise becomes more intensive, performing worse than the Whisper model under additive pub noise of SNR below 10 dB."

Pub noise is the more meaningful test because it is a natural distribution shift rather than a synthetic one. Flat hiss is a mathematical object; a room full of people talking is the thing your users are standing in.

How close to a human?

Finally, the comparison Chapter 0 promised to make fairly. The authors selected 25 recordings from Kincaid46 — scripted and unscripted broadcast, telephone and VoIP calls, meetings — and had them transcribed by five professional services: four entirely human, one computer-assisted.

TranscriberResult on the 25 recordings
Computer-assisted human serviceLowest aggregate WER — 1.15 points better than Whisper
Pure human transcription servicesBetter than Whisper by only a fraction of a percentage point
WhisperBehind both, but not by much

The paper's conclusion is measured, and worth copying as a template for reporting your own results: "Whisper's English ASR performance is not perfect but very close to human-level accuracy."

Where Whisper loses

A robustness paper that reported only wins would be suspicious. Here are the losses, and each is informative.

BenchmarkWhisper zero-shotBest priorReading
Multilingual LibriSpeech (WER)7.39.7 (XLS-R 1B)Win — but with a simple text standardiser, so the authors decline to claim SOTA
VoxPopuli (WER)13.68.1 (Maestro)Clear loss
CoVoST2 X→En (BLEU, all)29.125.2 (Maestro)New state of the art, zero-shot
CoVoST2, high-resource languages36.238.2 (Maestro)Loses where supervised data is plentiful
CoVoST2, low-resource languages25.218.5 (mSLAM)+6.7 BLEU — the widest margin, at the thinnest end
Fleurs language ID (accuracy)64.577.7 (mSLAM-CTC 2B)Loss, with a structural excuse (Ch 8)

The VoxPopuli loss has a specific diagnosis the authors offer: other models used VoxPopuli as a major source for their unsupervised pre-training data, and the dataset has roughly ten times more supervised training data per language than MLS. So VoxPopuli is close to in-distribution for the competition — exactly the situation where Chapter 0 predicted specialists would win.

The CoVoST2 pattern is the mirror image, and it is the cleanest illustration of the thesis anywhere in the paper. On high-resource languages, where competitors have plenty of supervised data, Whisper loses. On low-resource languages, where nobody has much, Whisper wins by 6.7 BLEU. Whisper's advantage is not that it is better at speech; it is that it never depended on data being available for your specific case.

The translation result itself deserves one more line. 29.1 BLEU, with no CoVoST2 training data at all, against systems trained directly on the benchmark. The paper attributes it to 68,000 hours of X→English translation data for those languages in the pre-training set, "which, although noisy, is vastly larger than the 861 hours of training data for X→en translation in CoVoST2". Eighty times more data, far worse per-example quality, better result. That is the weak-supervision bet, paying out.

Reference: "sea shells by the shore". Hypothesis: "sea shell by the sea shore". What is the WER, and what are the error types?
Why is the paper's headline 55.2% rather than the 56.3% you get from the two average rows of Table 2?
Whisper loses on VoxPopuli (13.6 vs Maestro's 8.1) but wins on CoVoST2's low-resource languages by 6.7 BLEU. What single principle explains both?

Chapter 6: Scaling — Models, Hours, and the Cost of Being Multilingual

Chapter 1 wrote down two ways the weak-supervision bet could have failed. This chapter measures both.

Failure mode A was the noise floor: performance saturating at the inherent quality of the labels, somewhere far below human. Worse, the paper articulates a sharper version — that as capacity and compute grow, models might "learn to exploit the idiosyncrasies of the dataset, and their ability to generalise robustly to out-of-distribution data could even degrade."

Failure mode B was negative transfer: 99 languages and two tasks in one set of weights interfering with each other.

Model scaling — does robustness survive capacity?

The test is to hold the dataset fixed and sweep the model family from 39 M to 1,550 M parameters, measuring zero-shot generalisation at each size across four tasks.

TaskMeasured onTrend with model size
English speech recognition12 datasets, WERImproves, with clear diminishing returns
Multilingual speech recognition67 languages (Fleurs), WERContinues to improve
X→English translation21 languages (CoVoST2), BLEUContinues to improve
Language identification102 languages (Fleurs), accuracyContinues to improve

So failure mode A did not happen. Zero-shot generalisation scales reliably; nothing degrades. The one exception, English speech recognition, has an explanation the paper offers cautiously: saturation effects from approaching human-level performance — which Chapter 5's human comparison independently supports.

Why "no degradation" is the load-bearing result here. The worry was not that a bigger model would be worse in-distribution — obviously it would not. The worry was that a bigger model would find more of the noisy dataset's idiosyncrasies to exploit, and become less transferable. That is precisely the CLIP failure of Chapter 0, scaled up. It did not occur, and the most plausible reason is that with 680,000 hours spanning every recording condition on the internet, "exploit the idiosyncrasies of the dataset" and "learn speech" have become almost the same instruction.

Dataset scaling — how much of this is just hours?

The complementary experiment: hold the model size fixed at Medium and train on subsampled datasets of 0.5%, 1%, 2%, 4% and 8% of the full pile, plus the full pile itself.

Two methodological details make this measurement trustworthy, and both are worth stealing. Checkpoints were selected by early stopping on validation loss, because a fixed schedule would have under- or over-trained the small runs. And evaluation used an exponential moving average of the parameters with a smoothing rate of 0.9999, to compensate for the learning rate not decaying fully to zero when a run is stopped early. Without these, the comparison would be measuring schedule artefacts rather than data.

Hours% of fullEnglish WER ↓Multilingual WER ↓X→En BLEU ↑
3,4050.5%30.592.40.2
6,8111%19.672.71.7
13,6212%14.456.67.9
27,2434%12.345.013.9
54,4868%10.936.419.2
681,070100%9.929.224.8
Sim 13 · Dataset scaling — the returns curve, task by task

The paper's Table 6 on a log-hours axis. Sweep the data budget and read off what each task gets. Watch the last step in particular: 54,486 → 681,070 hours is a 12.5× increase in data and buys one point of English WER. Switch tasks to see the three completely different shapes hiding under one dataset.

training hours681,070

Read the three shapes carefully, because they are three different stories:

Translation is the paper's quiet emergence result. Going from 3,405 to 13,621 hours takes X→English BLEU from 0.2 to 7.9 — a factor of forty, from a fourfold increase in data. There is no amount of clever architecture that gets you from 0.2 BLEU; the capability simply is not present at that data scale. This is the same shape as capability emergence in language models, observed in 2022 in a speech paper, without the word "emergent" appearing anywhere.

What do the diminishing returns at the top end mean? The paper offers two competing explanations and refuses to choose between them:

ExplanationImplicationHow you would tell
The models are under-trained relative to the dataset sizeLonger training and bigger models would keep paying offTrain Large for many more epochs and see if the curve resumes — which is essentially what Large V2 did
We are nearing the end of dataset-size scaling for speechFurther hours are wasted; go collect low-resource languages insteadScale data further at fixed compute per token and watch the curve flatten regardless

"Further analysis is needed to characterise scaling laws for speech recognition in order to decide between these explanations." That sentence is the paper telling you where the open problem is.

Per-language scaling — the most predictive number in the paper

Now the result that makes the long tail from Chapter 1 quantitative. Plot, for each language, the log of its training hours against the log of its Fleurs word error rate. The squared correlation coefficient is 0.83.

That is a remarkably tight fit for a relationship between "how much of this language happened to be on the internet with a transcript" and "how well the model hears it". Fitting the slope gives a rule you can carry in your head:

WER halves for every 16× increase in training data for that language

Turn that into the exponent. If halving requires a factor of 16, then:

WER ∝ hours−b  with  16−b = 1/2  →  b = log 2 / log 16 = 0.3010 / 1.2041 = 0.25

Work an example all the way through. Suppose a language sits at 25% WER with 400 hours of data, and you want 12.5%. That is one halving, so you need 16× the data:

400 × 16 = 6,400 hours

Now suppose you want 6.25% — two halvings:

400 × 16 × 16 = 400 × 256 = 102,400 hours

One hundred thousand hours of a single language, to go from 25% to 6.25%. Check it against the exponent directly: WER(102,400) = 25 × (102,400/400)−0.25 = 25 × 256−0.25 = 25 × (1/4) = 6.25. The two routes agree.

Sim 14 · The per-language law — hours in, word error rate out

Log hours across, log WER up. The trend line is the paper's fitted relationship; the dots use the real Appendix E hour counts for each language. Drag the marker to any hours budget and read the predicted WER, plus how many hours a target WER would demand. The red dots are the outliers the paper names by hand.

hours for a language
target WER (%)10

The outliers are as informative as the fit. The languages performing worst relative to the trend are those "that have unique scripts and are more distantly related to the Indo-European languages making up the majority of the training dataset" — the paper names Hebrew, Telugu, Chinese and Korean.

Three candidate causes are offered, and the paper does not adjudicate between them:

  1. Lack of transfer due to linguistic distance. Most of the model's capacity was shaped by Indo-European phonology and morphology; there is less to share.
  2. The byte-level BPE tokenizer being a poor match. Even refit, a shared vocabulary spends most of its merges where most of the text is — so scripts far from the mass fragment into more tokens per word.
  3. Variations in data quality. The pipeline's filters were tuned largely on English; their false-negative rate elsewhere is unknown.

Note that hypothesis 2 is testable and cheap, and that nobody in the paper tested it. That is a research project sitting in a footnote.

Why translation scales so much worse — and the Welsh disaster

Run the same analysis for translation and the correlation collapses: r2 = 0.24, against 0.83 for recognition. Same model, same style of plot, a third of the explanatory power.

The paper's suspicion is that the translation training data is noisier "due to errors in audio language identification" — and then it gives the smoking gun.

The Welsh case, start to finish. Welsh appears with roughly 9,000 hours of X→English translation data, ranking 4th overall for translation hours — ahead of French, Spanish and Russian. Its zero-shot Fleurs BLEU is 13, far below what 9,000 hours predicts. Inspection reveals why: the majority of that "Welsh" translation data is English audio with English captions, where the English audio was mis-classified as Welsh by the language-identification system. Because the transcript was English and the detected audio language was not, Chapter 2's rescue rule dutifully filed it as translation data. A single systematic classifier error manufactured thousands of phantom hours, corrupted the translation stream, and depressed the correlation coefficient for every language at once.

Trace the causal chain, because this is how data bugs actually work in large systems:

1. A classifier has a systematic error
The audio LID model confuses some English speech for Welsh. Not randomly — on a particular kind of content, repeatedly.
2. A routing rule amplifies it
"Language mismatch + English text → translation data" turns every mis-classification into a confident training example of the wrong task.
3. The corpus statistics lie
Welsh ranks 4th in translation hours. Any analysis keyed on "hours per language" is now wrong for that language.
4. The symptom appears far away
A weak correlation coefficient in a scaling plot, three sections later, in a completely different experiment.

Notice that the defect was only findable because someone looked at an outlier in a scatter plot and asked why. There is no automated check that would have caught it.

Negative transfer, and where it stops

Failure mode B. Does cramming 99 languages and two tasks into one model hurt English recognition?

The comparison needs care, and the paper takes it: in the joint setup only 65% of compute is spent on English speech recognition, so a naive comparison against an English-only model of the same size would confound "multitask interference" with "trained less on this task". The x-axis is therefore FLOPs spent on English speech recognition specifically.

Sim 15 · The multitask crossover

Average WER across 11 English datasets against compute spent on English recognition. Below the crossover the English-only model wins — genuine negative transfer. Above it, the joint model wins. Drag the compute budget and watch which side you are on; the sign of the multitask decision flips at a specific scale.

FLOPs on English ASR (log10)20.2

The result: "for small models trained with moderate amounts of compute, there is indeed negative transfer between tasks and languages: joint models underperform English-only models trained for the same amount of compute. However, multitask and multilingual models benefit more from scale and eventually outperform their English-only counterparts."

And a final detail that strengthens the claim: for the largest experiments, the joint models beat English-only models even without the compute adjustment. The correction was not doing the work.

The practical rule this hands you. Multitask training is not good or bad; it has a scale threshold. Below it you are dividing a fixed capacity among competing objectives and every task suffers. Above it the tasks start sharing structure — phonetics, prosody, the shape of language — and each becomes a regulariser for the others. If your multitask experiment failed, the question to ask is not "is multitask bad" but "was I above or below the crossover", and the answer is a single plot away.
A language currently sits at 20% WER with 250 hours of training data. Roughly how many hours would you need for 5% WER?
X→English BLEU is 0.2 at 3,405 hours and 7.9 at 13,621 hours. What does that pattern indicate?
Welsh has ~9,000 hours of translation data — 4th most of any language — yet only 13 BLEU. What happened?

Chapter 7: Long-Form Decoding — Five Heuristics Holding a System Together

Whisper hears 30 seconds. A TED talk is 18 minutes; an earnings call is an hour; a CORAAL interview runs longer. The academic benchmarks of Chapter 5 are almost all short utterances, so none of them exercise this — and essentially every real deployment does.

The strategy is buffered transcription: consecutively transcribe 30-second segments, shifting the window according to the timestamps the model itself predicted. Chapter 4 built the mechanism — the lone start-timestamp token that says "resume here".

Notice what that makes the system. The model's output is now the input to its own next step. There is a feedback loop, and it has no external correction.

The failure mode this chapter exists to prevent. "Inaccurate transcription in one window may negatively impact transcription in the subsequent windows." If the model emits a bad timestamp, the next window lands in the wrong place. If it is also conditioning on the previous window's text, it inherits the previous window's mistake as authoritative context. One bad thirty seconds can poison an hour. The heuristics below are all, at bottom, circuit breakers for this loop.
Sim 16 · The buffered loop — how one bad timestamp propagates

Ten consecutive windows across five minutes of audio. Each window is placed at the timestamp the previous one predicted. Add error to the predicted timestamps and watch the placement drift — and see the "initial timestamp constraint" heuristic clamp the very first one back into the first second.

timestamp error per window (s)0.0

Drag the error up and the windows walk away from the audio. Two things worth noticing: the drift is cumulative, because each window's start is measured from the previous window's guess rather than from an absolute clock; and a positive drift means audio is skipped entirely, which appears in the transcript as silently missing sentences rather than as visible errors.

Heuristic 1 — beam search with 5 beams

"We use beam search with 5 beams using the log probability as the score function, to reduce repetition looping which happens more frequently in greedy decoding."

Greedy decoding takes the argmax at every step. That makes it easy to fall into a self-reinforcing cycle: once the model has emitted "and then and then", the most probable continuation of that context is "and then", forever. Beam search keeps five hypotheses alive and scores whole sequences, so a path that starts looping loses to a path that does not.

Heuristic 2 — temperature fallback, with two triggers

This is the cleverest of the five. Decoding starts at temperature 0 — always take the highest-probability token, which is what you want when the model is confident. But if the result looks bad, the temperature is increased by 0.2, up to 1.0, and decoding is retried.

"Looks bad" is defined by two independent detectors:

TriggerThresholdWhat it catches
Average log probability over the generated tokenslower than −1The model is uncertain throughout — noisy audio, unfamiliar accent, off-distribution content
gzip compression ratio of the generated texthigher than 2.4The text is unusually repetitive — a repeat loop, even a confident one

The second trigger deserves a moment because it is genuinely delightful. Why would gzip tell you anything about a language model?

Because gzip works by replacing repeated substrings with back-references. Text that repeats compresses enormously; text that does not, does not. The compression ratio is therefore a cheap, model-free repetition detector, and it catches loops that the log probability misses — because a model stuck in a loop is often extremely confident about the next token in that loop.

The compression ratio, by hand

Define it as the size of the raw text divided by the size of its gzip-compressed form:

ratio = len(text) ÷ len(gzip(text))

Take a healthy transcript segment: 900 characters of ordinary English. English has roughly one bit of entropy per character at the word level, and gzip typically gets natural prose down to around 40–50% of its original size:

900 ÷ ~430 ≈ 2.1   — comfortably under the 2.4 threshold

Now take a repeat loop: the phrase "thank you for watching" (22 characters) emitted 40 times, so 880 characters. gzip stores the phrase once and then 39 back-references, each a couple of bytes, plus overhead:

880 ÷ ~65 ≈ 13.5   — five times over the threshold, unmissable

The gap between 2.1 and 13.5 is enormous, which is why a single fixed threshold of 2.4 works across languages and domains without tuning. Contrast that with trying to detect loops by n-gram counting, which needs a window size, a repetition count, and a per-language calibration.

python
import gzip

def compression_ratio(text: str) -> float:
    b = text.encode("utf-8")
    return len(b) / len(gzip.compress(b))

# the fallback loop, exactly as the paper describes it
for temperature in (0.0, 0.2, 0.4, 0.6, 0.8, 1.0):
    result = decode(mel, temperature=temperature,
                    beam_size=5 if temperature == 0 else None,
                    prompt=prev_text if temperature < 0.5 else None)
    needs_retry = (result.avg_logprob < -1.0
                   or compression_ratio(result.text) > 2.4)
    if not needs_retry:
        break

Why raising the temperature helps at all is worth stating, because it is counter-intuitive: adding randomness to a broken decode usually makes it worse. But the specific failure being treated is a deterministic trap. Temperature 0 will produce the identical loop every single time; a little noise is the only thing that can knock the decoder out of the basin. The paper is not sampling for diversity, it is sampling for escape.

Heuristic 3 — previous-text conditioning, with a firebreak

"Providing the transcribed text from the preceding window as previous-text conditioning when the applied temperature is below 0.5 further improves the performance."

Two halves to that sentence. The first half is Chapter 4's slot 0 put to use: giving the decoder the preceding transcript lets it carry names, terminology and topic across the window boundary, exactly as it was trained to do at a 50% rate.

The second half — when the applied temperature is below 0.5 — is the interesting part. A window that needed a temperature of 0.6 or above is, by construction, a window the model already failed at twice. Its text is probably wrong. Feeding wrong text forward as authoritative context is how one bad window becomes ten.

The design principle, stated generally. Any system that feeds its own output back into its input needs a confidence gate on the feedback path. Whisper's gate is a single number — the temperature it took to produce that output — and its threshold, 0.5, is exactly the point at which the fallback ladder has failed twice. The condition is not "was the output good", which is unknowable; it is "how hard did I have to work for it", which is free.

Heuristic 4 — voice activity detection needs two signals, not one

Chapter 4 gave the model a <|nospeech|> token. It would be natural to threshold its probability and call that voice activity detection. The paper tried and reports the result plainly: "We found that the probability of the <|nospeech|> token alone is not sufficient to distinguish a segment with no speech."

The working rule combines two thresholds: no-speech probability above 0.6 and average log probability below −1.

Why does the conjunction work when neither part does? Because the two errors are different. A segment of quiet music might get a no-speech probability of 0.4 — below threshold — while the model confidently transcribes lyrics that are not there. Conversely, an extremely noisy but genuinely speech-bearing segment may score high on no-speech while the decoder is doing tolerable work. Requiring both "I think there is no speech" and "and I have no idea what I am writing" is far more specific than either alone.

Heuristic 5 — constrain the first timestamp

The last one is a one-line fix for a specific observed bug: the model sometimes ignores the first few words of the input. The remedy is to constrain the initial timestamp token to lie between 0.0 and 1.0 seconds.

Read that as a constrained decoding trick. The model wanted to predict a start time of, say, 3.2 seconds — effectively declaring the first three seconds to be nothing — and the constraint forbids it. The vocabulary makes this trivially expressible: mask out timestamp tokens above index 50, since 50 × 0.02 = 1.0 s.

The showcase: run the decoder yourself

Sim 17 · The decoding-strategy bench — toggle each heuristic, watch the transcript survive or collapse

Twelve consecutive windows of a difficult recording. Each column shows the window's average log probability and gzip compression ratio against the paper's thresholds (−1 and 2.4), the temperature the fallback ladder had to reach, and the outcome. Turn heuristics off one at a time; the aggregate word error rate at the bottom is the price.

recording difficulty0.55

Turn off temperature fallback and the hard windows stay broken instead of being retried. Turn off beam search and the compression ratios climb into loop territory. Turn off voice activity detection and the silent windows fill with confident invention. Every one of these is a real behaviour the authors had to engineer around.

The ablation table, honestly read

Table 7 adds each intervention cumulatively across seven long-form datasets. WER, so lower is better.

ConfigurationTED-LIUM3MeanwhileKincaid46Rev16Earnings-21Earnings-22CORAALAverage
Greedy decoding only3.955.169.6911.710.714.022.011.0
+ Beam search4.165.719.4211.510.213.420.010.6
+ Temperature fallback4.165.719.4211.510.213.420.010.6
+ Voice activity detection3.564.619.4511.410.113.219.410.2
+ Previous text conditioning3.426.168.7211.09.6313.318.110.0
+ Initial timestamp constraint3.515.268.4111.59.7312.619.110.0

Three honest observations, none of which the abstract would tell you.

First: the total gain is 11.0 → 10.0, one point of average WER for five interventions. Compared with the 55.2% relative reduction of Chapter 5, this is small. These heuristics are not what makes Whisper good; they are what keeps it from occasionally producing garbage.

Second: the "+ Temperature fallback" row is numerically identical to the "+ Beam search" row, in every column. Either the fallback contributed nothing on these seven datasets, or the published table repeats a row. The paper does not comment. We should not pretend to know, but we should notice — and the corresponding claim in the prose is that these heuristics matter most for reliability, which averages tend to hide.

Third: the gains are not evenly distributed. Previous-text conditioning improves TED-LIUM3 (3.56 → 3.42) and CORAAL (19.4 → 18.1) but noticeably hurts Meanwhile (4.61 → 6.16). The paper says exactly this: "adding each of the interventions above incrementally reduces the WER overall, but not evenly across the dataset."

What Meanwhile tells you about previous-text conditioning. The Meanwhile dataset is jargon-heavy segments from a late-night talk show — rapid topic changes, dense proper nouns, comic non sequiturs. Conditioning on the previous window's text primes the decoder toward continuity, which is a benefit when the topic is stable (a TED talk, an interview) and a bias when it is not. This is a real, understandable trade-off, visible in one cell of one table, and it is the sort of thing you only learn by reading the numbers rather than the abstract.

The paper closes the section with a sentence that deserves quoting exactly: "These heuristics serve as a workaround for the noisy predictions of the model, and more research would be needed to further improve the reliability of long-form decoding." The authors are not claiming this part is solved. Chapter 8 is about what remains.

Why does the fallback loop use a gzip compression ratio in addition to average log probability?
Previous-text conditioning is applied only when the temperature used was below 0.5. What is the reasoning?
The five decoding heuristics take average long-form WER from 11.0 to 10.0. How should that be read?

Chapter 8: The Honest Chapter

Whisper is not a solved system, and the paper says so at length. This chapter is its limitations section, taken seriously — because the failure modes are more instructive than the successes.

Start with the classification the authors make, which is the key idea of the whole section:

Two kinds of error, and only one of them is getting better. "As we have scaled Whisper, we have observed that larger models have made steady and reliable progress on reducing perception-related errors such as confusing similar-sounding words. Many remaining errors, particularly in long-form transcription, seem more stubborn in nature and decidedly non-human/perceptual." Scale fixes hearing. It does not fix the other thing.

What is the other thing? The paper names its parentage precisely: "a combination of failure modes of seq2seq models, language models, and text-audio alignment."

The catalogue

FailureWhat it looks likeWhere it comes from
Repeat loopsThe same phrase emitted over and over until the token budget runs outAutoregressive decoding collapsing into a self-reinforcing cycle. Beam search and temperature fallback (Ch 7) are the patches.
Dropped edgesThe first or last few words of a segment simply missingWindow boundaries and the timestamp mechanism. The initial-timestamp constraint (Ch 7) is a partial patch.
Complete hallucinationA fluent transcript entirely unrelated to the audioThe decoder's language-model prior overwhelming weak acoustic evidence — trained in by every misaligned transcript that survived Chapter 2's filters.
Invented speaker names"John Smith:" prefixed to speech by someone else entirelyWeb transcripts frequently name the speaker; the name is not in the audio. Fixed by a brief fine-tune on transcripts without speaker annotations.
Low-resource collapseUnusable output for languages with a few hours of dataThe English-centric collection pipeline of Ch 1, exactly as Ch 6's scaling law predicts.
Weak language identification64.5% accuracy, well below the 77.7% supervised state of the artTwenty of the 102 Fleurs languages have no training data at all. Accounted for below.

Why hallucination is a language-model failure, not a hearing failure

This distinction is the most useful thing in the chapter, so build the intuition properly.

The decoder is an audio-conditional language model. At every step it combines two sources of information: what the cross-attention reads from the encoder (the acoustic evidence) and what the self-attention reads from its own previous tokens (the language prior). Under normal conditions both point the same way and the output is a transcript.

Now degrade the audio. The cross-attention contribution becomes uninformative — not zero, just uncorrelated with the truth. The language prior does not weaken at all; it is computed from text the model itself just wrote. So the balance shifts, and the model continues producing perfectly fluent English that is no longer about anything.

That is hallucination, and note what it is not: it is not the model failing to hear. It is the model succeeding at its other job while the first one has nothing to contribute.

Sim 18 · Evidence versus prior — where hallucination comes from

Drag the acoustic evidence from clean speech down to silence. The two bars show how much of the next-token distribution is being driven by the encoder versus by the decoder's own language prior. Below the crossover the output stops being a transcript and starts being fiction — and the confidence readout barely moves, which is exactly why average log probability alone cannot catch it.

acoustic evidence0.80

Watch the confidence number as you drag. At the "silence" preset the model is producing text with an average log probability that would not trip the −1 threshold, because it is genuinely confident about what comes next in the sentence it is writing. This is the exact reason Chapter 7 needed a second, model-free detector.

And trace it back to Chapter 2. Every misaligned transcript that survived filtering was a training example that said: produce fluent text; the audio need not support it. The paper found and removed a lot of those. It did not find all of them, and could not have.

The speaker-name bug, in full

This one is a perfect miniature of the whole weak-supervision problem, and it is buried in the training-details section rather than the limitations.

Observation: "Whisper models had a tendency to transcribe plausible but almost always incorrect guesses for the names of speakers."

Cause: many transcripts in the pre-training dataset include the name of the person speaking — interview formats, panel transcripts, podcast captions. The model is trained to predict every token of the target, so it is trained to predict the name.

The impossibility: "this information is only rarely inferable from only the most recent 30 seconds of audio". The name is a property of the document, not of the sound. The model is being asked to predict something the input does not contain.

What does a well-trained model do when asked to predict an unpredictable token? It produces the most likely guess given context — a plausible name. Confidently. Every time.

Fix: "we fine-tune Whisper models briefly on the subset of transcripts that do not include speaker annotations which removes this behavior."

The general lesson, which applies far beyond speech. If your training targets contain information that is not present in your inputs, you are not training a predictor — you are training a confabulator, and the loss function is rewarding it. The symptom will be confident, fluent, wrong output on exactly that field. The remedy is not a bigger model or a better decoder; it is removing the unpredictable information from the target. Chapter 4's format has no speaker slot precisely because there is nothing in the audio to fill it.

Language identification, properly accounted

The headline is unflattering: zero-shot Whisper scores 64.5% on Fleurs language identification, against 77.7% for mSLAM-CTC (2B) and 71.4% for w2v-bert-51 (0.6B). A loss by 13.2 points.

But the comparison is structurally unfair, and the paper explains exactly how. Fleurs contains 102 languages. Whisper's training set contains no data at all for 20 of them. Those 20 are automatically wrong.

So the ceiling is:

82 ÷ 102 = 0.8039 = 80.4% maximum achievable accuracy

And on the 82 languages it was actually trained for, Whisper achieves 80.3%. Now multiply, to check that the two numbers are consistent with the headline:

0.803 × (82 ÷ 102) = 0.803 × 0.8039 = 0.6455 = 64.6%

Which is the reported 64.5%, to within rounding. The headline number is exactly "very good on what it knows, zero on what it has never heard, averaged together".

Sim 19 · The language-ID accounting

102 Fleurs languages. Slide the number Whisper has training data for and watch the reported accuracy move, holding per-language accuracy fixed at 80.3%. At 82 covered languages you land on the paper's 64.5%; at 102 you would report 80.3% and the comparison against supervised systems would look completely different.

languages with training data82

Two readings of this, and both are correct. Charitably: the model is competitive at language identification and the benchmark punishes it for coverage rather than capability. Uncharitably: coverage is capability — a language identifier that cannot identify twenty languages is worse at language identification. The paper reports both numbers and lets you choose, which is the right thing to do.

What the paper says it did not study

The limitations section is unusually explicit about scope. Four open questions are named:

Open questionWhy it mattersWhat the paper proposes
Decoding strategiesThe remaining long-form errors are non-perceptual and the Ch 7 heuristics only paper over themFine-tune on a high-quality supervised dataset, or use reinforcement learning to directly optimise decoding performance
Low-resource languagesCh 6 gives a precise, favourable prediction: most languages are under 1,000 hours, and the return per hour is steepest there"A targeted effort at increasing the amount of data for these rarer languages could result in a large improvement… even with only a small increase in our overall training dataset size"
Fine-tuningOnly zero-shot transfer was studied; where good supervised data exists, results are likely improvableStudy it — and gain direct comparability with prior work, which nearly always fine-tunes
Encoder or decoder?The robustness thesis credits the strong decoder, but this was never isolatedAblate: train a decoder-less CTC model, or measure how existing encoders like wav2vec 2.0 change when paired with a language model

The fourth is the most interesting scientific gap in the whole paper. The introduction's argument is that self-supervised systems lack an equivalently high-quality pre-trained decoder, and that Whisper's robustness follows from having one. That is a hypothesis, and the paper concedes it is untested: "It is currently unclear to what degree the benefits of Whisper stem from training its encoder, decoder, or both."

A fifth omission is stated almost as an aside: Whisper "departs noticeably from most recent state-of-the-art speech recognition systems due to the lack of unsupervised pre-training or self-teaching methods. While we have not found them necessary to achieve good performance, it is possible that the results could be further improved by incorporating this." Not needed is not the same as not useful.

The two gaps in the format itself

Chapter 4 celebrated how much the token format absorbs. It is worth being equally clear about what it leaves out, because both omissions have practical consequences you will meet on your first real deployment.

No diarization. The introduction lists speaker diarization as one of the components the paper would like a single model to absorb, and then the format has no slot for it. So Whisper produces an undifferentiated stream of text for a meeting with six participants. Every practical meeting-transcription system built on Whisper bolts a separate diarizer alongside it and aligns the two by timestamp — which is precisely the multi-component pipeline the paper set out to collapse.

No memory beyond 30 seconds, except through text. The encoder sees exactly one window. The only channel by which information crosses a window boundary is the previous-text slot — a handful of tokens of the model's own output. So an acoustic fact established at minute two (this speaker's voice, this room's reverberation, this recording's noise profile) is unavailable at minute three unless it happened to be written down.

That second limitation explains several behaviours that otherwise look mysterious:

Observed behaviourExplained by the 30-second horizonPractical mitigation
A rare name transcribed correctly early and wrongly laterThe correct spelling scrolled out of the previous-text windowPin a glossary into the previous-text slot for the whole file
Language flipping mid-recordingSlot 2 is re-predicted for every window independentlyDetect the language once and supply the token explicitly thereafter
Degradation after one bad windowThe only cross-window state is text, and the text is now wrongThe temperature-0.5 firebreak of Chapter 7; reset the prompt on failure
Style drift between segmentsPunctuation and casing decisions are per-windowPost-process, or accept it
The general shape of this failure class. Every one of these is a state problem, not a perception problem. The model hears each thirty seconds perfectly well; it simply has nowhere to keep what it learned. Notice that the entire mitigation column is about managing the single narrow channel the architecture provides. This is why the sequel systems of Chapter 9 hand the Whisper encoder to a language model with a long context: not to hear better, but to remember.

A note on what "robust" did and did not mean

One last piece of intellectual hygiene, since Chapter 0 built the whole lesson on this word.

Whisper's demonstrated robustness is robustness to acoustic and domain distribution shift: microphones, rooms, accents, topics, noise. That is what the twelve datasets vary, and it is a genuinely hard thing that Whisper does much better than its predecessors.

It is not robustness to adversarial input, nor to languages outside the training set, nor to the failure modes catalogued above, which are largely insensitive to how much audio diversity you throw at them. Repeat loops do not care that the model has heard a pub.

Keeping those separate is the difference between using the paper's result and over-claiming it.

Whisper sometimes emits a fluent transcript unrelated to the audio. Why is this best described as a language-model failure rather than a perception failure?
The model invented speaker names. What is the root cause, and what does it generalise to?
Whisper's Fleurs language-ID accuracy is 64.5%. What produces that number?

Chapter 9: Connections, Cheat Sheet, and What Whisper Became

Whisper's most durable contribution turned out not to be a speech recogniser. It was a reusable pair of ears. This final chapter closes the arc: what every number meant, where the idea came from, and what got built on top of it.

The cheat sheet — every number, in one place

QuantityValueWhere it came from
Total supervision680,000 h (681,070 exactly)438,218 English + 117,113 multilingual + 125,739 translation
Languages96 non-English in the data; 99 language tokens; ASR data for 75Ch 1, Ch 4
Sample rate16,000 HzCh 3
Front end80-bin log-mel, 25 ms window, 10 ms hopCh 3
Input tensor80 × 3000 for 30 s480,000 samples ÷ 160-sample hop
Encoder positions1,500 (20 ms each)3,000 frames, one stride-2 conv
Stem2 × Conv1D, width 3, GELU, second with stride 2Ch 3
Positionssinusoidal (encoder), learned (decoder)Ch 3
Parameter formulaP ≈ 28 · L · d2 + V · dWithin 0.6% of the reported 1,550 M for Large
Family39 M / 74 M / 244 M / 769 M / 1550 M; head dim always 64Table 1
Vocabulary51,865 = 50,257 + 1,501 + 99 + 8Ch 4
Timestamp resolution20 ms, 1,501 tokens covering 0.00–30.00 sCh 3, Ch 4
Decoder prefix[PREV ctx] SOT · lang · task · [notimestamps] · content · EOTCh 4
Prior-text rate50% of training examplesTable 17
Training220 updates × batch 256; AdamW; warmup 2048; no augmentationTable 17; ≈3.3 passes
Large V2655,360 updates × batch 1024 = 2.5× the epochs; + SpecAugment, Stochastic Depth 0.1, BPE dropout 0.1Table 18
WER(S + D + I) ÷ N, after text normalisationCh 5
Headline robustness55.2% average relative error reduction over 13 datasetsMean of per-dataset RERs, not RER of means
Reference-point pairBoth 2.7 on LibriSpeech Clean; 29.3 vs 12.8 elsewhereTable 2
Human comparisonComputer-assisted service 1.15 points better; pure human a fraction of a point better25 Kincaid46 recordings
Per-language lawWER halves per 16× data; r2 = 0.83; exponent 0.25Fleurs, Figure 3
Translation lawr2 = 0.24 only — language-ID noiseFigure 4; the Welsh case
Translation SOTA29.1 BLEU zero-shot on CoVoST2 (high 36.2 / mid 32.6 / low 25.2)Table 4
Language ID64.5% overall; 80.3% on the 82 covered; ceiling 80.4%Table 5, Ch 8
Decoding thresholds5 beams; T 0→1.0 in steps of 0.2; log-prob < −1; gzip ratio > 2.4; no-speech > 0.6; prev-text only below T 0.5; first timestamp in [0, 1] sSection 4.5
Long-form ablation11.0 → 10.0 average WER across seven datasetsTable 7

The symbols, defined once more

SymbolMeaningEveryday analogy
dmodel width — the size of every token's vectorHow many numbers describe one moment of sound or one word
Llayers, identical in encoder and decoderHow many rounds of refinement the representation gets
Vvocabulary size, 51,865The set of things the model is allowed to write, including times and languages
Nreference length in words, the WER denominatorThe length of the answer key
S, D, Isubstitutions, deletions, insertionsWrong word, missing word, invented word
T (temperature)softmax sharpness during decoding; 0 is argmaxHow much the decoder is allowed to improvise when stuck
SNRsignal-to-noise ratio in dB; lower is noisierHow loud the room is relative to the speaker
BLEUtranslation overlap score; higher is betterHow much of a reference translation you reproduced
r2squared correlation of the log-log fitHow reliably hours predict accuracy

Where this sits in the lineage

Sim 20 · The audio-understanding lineage

Whisper's position in the arc from hand-built features to audio-native language models. Step through the eras and see which idea each one contributed — and notice that Whisper is the node almost everything downstream borrows an encoder from.

era3

What to read before this

What to read after this

What actually happened next

Whisper was released with weights and inference code, which is why its influence is disproportionate to its novelty. Three things followed, and they are worth knowing as context for everything above.

DevelopmentWhat it didWhich chapter it descends from
Whisper as a universal audio encoderLater audio–language systems drop the decoder entirely and keep the encoder as a frozen front end for a language modelCh 3 — the encoder was trained on more acoustic diversity than any other available checkpoint
Inference engineering (faster and distilled variants, word-level alignment tools)Rebuilt the Ch 7 decoding loop with better batching, quantisation and forced alignmentCh 7 — the heuristics were explicitly labelled as a workaround, and the community treated them as an invitation
Larger and later Whisper checkpointsMore epochs, more languages, a finer mel front endCh 6 — the "under-trained relative to dataset size" hypothesis, tested by training longer

The deeper legacy is methodological. Whisper is the paper people cite when they want to argue that the labelling pipeline is the model — that an ordinary architecture plus a carefully filtered, enormous, weakly supervised corpus beats a clever architecture on a clean one. Chapter 2 is the chapter that gets reread.

Cross-domain bridge:
Whisper's core move — express every task as a prefix in one sequence, and let one autoregressive model serve them all — is the same move as the instruction-tuned language model, the T5 text-to-text framework, and the "prompt as API" pattern you use every day. The multitask token format of Chapter 4 is a fixed, tiny, learned instruction set: five slots, 1,608 special tokens, zero natural language. Qwen2-Audio then replaces that instruction set with actual English sentences, which is precisely the move from a rigid API to a natural-language one. If you have internalised prompting, you already understand Chapter 4 — it is prompting with a vocabulary of eight control words instead of a dictionary.

Choosing between the approaches, in practice

If you have an actual speech problem in front of you, the useful question is not "which paper is best" but "which regime am I in". Here is the decision, laid out with the evidence from this lesson attached.

Your situationWhat to reach forWhy, from this paper
One narrow domain, plenty of matched labelled audio, deployment conditions fixedFine-tune a specialist — or fine-tune Whisper itselfChapter 5's VoxPopuli row: specialists win on their own turf, and the paper explicitly declines to study fine-tuning as a limitation
Unknown or varied deployment conditions, no per-customer labelling budgetZero-shot WhisperThe entire effective-robustness argument; 55.2% fewer errors at matched reference performance
Noisy environments, real rooms, overlapping speechZero-shot Whisper, and measure below 10 dB SNRChapter 5's pub-noise crossover; the AMI-IHM versus AMI-SDM1 pair
A low-resource languageWhisper, plus a targeted data-collection effortChapter 6's law: the return per hour is steepest where hours are fewest, and most languages sit under 1,000 hours
Hours-long audio, reliability criticalWhisper plus every Chapter 7 heuristic, plus loop and hallucination monitoringThe heuristics buy one average point but prevent catastrophic single files; Chapter 8's failure modes are not fixed by scale
You need to answer questions about audio, not transcribe itThe Whisper encoder inside an audio–language modelChapter 9's lineage; the token format is a five-slot API, and natural language is a better one

The row that surprises people is the first one. Nothing in this paper says fine-tuning is bad — Chapter 0's argument is that fine-tuning and then reporting in-distribution numbers as if they were general is bad. If your deployment distribution really is your training distribution, a specialist is the right tool, and you should say so plainly rather than claiming robustness.

The papers Whisper is standing on

Every one of these is cited in the text above; this is where to go next if a particular thread caught you.

Three things worth arguing about

A paper is more useful if you can say what would change your mind about it.

  1. Is the robustness from the decoder, or the data? The paper's story credits the strong pre-trained decoder, but Chapter 8 concedes the ablation was never run. A decoder-less CTC model trained on the same 680,000 hours would settle it, and nobody in the paper trained one.
  2. Is the text normaliser doing more work than reported? The FairSpeech control is good, but it is one alternative normaliser on one set of datasets. WER drops "of up to 50 percent" is a very large lever to have built jointly with the model.
  3. Do the scaling curves flatten because of the model or the labels? The paper offers "under-trained" and "nearing the end of data scaling" and declines to choose. Everything about how you would spend the next ten million dollars depends on which is true.

Reproducing the whole pipeline, end to end

Everything in this lesson collapses into about forty lines. Read it as a summary of the previous nine chapters rather than as production code — each block is a chapter.

python
import gzip, numpy as np, whisper

model = whisper.load_model("large-v2")          # Ch 3: L=32, d=1280, 1550M
tok   = whisper.tokenizer.get_tokenizer(multilingual=True)   # Ch 4: V = 51,865

def compression_ratio(t):                      # Ch 7: the loop detector
    b = t.encode("utf-8"); return len(b) / len(gzip.compress(b))

def transcribe_window(audio30, prev_text, task="transcribe", lang=None):
    # Ch 3: 30 s @ 16 kHz -> 480,000 samples -> 80 x 3000 log-mel
    mel = whisper.log_mel_spectrogram(whisper.pad_or_trim(audio30))

    for T in (0.0, 0.2, 0.4, 0.6, 0.8, 1.0):        # Ch 7: the fallback ladder
        opts = whisper.DecodingOptions(
            task=task,                            # Ch 4: slot 3
            language=lang,                        # Ch 4: slot 2, None = let it predict
            without_timestamps=False,             # Ch 4: slot 4 omitted -> timestamps on
            prompt=prev_text if T < 0.5 else None,  # Ch 7: the firebreak
            beam_size=5 if T == 0 else None,        # Ch 7: heuristic 1
            temperature=T)
        r = whisper.decode(model, mel, opts)
        if r.avg_logprob >= -1.0 and compression_ratio(r.text) <= 2.4:
            break                                 # Ch 7: both gates passed

    # Ch 7: voice activity detection needs BOTH signals, not one
    silent = (r.no_speech_prob > 0.6) and (r.avg_logprob < -1.0)
    return ("" if silent else r.text), r

def transcribe_long(audio, sr=16000):               # Ch 7: the buffered loop
    pos, out, prev = 0, [], None
    while pos < len(audio):
        text, r = transcribe_window(audio[pos:pos + 30 * sr], prev)
        out.append(text)
        prev = text or prev
        # Ch 4: a lone trailing start-timestamp says "resume here"
        shift = r.segments[-1].start if r.segments and r.segments[-1].partial else 30.0
        pos += int(max(1.0, shift) * sr)
    return " ".join(out)

The whole architecture is one load_model. The whole multitask interface is three keyword arguments. The whole long-form strategy is a for loop with two thresholds and a window shift. What made the system work was none of this — it was Chapter 2.

A reading map of the paper

If you go back to the PDF, this is where each thing lives.

You wantGo to
The filtering pipelineSection 2.1 — one page, the most important page
Architecture and front endSection 2.2 and Table 1; hyper-parameters in Appendix F
The multitask formatSection 2.3 and Figure 1
The effective-robustness argumentSection 3.3, Figure 2, Table 2
The text normaliserAppendix C for the twelve steps; Section 4.4 for the FairSpeech control
Noise and human comparisonsSections 3.7 and 3.9, Figures 5 and 7
ScalingSections 4.1–4.3, Figures 3, 4, 8, 9, Table 6
Decoding heuristicsSection 4.5 and Table 7
Per-language hoursAppendix E, Figure 11 — the source of every language number in this lesson
Honest limitationsSection 6, and the speaker-name paragraph hidden in Section 2.4
Exit gate — teach it back before you leave.

Without scrolling up: (1) explain why a model can be superhuman on LibriSpeech and twice as bad as a human elsewhere; (2) name the three routing outcomes of the language-match filter and what the third one accidentally created; (3) derive 1,500 encoder positions and 20 ms resolution from 30 seconds of 16 kHz audio; (4) write the decoder prefix for Spanish audio translated to English with timestamps; (5) reconstruct 51,865 from its four parts; (6) state the two fallback triggers with their thresholds and explain why gzip catches what log probability misses; (7) explain the 55.2% versus 56.3% discrepancy; (8) explain why the model invented speaker names and what that generalises to. If any of the eight stalls, its chapter is one tap away.

If you remember only five sentences

  1. Humans are measured out of distribution and fine-tuned models are measured in distribution, so "superhuman on the benchmark" and "reliable in the world" are different claims that happen to share a test set.
  2. The remedy was not a better architecture — it was 680,000 hours of weakly labelled internet audio, filtered by a handful of principled heuristics that all key on information written text has and sound does not.
  3. One token format turns one set of weights into a transcriber, a translator, a language identifier, a voice-activity detector and an aligner, at a cost of 1,608 extra vocabulary entries.
  4. Scale fixed hearing and did not fix the language model: repeat loops, dropped edges, hallucination on silence and invented names are all decoder failures, and they are held back by five decoding heuristics the authors themselves call a workaround.
  5. Robustness is bought with breadth of supervision, and it is only visible if you evaluate zero-shot. Both halves of that sentence are the paper.

And one closing observation about how research reads. The most quoted thing about Whisper is "680,000 hours". The thing that made 680,000 hours usable is one page in Section 2.1 describing how to tell a machine-written transcript from a human one. When you next read a paper whose headline is a number, go find the page that made the number safe to use.

"What I cannot create, I do not understand."
Compute a log-mel spectrogram from raw samples this week, then build the decoder prefix by hand and decode thirty seconds with it. Whisper stops being a library call.
If you had to compress the entire paper into one transferable claim, which is it?
Why did later audio–language systems adopt Whisper's encoder while discarding its decoder and token format?