Home › Silent truncation

Measurement

When Whisper stops early and says it finished

We ran 5 Whisper models across 29 languages through the shipping app. 10 runs came back with part of the audio transcribed and no error raised. Here is the data, the detection method, and what it says about the models we offer.

100%on-device — audio never uploaded
Freeto download — Pro unlock $49.99 once
99languages, auto-detected
macOS 13+Apple Silicon (M1+)

The failure mode nobody scores for

A speech model can fail in two directions. It can produce the wrong words — that is what word error rate measures, and it is what every benchmark reports. Or it can simply stop: return a transcript that is correct as far as it goes, covering the first fraction of the audio, and hand it back as though it were finished.

The second failure is much worse in practice and much rarer in benchmarks, because a transcript that stops early still scores as "a result". In our own matrix it produced a run that returned 113 of 521 reference words for Norwegian — 22% of the audio — after spending 30 minutes of compute to do it. The text it did produce was correct, aligned sentence for sentence with the reference. It stopped after 9 segments.

Our own pipeline logged that run as COMPLETED. No error, no warning, no partial-result flag. That is the part worth writing down.

What was measured

5 Whisper artifacts from the large-v3 family, across 29 languages, 143 of 145 cells. Audio is digit-free, level-normalised FLEURS — read speech with published reference transcripts — at roughly 460–2,520 units per language.

Every run went through the shipping application on a macOS 15 virtual machine, not through whisper-cli. That distinction matters: it means voice-activity detection, the hallucination filter, loudness normalisation and the language clamp were all in the path, exactly as a user would have them. Language was hard-clamped per run and honoured in all 143 cells; the model actually loaded matched the model requested in all 143 cells. The two absent cells are Hindi on both large-v3 artifacts, which did not complete at all.

ModelSizeLanguagesMean errorMedianTruncated runs
Large V3 Turbo Q8 not in the picker834 MB299.16%6.80%none
Large V3 Turbo1.6 GB299.52%7.23%none
Large V3 Turbo Q5 shipping default547 MB299.99%7.81%1 of 29
Large V33.0 GB2824.64%15.80%5 of 28
Large V3 Q51.0 GB2826.66%18.66%4 of 28

Where it happened

Coverage below is the transcript length divided by the reference length — how much of the audio came back:

Every extreme cell in this matrix is short, never long. Not one run in 143 overran its reference by more than half. That is the opposite sign from the repetition-loop failure — the one where a model gets stuck and emits the same phrase for minutes, giving coverage of five times the reference or more. Both are catastrophic and both are invisible to a spot check, but they are distinguishable by the sign of the same number, which is what makes a single check able to catch both.

You can detect this without ground truth

This is the part that transfers. Word error rate needs a reference transcript, which in production you never have. Coverage does not: you already know how long the audio was, and you can see how much transcript came back.

In this matrix the two populations separate cleanly:

RunsMean coverageMean error rate
Truncated10 0.44 65.90%
Healthy133 1.01 12.10%

The 0.80 threshold is not fitted to the data. The highest coverage among truncated runs is 0.75 and the lowest among healthy runs is 0.82, so there is an empty band between the two populations and any cut inside it gives the same answer. On a corpus without that gap you would need to pick more carefully — and you would be able to see that you had to.

A rough production version: compare the timestamp of the last returned segment against the duration of the file. If a transcript ends at 0:31 of a five-minute recording, that is checkable at runtime, on the user's machine, with nothing to compare against.

Truncation inflates the score it hides in

Because a stopped transcript is scored as though it were a bad one, truncation contaminates the headline number. Large V3 averages 24.64% across all 28 of its languages. Drop the 5 truncated runs and the remaining 23 average 15.25% — so roughly 9.4 points of its error rate is not the model mis-hearing anything. It is the model not being there.

The honest reading cuts both ways: even with truncation excluded, Large V3 does not catch the 834 MB turbo quantisation, which averages 9.16% across all 29 languages and never truncated once. Size did not predict reliability here, and it did not predict accuracy either.

What this says about what we ship

Stated plainly, because it is the reason this page is worth publishing rather than filing:

Scope and limits

The transcripts were kept this time. In an earlier sweep they were overwritten by the next run's configuration step, and truncation had to be inferred from word counts — which is exactly why it went unnoticed for as long as it did. "Worse error rate" and "stopped early" look identical in a results table.

Download on the Mac App Store

Free to download. One-time unlock. No subscription. · Pro $49.99 one-time · macOS 13+

FAQ

What is silent truncation in speech recognition?

A model returns a transcript covering only part of the audio and the surrounding pipeline reports success. The text that is present is usually correct, so nothing looks wrong until someone compares the transcript against the recording. In this matrix it affected 10 of 143 runs, all of them on the larger models.

How can I detect a truncated transcript without a reference?

Compare what came back against what went in: the end timestamp of the last segment versus the duration of the audio file, or transcript length versus expected length. Neither needs a ground-truth transcript, which is what makes the check usable in production. In this data, truncated runs averaged 0.44 coverage against 1.01 for healthy ones.

Does a bigger Whisper model give better results?

Not in this matrix. The two largest artifacts posted the highest mean error rates and were the only ones that stopped early, while an 834 MB quantisation of the turbo model posted the lowest mean (9.16%) and never truncated. Download size predicted neither accuracy nor reliability here.

Is this a bug in Whisper or in the app?

Undetermined, and the page does not claim to know. What is measured is that the condition occurs and that the surrounding pipeline did not notice it. The proposed coverage guard is a mitigation at the application layer, which is the layer we control; it does not diagnose the underlying cause.

Can I reproduce this?

The corpus is FLEURS, which is public. The per-cell figures on this page are computed from a results file rather than typed, and the method is described above in enough detail to re-run: hard-clamp the language, keep the transcripts, and record transcript length alongside error rate.

Related