For years there was an unwritten rule in on-device speech transcription: if you wanted privacy, you accepted worse accuracy. Whisper models running locally gave you offline transcription that nobody else could listen to. The catch was that even the small model left a visible word error rate compared to big cloud STT services. You traded quality for not having your audio uploaded.
A benchmark published this week by the team behind Inscribe suggests that the tradeoff just collapsed on Apple hardware. Their new SpeechAnalyzer API, introduced in iOS 26 and macOS 26 to replace the old SFSpeechRecognizer, beats every Whisper model they ship on the standard LibriSpeech corpus at roughly a third of Whisper Small's compute budget per second of audio. It also beats the legacy Apple API by a factor of three to four on word error rate. The full results and raw transcripts are public.
This is worth unpacking because it changes how private transcription apps should pick their default engine.
The numbers
The benchmark used LibriSpeech, which is the standard comparable corpus for English speech recognition. It has two splits: test-clean (2,620 clean read utterances) and test-other (2,939 harder, noisier ones). Every engine ran fully on-device on an Apple M2 Pro with 32GB RAM running macOS 26.5.1. Word error rate, or WER, is the percentage of words an engine substitutes, drops, or invents. Lower is better.
The headline result: SpeechAnalyzer lands at 2.12% WER on clean speech versus Whisper Small at 3.74%. On the noisier split the margin is wider, 4.56% versus 7.95%. The legacy Apple API that SpeechAnalyzer replaced is dead last on clean speech, behind even Whisper Tiny, a 40MB model. If your app still uses SFSpeechRecognizer for anything longer than a voice command, the migration case is clear on accuracy alone.
Speed is not a separate conversation here. All five engines ran comfortably faster than real time on the M2 Pro, between roughly 12x and 40x. SpeechAnalyzer was about three times faster than Whisper Small per second of audio while also beating it on accuracy. The team withheld a precise timing table because the accuracy runs shared the machine with development workloads, which adds noise to timing but not to WER. They plan to publish dedicated timing numbers from an idle run.
Why this benchmark holds up
A benchmark from a company that sells one of the engines should be treated with suspicion. The team built two properties into the test to handle that.
The first is that the Whisper column should reproduce OpenAI's own published numbers on LibriSpeech, and it does. Their Whisper numbers land within 0.14 to 0.42 absolute WER points of OpenAI's, with a small consistent positive offset from a slightly stricter text normalizer plus CoreML quantization. That consistency matters. Random error would scatter in both directions; a small consistent positive offset is what honest reproduction looks like. If the same corpus, normalizer, and scorer produced the Apple numbers, those numbers inherit the validation from the Whisper numbers that anyone can check.
The second is that the raw transcripts are public. Every per-utterance hypothesis for both Apple engines is downloadable as JSON next to the reference text and per-utterance WER. If you disagree with their normalizer, you can rescore it yourself.
There are also a handful of details that decide whether a WER number means anything. Each engine ran through the exact production code path the app ships, not a lab harness with different buffering. Both sides passed through the same text normalizer mirroring OpenAI's English normalizer, which matters because scoring raw text punishes engines for formatting nicely rather than for mishearing. The corpus WER is total errors divided by total reference words, so short utterances do not get over-weighted. And SFSpeechRecognizer, which sends audio to Apple's servers by default, was forced into on-device mode with the harness refusing to silently fall back to the cloud.
What Whisper still has
SpeechAnalyzer is not a clean win across the board. Whisper keeps two real advantages that the benchmark is honest about.
Language coverage. SpeechTranscriber supports roughly 30 locales. Whisper covers over 100 languages. If your users are not speaking English or one of the other supported locales, Whisper is still the right call.
Platform portability. SpeechAnalyzer only runs on Apple platforms with OS 26. Whisper runs anywhere: Linux servers, Android, Windows, Raspberry Pi, anything with enough RAM to hold the model. For cross-platform apps covering both iOS and Android, you are carrying Whisper anyway for the Android half, so the question becomes whether the Apple half should now prefer SpeechAnalyzer for supported languages.
The Inscribe team changed their own defaults on the result. Their Auto engine now prefers SpeechAnalyzer where it supports the language and Whisper for everything else. Their framing is blunt: shipping a benchmark and ignoring it in your own defaults would be a strange kind of honesty.
What this actually changes
For developers shipping on-device transcription on Apple platforms, the default engine choice just shifted. If your app is iOS-only and English-only, the case for shipping both is now weaker than it was a month ago. SpeechAnalyzer gives you better accuracy, better speed, and no download size on top of the OS.
For cross-platform apps, you already needed Whisper. The question is whether the Apple path should branch to SpeechAnalyzer for supported locales. The accuracy and speed numbers say yes, with Whisper kept as the fallback for unsupported languages.
For users, the practical upshot is simpler. On a current iPhone or Mac, the best on-device English transcription no longer requires downloading a Whisper model. The private option is no longer the compromise option. That is a real shift. For people who run meeting transcription, voice journaling, or any audio text workflow and care about not uploading audio to a third party, the gap between private and cloud speech recognition on Apple hardware just got a lot smaller.
Limitations worth noting
The benchmark is English only. LibriSpeech is English read speech, so these numbers say nothing about the 100+ languages Whisper supports that SpeechTranscriber does not.
It is also read audiobook speech, not meetings. LibriSpeech is the standard comparable corpus, which is why the team started there, but accented, far-field, and multi-speaker meeting audio is the obvious follow-up. Anyone whose use case is recording a conference room with three overlapping voices should wait for that data before trusting the ranking.
It is one machine, an M2 Pro. Accuracy should transfer across Apple Silicon, but speed will vary by chip. An A17 or M4 will run faster; an older A14 may run slower, and the relative ranking against Whisper on those chips is not measured here.
And the Whisper models ran through WhisperKit CoreML quantized conversions, the same builds the app ships. Reference GPU implementations may differ slightly, which the validation table against OpenAI's published numbers quantifies.
A benchmark finding a shipping bug
There is a small detail in the writeup that I found quietly satisfying. The benchmark process found a shipping bug in the app itself. The Apple-engine file import fed audio to SpeechAnalyzer and closed the input stream, but never called finalizeAndFinishThroughEndOfInput(). Without that call the analyzer never delivers its final results, and the import hangs forever. It had gone unnoticed because the Auto setting preferred Whisper. The fix shipped the same day.
That is a small thing, but it is the kind of thing that happens when you measure your own product carefully. You find the things you were not looking for.
If you want to verify any of this yourself, the team published the summary as JSON and both Apple engines' raw per-utterance transcripts as downloadable gzip files next to the reference text. Rescoring with a different normalizer is a few lines of Python away.