Skip to main content

Measurements

What Mac dictation costs before a word is recognised

Cloud dictation pays a fixed tax in connection setup and upload bytes before any model runs. Those two costs are measured here on one Mac, with the script for each. Recognition accuracy is not measured here, and this page says so rather than filling the gap with a number.

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.

EndpointSetup before any audio, medianp95
api.openai.com30.9 ms61.0 ms
api.deepgram.com514.9 ms766.2 ms
On devicenone of itnone 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 asUploaded
Raw 48 kHz WAV172.8 MB
16 kHz WAV57.6 MB
Opus 24k5.25 MB
On device0 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 Voice Type window on macOS, showing the Custom Vocabulary pane. A Custom Words field takes comma-separated terms, and a Find and Replace list holds 108 entries mapping spoken phrases such as open parenthesis to the characters they insert.
Custom vocabulary and spoken-punctuation replacement in the app. Screenshot of Voice Type on macOS, unretouched.

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