Key takeaways
- ✓WER = (substitutions + deletions + insertions) ÷ words that were said. Lower is better.
- ✓WER can go above 100%: one invented sentence on a one-word clip scores 600%.
- ✓Report corpus WER (total errors ÷ total words), never the average of per-clip WERs.
- ✓The normalizer is part of the metric. Change it and the same transcripts can score 98% or 4%.
Every speech-to-text evaluation starts with one number: word error rate. It's simple to compute, and it's the number every model card, benchmark, and vendor slide quotes. It's also easy to get wrong, and easy to misread. This chapter covers how it works, then the traps.
Line it up, then count
You need two texts: the reference, what was actually said (written by a person), and the hypothesis, what the model wrote. Line them up word by word using the fewest edits, then count three kinds of mistake:
| Error | Meaning |
|---|---|
| Substitution (S) | A word was written as a different word |
| Deletion (D) | A word that was said is missing |
| Insertion (I) | The model wrote a word nobody said |
REF: schedule a meeting with john tomorrow ******
HYP: schedule a meeting with jon tomorrow please
S I
WER = (S + D + I) ÷ number of reference words. Here that's 2 ÷ 6 = 33%. Try it yourself, and edit either sentence to see the alignment change:
Top row: reference. Bottom row: hypothesis. S = substitution, D = deletion, I = insertion.
WER = (1 + 0 + 1) ÷ 6 = 33.3%
Four things WER doesn't tell you
The formula is short, and that's why its quirks surprise people:
- It can pass 100%. Insertions have no limit. In the lab, a model that heard "yes" and wrote "yes thanks for watching and please subscribe" scored 600% on that clip. (Chapter 3 is about exactly this failure.)
- It isn't symmetric. The reference sets the denominator. Swap the two texts and you get a different number. Use the swap button above to see it.
- Every word weighs the same. "fifty" → "fifteen" in a bank transfer costs one error, exactly like "to" → "into". A good WER can still hide the one word your product depends on. (Chapter 2 adds entity accuracy for this.)
- It hides where the errors are. 5% could mean a few small slips everywhere, or three clips that are completely wrong. Those need different fixes. In the lab, one model had 57% of all its errors in just 5 clips.
Corpus WER, not average WER
A test set has many clips, and there are two ways to turn them into one number:
- Corpus WER: total errors ÷ total reference words, over the whole set.
- Average WER: compute WER per clip, then average those.
Always report corpus WER. The average gives a two-word clip the same weight as a 40-word one, so a single slip on a short clip dominates the result. In the lab, the same two clips gave 4.8% as corpus WER and 26.2% as an average. The sliders start with a similar pair, a 2-word clip and a 40-word clip, each with one error. Move them to see how the two numbers react:
Corpus WER is 2 errors ÷ 42 words. The average lets one slip on a 2-word clip count as much as a whole 40-word clip.
The normalizer is part of the metric
Before counting, both texts are cleaned up the same way: lowercase, drop punctuation, and usually more. Without that, "Mr. Smith paid $25." vs. "MISTER SMITH PAID TWENTY FIVE DOLLARS" is almost every word wrong.
How much does it matter? In the lab, whisper-base.en scored 98% WER with no normalization, 4.0% with basic cleanup, and 4.3% with OpenAI's Whisper normalizer, on the same transcripts. The raw number was measuring capital letters, not hearing. And for two close models, the normalizer even picked the winner: one model won under basic cleanup, the other under the Whisper normalizer, by a margin of a few words out of about 1,700.
So a WER without its normalizer can't be compared with anything. Every model in a comparison must use the same one, and your results should record which one (and which version) was used.
Read the errors, not just the number
The most useful thing you can do after computing WER is look at the worst clips. In the lab, every clip was English and every request set language="en", yet some models translated instead of transcribing: "Where's Milicent" came back as Portuguese, a sentence about alkaloids as German. In WER, each of those is just a few more errors averaged with 99 good clips. They need their own metric, which is where the next chapters go.
Practice: write WER yourself
The best way to really understand WER is to build it. Fill in the three TODOs below: the edit-distance table, the walk back through it, and corpus WER. Then run the tests. They're the same cases as above, from the lab: the misheard name, the swapped words, the 600% clip, the asymmetry, and corpus vs. average. You can also download the files and run them locally with pytest.
Quiz
1.Reference: "the cat sat". The model wrote: "the cat sat on the mat". What's the WER?
2.A test set has a 2-word clip with 1 error and a 40-word clip with 1 error. Which number should you report?
3.whisper-base.en scored 98% WER on raw text and 4% after basic normalization, on the same transcripts. What does that tell you?
4.Two correct WER tools give the same total errors on a clip but different substitution / deletion / insertion counts. Why?
5.A new model version is 1.4 points better in WER. Better clip by clip on 14 clips, worse on 6. What should you do before calling it an improvement?
6.Every model you test gets the same word wrong. What do you suspect first?
Check your understanding
Try each question before opening its answer.
How is WER calculated, and what are S, D and I?
Align the reference and hypothesis using the fewest word edits. WER = (substitutions + deletions + insertions) ÷ reference words.
Why can WER be above 100%, and why isn't it symmetric?
Insertions are unlimited while the denominator is reference words, so a short reference can have many extra hypothesis words. Swapping reference and hypothesis changes the denominator and which edits count as insertions or deletions.
Why report corpus WER instead of the average of per-clip WERs?
Corpus WER divides total errors by total reference words, so each word has equal weight. Averaging clip rates overweights short clips and can produce a very different score.
What does normalization do, why does it matter, and what can go wrong?
It applies the same text policy to reference and hypothesis so formatting differences do not count as recognition errors. Pin and test the normalizer: it can miss equivalent forms, transform text incorrectly, or erase meaningful disfluencies.
What do you need to record so a WER number can be reproduced?
Record the dataset version and audio/reference hashes, normalizer and version, model version and settings, code version, and (for latency) hardware and network conditions.
How do you compare models that differ on accuracy, speed and cost?
Remove dominated models first, then select against explicit product requirements such as a maximum slice WER, latency limit, or budget. Compare on representative product audio, not only an overall score.
Two versions differ by 1.4 WER points. What else do you need before calling it an improvement?
Estimate noise with a paired comparison on the same clips, inspect which slices and clips changed, and verify the result on representative product audio. A point difference alone does not establish a real or useful gain.
Every model gets the same word wrong. What do you suspect, and what do you do?
Check the reference and normalization policy before blaming every model. Confirm corrections by review, record them in versioned errata, and rescore all models against the new dataset version.
Next up: a single WER on clean audiobooks says little about phone calls or noisy rooms. Chapter 2 builds test sets that match real audio.