No accuracy number is published here yet
Voice Type has no measured word error rate on this site, and this page will not invent one. Every number we publish ships with the script that produced it, and the word error rate benchmark is blocked: the app has no headless entry point, so a corpus cannot be driven through the recogniser without a person at the keyboard. Until that entry point exists, none of the numbers below are accuracy numbers. They are transport and payload numbers, and a reader should not mistake one for the other. Treat vendor accuracy percentages, ours included when they arrive, as meaningless without a named corpus and a repeatable script.
The fixed tax a cloud request pays before any audio moves
Measured on an Apple M1 Pro, macOS 26.5.1 build 25F80, over home Wi-Fi on 2026-08-29. Twelve iterations per endpoint. No API key and no audio were sent, so the timed response is an unauthenticated rejection: a real round trip through the provider edge with zero inference. Repro script bench/connsetup.py --profile wifi --repeat 12, raw samples in bench/results/03-connection-setup-20260829T065129Z.json.
| Endpoint | Setup before any audio, median | p95 |
|---|---|---|
| api.openai.com | 30.9 ms | 61.0 ms |
| api.deepgram.com | 514.9 ms | 766.2 ms |
| On device | none of it | none of it |
Same machine, same connection, same minute, and the fixed cost differs by a factor of 17 between two well-run providers. Deepgram is not a slow service; its 252.9 ms median TCP connect is a distant point of presence relative to this Mac. The caveats travel with the number: the macOS DNS cache was warm after the first request, this is one machine on one connection at one moment, and a real request also uploads audio and waits for a model on top of this floor.
What thirty minutes of dictation weighs
Bytes measured by encoding real audio. Repro script bench/payloadsize.py, raw samples in bench/results/05-payload-size-20260829T070405Z.json. A cloud recogniser has to receive one of the first three columns. An on-device one receives none of them.
| 30 minutes of dictation as | Uploaded |
|---|---|
| Raw 48 kHz WAV | 172.8 MB |
| 16 kHz WAV | 57.6 MB |
| Opus 24k | 5.25 MB |
| On device | 0 bytes |
Caveat that changes the lossy rows: this run encoded the synthetic say corpus rather than human speech, and Opus and AAC are variable bitrate, so their sizes move with content. The WAV rows are unaffected.
What the recogniser actually receives
A Whisper-derived model expects 16 kHz mono speech at a fairly narrow loudness range. A MacBook microphone delivers 48 kHz audio at whatever level the room and your seating position produced, with desk knocks and building rumble underneath it. The conditioning chain closes that gap. Each stage corrects one specific defect, and the stages are ordered because a later one depends on the earlier one having run.

The stages, and the defect each one corrects
- Silero voice activity detection: a streaming speech gate marks speech islands, so silence and steady background noise never reach the decode and the recogniser is not asked to transcribe a fan.
- High-pass filtering: a 50 Hz high-pass removes desk thumps, footsteps, and building rumble that sit below the speech band and eat headroom.
- Loudness normalisation: K-weighted normalisation corrects for microphone distance and for the volume drift that happens when you lean back mid-sentence. The target depends on the path: −14 LUFS for file transcription, −16 LUFS by default for live dictation, −18 LUFS on the alternate live topology.
- Band-limited resampling: 48 kHz to 16 kHz through a low-pass, so content above 8 kHz cannot fold back into the speech band as aliasing the speaker never produced.
- No corrective prompt layer: we do not run heavy-handed LLM cleanup over the transcript. It makes output read confidently while drifting from what was said, which is the worst kind of accuracy failure because it is invisible.
What no stage in this chain fixes
- A bad microphone: conditioning rescales and filters what is there. It cannot recover speech energy the capture never contained.
- Competing speech: the gate detects speech. Another person talking is speech, so it goes through.
- Proper nouns the model has never seen: custom vocabulary helps, but an unusual surname or an internal codename will still come out wrong some of the time.
- A category mistake: no dictation app substitutes for Voice Control when the real need is hands-free command of macOS.
Where the engineering detail lives
- Band-limited resampling from 48 to 16 kHz, including what aliasing sounds like when the filter is missing.
- The on-device pipeline, step by step, from the speech gate to Metal-backed inference.
