Key takeaways
- ✓Hallucinations are rare and large: an average WER barely moves, but the customer sees nonsense.
- ✓WER can't even score them: on a clip with no speech, the reference is empty and there's nothing to divide by.
- ✓A voice activity detector (VAD) in front of the model cut invented text from 10 of 24 clips to 4, with no cost to speech WER.
- ✓In production, use reference-free signals. The length ratio caught invented text with an AUC of 0.97.
- ✓Zero failures in 100 clips still allows a rate up to 3%. Report rare failures with intervals.
Chapter 1 showed that WER can pass 100% when a model invents words. This chapter is about those inventions, and the failures that look like them: text written over silence, runaway loops, transcripts that stop early, repeated speech collapsed into one copy, and output in the wrong language. They're rare and large: they don't happen often, but when they do, the transcript is badly wrong, and the customer notices.
Why WER can't see them
WER has two blind spots, and these failures live in both:
- It needs a reference. On a clip with no speech, the reference is empty, so WER can't be computed: there are zero words to divide by. Such clips are often left out of test sets entirely, and they're exactly where models invent text.
- It's an average. One clip that repeats "thank you" 500 times barely moves the WER of 200 clips. A customer who sees that transcript thinks the product is broken.
| Failure | What it looks like | Why WER misses it |
|---|---|---|
| Invented text | "You", "Thanks for watching!", a plausible sentence over silence | The reference is empty, so WER is undefined |
| Runaway | A phrase repeated until the output limit | One clip, averaged with hundreds of good ones |
| Truncation | The first sentence, then nothing | Looks like ordinary deletions |
| Collapsed repetition | "no, no, no, no" becomes "no" | Looks like cleaning up |
| Wrong language | Another language, or a mix ("Für die Separation of…") | Just a clip with high WER |
What models write on nothing
Why would a model write text when nobody is talking? Whisper-style models learned from internet audio with captions, and videos often have captions like "Thanks for watching" over silence and end credits. For no speech, those are likely outputs. The model writes one token at a time, each based on what it already wrote, so once it has started a phrase it can also get stuck repeating it.
The lab played six models 24 clips with no speech: silence, room tone, hold music, phone tones, clicks, and distant voices. Click any cell:
| Non-speech clip | whisper-base | whisper-small | gpt-4o-mini | gpt-4o-transcribe | gpt-transcribe | nova-3 |
|---|---|---|---|---|---|---|
| Silence | ||||||
| Room tone | ||||||
| Hold music | ||||||
| Keypad, dial, ringback tones | ||||||
| Clicks, loud noise | ||||||
| Distant talkersvoices, so arguably speech | ||||||
| Clips with no voices, any text | 7/19 | 6/19 | 1/19 | 17/19 | 0/19 | 0/19 |
gpt-4o-transcribe · silence
Wrote text on 2 of 2 clips. Example: "Meghalaya, India" (for 30 s of silence)
The spread is huge. gpt-transcribe and nova-3 wrote nothing on any clip without voices. gpt-4o-transcribe wrote something on 22 of 24, often in other languages, with language="en" set: "Meghalaya, India" for 30 seconds of silence. The bottom row is a product question rather than a model one: every model transcribed distant voices, and whether that's an error depends on whether your customers want "what the caller said" or "what was said in the room".
Two more findings worth knowing:
- The fix is cheap. A voice activity detector (VAD) is a small model that answers only "is someone speaking here?". Putting Silero VAD in front of
whisper-small.encut the clips with invented text from 10 of 24 to 4, with speech WER unchanged at 4.6%. It can't fix background voices, because those are speech. - Isolated silence is the harsher test. When real speech was followed by 20 s of silence or music, no model wrote a single word after the speech. The speech just before seems to suppress inventions.
Loops, gaps, and collapsed repetition
Whisper reads long audio in 30-second windows, and by default each window gets the previous window's text as a hint (condition on previous text). That helps names and sentences carry across window boundaries. On a silent window, though, the model may simply copy the hint: in a clip with 15-second pauses, Whisper wrote "They were to proceed immediately to the election." into the silent gaps, twice, taking WER from 4% to 34%.
The opposite failure is quieter. When the lab played the same sentence six times in a row, most models deleted real repetition. gpt-4o-transcribe wrote every sentence exactly once; nova-3 was the only model that kept all six copies every time. For a caller who reads an account number twice, or says "no, no, no", that's lost speech that looks like tidying up.
Catching it without a reference
In production there's no reference transcript. What you do have is the audio and the output, and that's enough for several signals:
| Signal | Catches | How |
|---|---|---|
| Length ratio | Invented text (high), truncation (low) | Words written ÷ words expected from the speech a VAD found |
| Compression ratio | Long loops | Repetitive text compresses well. Whisper's own rule is "above 2.4" |
| Repeated n-grams | Loops | Share of 4-word sequences seen before |
| Language check | Wrong-language output | A language identifier on the output |
| Known phrases | Classic inventions | "Thanks for watching", or an output that is just "you" |
Reference-free signals and detectors — VAD duration, length ratios, and classifier performance in production.
The strongest is the length ratio: people speak about 2.7 words per second, so 10 seconds of speech should produce about 27 words.
ratio = words written ÷ (2.7 × seconds of speech + 0.2)
Zero seconds of speech and the output "You" gives 1 ÷ 0.2 = 5.0: far too much text for the audio. Try the lab's cases, or type your own:
ratio = 1 ÷ (2.7 × 0 + 0.2) · repeated 4-grams: 0%
- ⚑ Invented text · length ratio 5.00 > 3.0: far more words than the speech can hold
- ⚑ Known phrase · a lone "you": a classic invention on silence
Each signal catches one kind of failure, and the lab measured how well with AUC (0.5 is a coin flip, 1 is perfect). The length ratio scored 0.97 on invented text. Compression scored 0.08: it points the wrong way, because invented outputs are short ("You"), and short text never compresses. Whisper's 2.4 rule is only for long loops.
Every signal can be fooled, too. A correct transcript of a fast phone-menu prompt gets a high length ratio, and earnings talk ("minus 18, then minus 15… in Q3") can look non-English to a language identifier. And one failure no reference-free signal can catch: a misheard English sentence of the right length.
Measure the detector like a classifier
A detector says "suspicious" or "fine", so measure it with precision (of the flags, how many are really bad?) and recall (of the bad outputs, how many get flagged?). Choose thresholds on one set of clips (dev) and score once on another (holdout). In the lab, the combined detector reached 0.96 precision and 0.78 recall on the holdout. Whisper's compression rule alone caught nothing.
One catch worth remembering: the holdout scored better than dev (F1 0.86 vs 0.58). That's a warning sign, not good news. The holdout contained only 2 truncation failures against 17 in dev, so it said very little about truncation.
Rare failures need big numbers
Some failures are deterministic: a Cockney clip ("see 'im crost the road there") came back in another language on all 5 runs for all three OpenAI models, identically every time. Others are random: one model switched language on "where's Milicent" 1 time in 5. Either way, to measure something that happens to 2% of clips you need many clips, repeated runs, and intervals:
Zero failures in 100 clips still allows a true rate up to about 3.0%.
Settings matter per model, too. For the OpenAI models, forcing language="en" made no difference to the switch rate. For nova-3 it was the whole difference: 0 of 100 with English forced, 10 of 100 with automatic detection. And even that zero only means "very likely under 3.7%". To promise a customer "under 0.5%", you need zero failures in about 600 clips.
Practice: build the signals
Implement the lab's reference-free signals and the Wilson interval: length_ratio(), compression_ratio(), repeated_ngrams() and wilson(). The tests use the lab's numbers: "You" on silence scores 5.0, a 40-times "I'm fine." loop compresses past 2.4, and 23 failures in 100 gives 15.8%–32.2%.
Quiz
1.A model writes "Thanks for watching!" on 20 seconds of hold music. What does WER say about this clip?
2.Why do Whisper-style models write "You" or "Thanks for watching!" on silence?
3.You put a voice activity detector (VAD) in front of the model. What won't it fix?
4.Whisper flags loops with "compression ratio above 2.4". In the lab, this signal had an AUC of 0.08 for invented text. What does that mean?
5.Your detector scores F1 0.58 on dev and 0.86 on the holdout. Good news?
6.A model produced zero wrong-language outputs in 100 clips. What can you promise a customer?
Check your understanding
Try each question before opening its answer.
What are hallucinations, runaways, truncation, collapsed repetition, and language switches—and why can WER hide them?
They are distinct failures: invented text, repeated loops, incomplete output, omitted repeated speech, and output in another language. They may occur on empty-reference audio or a small number of clips, so track dedicated rates and limits instead of relying on average WER.
Why do Whisper-style models write text on silence, and what does VAD fix or miss?
Training data often pairs silence or music with captions, making familiar text a plausible output. VAD removes much non-speech, but can miss music, cannot remove real background talkers, and may cut quiet speech.
What does “condition on previous text” do, and how can it cause loops?
It supplies the previous window's transcript as context, helping continuity but also priming a silent window to repeat prior text. Test it on long, pause-heavy audio.
Which signals can flag a bad transcript without a reference, and what fools them?
Length ratios can flag likely runaways or truncation; language checks and foreign letters can flag switches; compression and repeated n-grams can find loops; known phrases catch familiar inventions. Short prompts, numbers, jargon, and background speakers can fool these signals.
How do you choose detector thresholds and measure them honestly?
Label examples, split dev and holdout by speaker/call/type, tune thresholds only on dev, and report precision and recall by failure type on holdout. Compare simple baselines and ensure each failure type appears in both splits.
How do you measure a failure that happens on 2% of clips, and what does zero failures prove?
Use enough examples and repeated runs, report a rate with an interval, and distinguish stable from random failures. Zero events in n trials only bounds the rate at roughly 3/n (rule of three); it does not prove zero risk.
When is transcribing background voices an error?
It depends on the product: background speech is noise for “what did the caller say?” but content for meeting transcription. Define that policy explicitly; an audio-only detector cannot decide whether real speech is relevant.
Next up: a new model version scores 30% better. Chapter 4 asks whether it really is, or whether that's noise.