Key takeaways
- ✓Report WER per slice. An overall average mixes easy and hard audio in whatever proportion your test set happens to have.
- ✓Clean audiobook WER is a floor, not a forecast: every model got 4–25× worse on real calls and meetings.
- ✓Synthetic noise finds where a model breaks. It didn't predict which model wins on real audio.
- ✓Measure entity accuracy: WER gives "the" and an account number the same weight.
- ✓A test set is a versioned product. Fixing six reference errors moved every WER as much as a typical model upgrade.
A word error rate is only as meaningful as the audio it was measured on. Chapter 1 showed how to compute WER. This chapter is about what to compute it on: test sets that look like your real traffic, and the measurements a single average hides.
Slicing test sets vs. aggregate WER — evaluating on real-traffic slices, crucial entities, and versioned datasets.
One average describes someone else's product
An overall WER mixes easy and hard audio in whatever proportion your test set happens to have. If your customers send phone calls and your test set is audiobooks, the number describes a different product. The fix is slices: subsets that share one property (noisy, phone, accented, conversational, full of numbers). Report WER per slice, and gate releases on the slices that matter (Chapter 7).
There are three ways to get test audio, and each one can fool you differently:
| Source | Good for | How it can fool you |
|---|---|---|
| Real recordings (calls, meetings) | Realism: disfluencies, accents, real rooms | Expensive to label; references have their own errors |
| Transformed clean audio (+ noise, phone line, speed) | Controlled experiments: change one thing, see its effect | Real noise isn't added on top of clean speech; people talk differently in noise |
| Generated speech (text-to-speech) | Exact references, any content you want | TTS voices are cleaner and more regular than people |
Use transformations to find where a model breaks, real recordings to decide which model to use, and synthetic speech for content you can't find recorded.
Find the breaking point with a noise sweep
Noise is measured as signal-to-noise ratio (SNR), in decibels: 20 dB is a quiet office, 10 dB a busy café, 5 dB a loud street, and 0 dB means speech and noise are equally loud. A noise sweep runs the same clips at each level, which shows where each model breaks. Here are six models from the lab on babble noise, other people talking:
Ranking at 0 dB
- 1gpt-transcribe20.7%
- 2gpt-4o-mini (Dec)24.4%
- 3whisper-small27.2%
- 4nova-336.9%
- 5whisper-base45.8%
- 6gpt-4o-transcribe45.8%
Same loudness, steady pink noise instead of babble: whisper-base 16.4%, whisper-small 11.5%, gpt-4o-mini (Dec) 7.6%… Babble did 2–6× the damage.
Click a noise level to rank the models there. Hover a line to focus it.
Three things to notice:
- At 20 dB nobody notices. Between 5 and 0 dB the curves bend and the models spread apart. A single "noisy" slice at one level would miss that shape.
- The noise type matters as much as the loudness. At 0 dB, babble did 2–6 times the damage of steady pink noise. It's made of speech, so models confuse it with the speaker. One model transcribed a background voice outright: "the empty coffin remains", said by someone else in the mix.
- Same WER, different failures. At 0 dB babble,
gpt-4o-transcribehad 259 deletions where the others had 40–48: on 12 of 40 clips it wrote the first sentence and stopped. Read the errors, not just the number.
Watch out for one trap. gpt-transcribe degraded 28× from clean to 0 dB, the largest ratio in the table, and was still the best model at every level. Ratios exaggerate when the starting point is tiny.
Clean audio is a floor, not a forecast
The real test is real speech. On actual earnings calls and meetings, every model got 4–25 times worse than on audiobooks. And the transformed slices didn't predict the winner: gpt-4o-transcribe ranked 2nd–3rd on synthetic noise and last on both real slices. Click through the slices and watch the ranking reshuffle:
LibriSpeech read speech: the number most benchmarks quote.
- 1gpt-transcribe0.7%
- 2gpt-4o-transcribe1.2%
- 3gpt-4o-mini (Dec)1.5%
- 4nova-32.5%
- 5whisper-small2.8%
- 6whisper-base3.8%
WER: lower is better. Arrows show rank change vs. clean audiobooks.
Also notice the table microphone. Moving from a headset to one mic on the table made every model 1.7–3.9× worse on the same words, and the best headset model wasn't the best far-field model.
The words that matter
WER gives "the" and "4471-2209" the same weight. Entity accuracy counts only the words a customer cares about: account numbers, money, dates, names, drug names. Each kind gets its own comparison rule. For example, "4471-2209", "4471 2209" and "four four seven one two two zero nine" all match a digits entity, and a lost leading zero doesn't.
You can't use the WER normalizer for this, because it's wrong exactly where entities live: it turns 047 into 47 and 1-800-555-0199 into "one 800 555 199". Try the cases from the lab:
transfer 2400 dollars from account 4471 2209 to my savings
Expected digits: 44712209 · digit runs found in the transcript: 2400, 44712209
2 WER errors, but the account number is exactly right.
In the lab, the two metrics disagreed in both directions. 36 transcripts got every entity right but still had WER errors, mostly from number formatting. And 25 transcripts had exactly one word error, which broke the one entity that mattered: "Siobhan" → "Chavon", "lisinopril" → "lysinopril". The model rankings changed too: whisper-small.en was 4th by WER and tied for 2nd by entity accuracy.
Key-term boosting (giving the model a list of names and jargon) is the cheapest fix for names, and it worked: most missed names came back. But measure it with entity accuracy, not WER. One model's WER fell from 7.0% to 2.2% mostly because the prompt changed its style: it started spelling out numbers, which happened to match the references.
Count the empty transcripts
One failure every table above averages away: clips that come back completely empty. Across 738 clips, two models returned an empty transcript 10 times each, including clear speech like "Revenue grew fourteen percent…". In WER, an empty clip is just a batch of deletions averaged with hundreds of good clips. For the customer, it's total failure. Track it as its own number.
A test set is a versioned product
Treat your test set like code:
- Manifest and card. One file listing every clip, and a card saying what each slice is, how it was made, and what it can't tell you.
- Hold out by group, never by clip. In the lab, a random split put 27 speakers and 39 recordings on both sides of the dev/holdout line. Split by speaker, call or meeting.
- Errata, not edits. Reference corrections live in a reviewed file. When several models agree against a reference, check it: the lab found real errors ("10 perfect price gap" for "percent"), and one false alarm, "TOILETTE", which was correct all along.
- Versions. Applying six corrections moved every model's WER by 0.1–0.4 points, with no model changing. That's the size of a typical "improvement" from a new model version, so scores are only comparable on the same dataset version.
Practice: check the words that matter
Implement the lab's entity checks: digit_runs(), which turns "four four seven one, two two zero nine" into 44712209; an entity match for digits and names; and entity accuracy over a set. The tests use the lab's cases: number formatting, digits spoken as words, the lost leading zero, and the misheard name.
Quiz
1.Your customers call from cars and cafés, but your test set is clean audiobooks. Your model scores 2.8% WER. What does that number tell you about your product?
2.At 0 dB, babble noise (other people talking) and steady pink noise are equally loud. Which hurt the models more in the lab?
3.gpt-transcribe's WER went from 0.7% clean to 20.7% at 0 dB babble, a 28× increase, the largest in the table. Is it the most noise-fragile model?
4.A model transcribes a card number as "358" when the caller said "oh three five eight". The Whisper normalizer scores this as perfect. Why?
5.After adding key-term boosting (a vocabulary prompt), one model's WER dropped from 7.0% to 2.2%. What did the lab find was mostly responsible?
6.You split a test set into dev and holdout by picking clips at random. What's the risk?
Check your understanding
Try each question before opening its answer.
Why report WER per slice, and how do you choose slices?
Overall WER can hide weak conditions and rankings can reverse across slices. Choose slices from real product traffic: channel, environment, speaker, speaking style, and important content.
What are the strengths and traps of real, transformed, and synthetic test audio?
Real recordings are representative but costly to label; transformed audio isolates failure conditions but may not predict real-world rankings; synthetic audio gives exact, controllable content but is less natural. Use each for the question it can answer.
What is SNR, and what does a noise sweep show beyond one noisy slice?
SNR is 10·log₁₀(speech power ÷ noise power), in dB. A sweep shows each model's degradation curve and breaking point across noise levels.
Why can similar-WER models differ in noise, and what should you inspect?
Robustness and error type differ. Inspect substitutions, deletions, insertions, and examples: the same WER can mean the model gave up, misheard words, or transcribed background speech.
How do you measure important words, and why not use the WER normalizer?
Mark entities in references and score each with a task-specific comparison rule, such as digit-run matching for numbers. General WER normalization can erase distinctions like leading zeros or mishandle number formats.
What can key-term boosting fix, break, and how do you measure both?
It can improve names and jargon, but also insert boosted terms that were never spoken or alter output formatting. Track entity accuracy and false insertions, including decoy terms.
How do you split a test set into dev and holdout without leakage?
Split by the independent group such as speaker, call, or source sentence, keeping transformed copies together. Use a reproducible assignment and ensure important slices appear in holdout.
How do you find and fix reference errors, and what happens to old scores?
Use model disagreement to find candidates, then review them (consensus can still be wrong). Record confirmed changes in versioned errata and rescore every model because reference changes move old scores too.
Next up: some failures don't make errors, they make text. Chapter 3 is about models that write words on silence: "30 seconds of silence became 'Meghalaya, India'".