ealeng
Menu

Episode 02 of 10

Test sets that match real audio

One WER on clean audiobooks describes someone else's product. Build slices that match your traffic: noise, real calls, the words that matter, and the outputs that come back empty.

Lab 02 · Speech Test Sets7 min read
Video transcript5:22

0:00Intro

0:01

My best speech-to-text model got less than one percent of the words wrong on audiobooks. On real phone calls: almost twenty times more.

0:10

Here’s how I built a test that sounds like real calls, and what it found.

0:14Back to my shortlist

0:16

Last time, I tested eight models on audiobooks, and shortlisted two: gpt-transcribe, the most accurate, and nova-3, the fastest.

0:25

But audiobooks are quiet, and read slowly. My callers will be on phones, in busy rooms, saying names and account numbers. So I need test audio that sounds like them.

0:3601 · Slices

0:38

So I split my test into slices: groups of clips that each sound like one real situation.

0:44

Some are real recordings: company phone calls, and meetings, with a headset or a microphone on the table. Others are clean clips I made harder on purpose, with a phone line, noise, or people chatting.

0:57

Every model gets a score per slice, instead of one average. Let’s start with the noise.

1:0302 · Turning up the noise

1:04

To make noisy slices, I take clean clips and mix in noise on purpose. The answer key stays the same. Here’s one clip, clean.

1:12

🔊 clean: “Forgive me, I hardly know what I am saying…”

1:17

And here it is with four other people talking, as loud as the speaker.

1:21

🔊 the same clip, with chatter at zero decibels

1:26

Noise level is measured in decibels: how much louder the voice is than the noise. At twenty, the noise is far quieter. At zero, it’s just as loud.

1:3602 · Where models break

1:38

Here’s every model, as the chatter gets louder.

1:41

At twenty and ten decibels, almost nothing changes. Then the lines shoot up. At zero, the models get a fifth to nearly half of the words wrong.

1:50

And people talking does far more damage than steady noise at the same loudness: two to six times more errors.

1:5703 · Same score, different failure

1:59

But two models with similar scores can fail in completely different ways.

2:03

This one, gpt-4o-transcribe, wrote the first sentence, and stopped. It did that on twelve of the forty clips.

2:11

Whisper small did something stranger. It wrote: the empty coffin remains. That’s nowhere in the answer key.

2:18

But someone did say it: one of the four background voices. The model wrote down the wrong person.

2:24

To the error rate, both are just a pile of errors. You only see the difference when you read them.

2:3004 · Real calls

2:31

Now the real thing: recordings of real company phone calls.

2:35

🔊 a real call: “Let’s just go to slide thirty-five…”

2:41

Real speakers hesitate, restart, and speak with all kinds of accents. Here, one model just stopped at slide thirty-five.

2:49

On real calls, every model got four to twenty-five times worse. Even my best, gpt-transcribe: from under one percent, to thirteen and a half.

2:59

Now, a question. One model did fine with added noise, but came last on real calls. Which one?

3:07

gpt-4o-transcribe. Second or third with added noise. Last on real calls, and last on meetings.

3:15

So noise you add on purpose doesn’t predict real speech. You need real recordings in your test.

3:2105 · The words that matter

3:23

For a support line, some words matter more than the rest: names, account numbers, medicines.

3:28

So I made sentences full of them, had computer voices read them over a phone line, and checked one thing: did each name and number come out right?

3:37

Look at this one. Both models made just one mistake in the whole sentence. One wrote Chavon instead of Siobhan. The other, Wynne instead of Nguyen.

3:47

A nine percent error rate. But the customer’s name is wrong, and that’s the mistake that matters.

3:52

Scored this way, the ranking changes. gpt-4o-transcribe, last on real calls, gets the most names right here.

4:01

And every number came out right. But a computer voice reads numbers slowly and clearly. Real callers don’t, so I don’t call that solved.

4:1006 · An empty answer

4:11

And then I found this. Remember nova-3, my fast pick? Listen.

4:15

🔊 “Cold Lake has been a really positive story throughout 2021.”

4:20

A perfectly clear sentence. And nova-3 wrote: nothing. An empty transcript.

4:26

It did that on ten clips. Some came from a far-away table microphone, where there’s little to hear. But some were perfectly clear: real calls, and a sentence about revenue.

4:37

To the error rate, that’s just some missing words. To a caller, the assistant heard nothing at all.

4:4307 · My pick

4:44

So, my pick: gpt-transcribe. The best on real calls, and on meetings with a headset.

4:50

Nova-3 isn’t out. It’s faster, and usually good. But it sometimes drops clear speech, and in production, I’d never know.

4:58

Because in production, there’s no answer key. So how do I catch an empty answer, or a made-up one, as it happens? That’s next time.Yuki: No answer key in production… so how do I catch it? 🤔

5:07Summary

5:08

Split your test into slices. Test on real recordings, not just added noise. Score the words that matter. And count empty answers.

5:17

Then your test sounds like your customers.Yuki: Thanks! 😄

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: an overview of test set slicing matching real traffic, entity accuracy beyond WER, and test sets as versioned products. 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:

Try it · Noise sweepReal results from Lab 02 · babble noise
0%10%20%30%40%50%clean20 dB10 dB5 dB0 dB

Ranking at 0 dB

  1. 1gpt-transcribe20.7%
  2. 2gpt-4o-mini (Dec)24.4%
  3. 3whisper-small27.2%
  4. 4nova-336.9%
  5. 5whisper-base45.8%
  6. 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-transcribe had 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:

Try it · Same models, different slicesReal results from Lab 02

LibriSpeech read speech: the number most benchmarks quote.

  1. 1gpt-transcribe0.7%
  2. 2gpt-4o-transcribe1.2%
  3. 3gpt-4o-mini (Dec)1.5%
  4. 4nova-32.5%
  5. 5whisper-small2.8%
  6. 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:

Try it · WER vs. entity accuracyEdit the transcript
Reference · what was said

transfer 2400 dollars from account 4471 2209 to my savings

WER
20.0%
Word errors
2
Entity · digits
✓ correct

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.

Try it · Practice in PythonRuns in your browser · ⌘/Ctrl + Enter to run
entities_practice.py54 lines

Quiz

Try it · Check your understanding0 of 6 answered
  1. 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. 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. 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. 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. 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. 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'".

Learning something useful?

New labs, articles, and videos on evaluating and testing AI systems come out regularly. Follow along so you don't miss the next one.