Field guide · 14 Aug 2026

The Voice Optimization Stack

There are seven layers between your mouth and a computer doing what you meant. Six of them get all the attention. The one that decides whether any of it works is the one nobody writes about — and it sits near the bottom, where a wrong choice makes every layer above it look broken.

L5 binding — the layer
that decides everything
L1 the microphone —
where everyone starts

A better microphone improves a transcript. It cannot make a command fire. Fix the stack from the bottom of the action path, not the top of the audio path.

The order that matters

Seven layers, ranked by leverage

Everything written about voice input optimizes layers 1 through 3, because those are the ones you can buy. They matter — but they only affect how accurately your words are captured. They have no bearing on whether the computer does anything, and that is where the failures actually live.

Here is the whole stack, worst-return-first, with what each one is actually worth.

LayerWhat it isWorth fixing?
L1Microphone & roomReal but capped. ~90% → ~95–98% on clear speech. Buy once, forget.
L2Recognition engineMostly a trap — see below. The good ones can't do what you need.
L3VocabularyHigh, and almost free. Your proper nouns are mangled until you fix it.
L4Trigger phrasingVery high. A bad phrase fails ~50% of the time and fires when you didn't mean it.
L5Binding mechanismDecisive. Wrong choice here = 0% success, silently.
L6Command surfaceHigh. Most people hand-build things the OS already ships.
L7VerificationHighest of all, because without it you optimize the wrong layer for hours.
L7 — Start here

Verification comes first, not last

This is out of order deliberately. Without a way to measure, every other layer is guesswork, and the guesses are expensive.

When a voice command does nothing, there are exactly two possibilities and they are indistinguishable from where you're sitting: it never heard you, or it heard you perfectly and the action did nothing. They share no cause and no fix. Optimizing for the wrong one is how an evening disappears.

macOS keeps the number that separates them — one integer per command, incremented on every recognition — and surfaces it in no interface anywhere:

ReadingMeansFix the layer
count moved, nothing happenedRecognized. The action is wrong.L5 — binding
count never movedNot recognized at all.L4 — phrasing
count moved, wrong thing happenedPhrase collision.L4 — a built-in shares your phrase

Whatever you're debugging, the equivalent counter almost certainly exists and nobody has told you about it. Find it before forming a theory. I formed three.

L5 — The decisive layer

Reliability is a property of the binding

A voice command is a phrase attached to an action. Almost everyone focuses on the phrase. The action is what determines whether it works.

Modern desktop apps — Claude, Cursor, Slack, VS Code, Discord, Notion — are web pages in native wrappers. Their text boxes are HTML, not real controls. And a synthetic plain keypress sent to one of those is delivered and quietly dropped. No error. No bounce. Nothing in any log.

The same keypress with a modifier works fine.

Measured
Return → 0 · Cmd+Return → works

Bound to bare Return: recognized 8 times, sent zero messages. Rebound to Cmd+Return: recognized 7 times, landed in Claude, Cursor and Slack. Identical mechanism, identical event, one modifier key.

So sort every command you own into four tiers, and you can predict which will fail before testing any of them:

VerdictBindingCaveat
WorksModified keystrokeThe default choice. Verified.
WorksAccessibility action — click by label, menu itemNeeds the control to have a name.
WorksApp or URL launchNothing in the path to swallow it.
FailsBare unmodified keySilently. This is the whole problem.

The accessibility tier has a limit worth knowing. Pressing a button by its published name is app-agnostic by construction — you say one phrase and the OS finds the label in whatever is frontmost. It's excellent. It also needs the button to have a name, and plenty don't: Cursor's send arrow is an unlabelled icon, so the command fired thirteen times and pressed nothing. That removes the need for per-app code, not the need for a per-app name.

L4 — Phrasing

A trigger must be unsayable

While the system is transcribing, your trigger phrase is competing with the sentence. The recognizer has to decide, live, whether those words were a command or more dictation. A conversational phrase loses that decision about half the time.

And it fails in both directions. My original send trigger had these aliases on it:

PhraseProblem
send itAbsorbed into the transcript about half the time you mean it.
that's itSaid constantly in ordinary speech — fires mid-thought.
go aheadSame. Each one submits a half-written message.

The fix isn't a cleverer phrase, it's a carrier word that never occurs in speech. Nothing collides with “punch,” so punch it and punch send can both exist with zero risk of a false fire — and because the carrier protects them, you can hang as many sloppy aliases off it as you like. That's the part people miss: distinctiveness is what buys you the freedom to be loose everywhere else.

Two or more words, no single syllables. That happens to be Apple's own published guidance, arrived at from the other direction.

One consequence nobody warns you about: you cannot talk about a command without firing it. Announce one out loud and it executes. There's a commands-only mode for exactly this — switch to it before discussing your own setup.

L6 — Command surface

Stop building what the OS ships

macOS ships 161 built-in voice commands. Almost nobody knows, because the catalog is a property list inside an input method bundle and the spoken phrasing is compiled into the binary.

The practical consequence: people hand-build brittle replacements for things that already exist and work better. My own setup had four background daemons and eleven helper apps, every one of them shaped around a single editor, all solving problems the OS didn't have. Two of the four had never even loaded, and nothing had noticed — which is its own tell.

Worth knowing about specifically:

CapabilityWhy it matters
Click by label · numbered overlay · full-screen gridPress anything, named or not, with no code.
Select and correct phrases by quoting themFar better than character-level editing.
Add a word to vocabulary by voiceRoutes around the undocumented vocabulary import format.
Create a command by voiceNo plist editing at all.
Show the live command list, per appThe only authoritative source for real phrasing.

And a trap in the other direction. A custom command silently disables the built-in that shares its phrase. I had scrolling hand-bound to bare page keys — the failing tier — which had switched off the OS's own accessibility-based scrolling. A working native action replaced by a broken keystroke, invisibly, with nothing anywhere saying so. Check whether the platform already ships a verb before you bind it yourself.

L2 — The engine trap

The best transcription can't help you

This is where I started, and it was the wrong end of the problem entirely.

Local speech-to-text has gotten genuinely excellent — models running on-device, no cloud round trip, no subscription, better raw accuracy than the OS. So the obvious move is to install one and use it as your ear.

It doesn't work, for a structural reason no review mentions: the entire category is push-to-talk or toggle. There is no open-mic mode to enable. Every one of them requires you to press something, which fails the only requirement that mattered — don't make me touch the keyboard.

The platform's own always-listening mode is worse at transcription and the only thing that can actually do the job. So check for a continuous mode before evaluating accuracy. Accuracy is worthless if the trigger is a key you already said you wouldn't press.

What the good local engine is for: meeting capture and file transcription, where a hotkey costs nothing.

L3 & L1 — The cheap wins

Vocabulary, then the microphone

Vocabulary is the highest-return thing you can do in five minutes. Untuned, every proper noun in your working life comes out wrong — product names, colleagues, your own company. The pane exists, it syncs across your devices, and a widely-copied claim that macOS has no custom vocabulary is simply false.

Its import file format is undocumented, so entries go in one at a time — or by voice, using the built-in that adds a selected word directly.

The microphone is real but capped. Roughly 90% accuracy on the built-in mic in a quiet room, 95–98% with a decent external one on clear speech at conversational pace. Background noise costs more than any setting. It's a one-time purchase and then you stop thinking about it — which is exactly why it's the wrong thing to start with.

The stack, assembled

What this actually looks like working

The whole configuration
punch it

Apple Voice Control listening continuously, one command bound to Cmd+Return, a handful of app-switch commands, and the OS's own built-ins for everything else. Seventeen spoken commands total.

It replaced four background daemons, eleven helper apps, and a local speech engine that had never successfully transcribed a single word.

The order to fix your own stack, then: build the measurement first (L7), get the binding right (L5), make the trigger unsayable (L4), delete whatever duplicates a built-in (L6), load your vocabulary (L3), and buy a microphone whenever (L1). Skip L2 unless you want meeting transcripts.

The generalisable version has nothing to do with voice: a system's reliability is a property of the mechanism you bound to, not the surface it lands on — and the layer reporting success is the one lying to you. Settings correct, command fired, exit code zero, nothing happened.

Set it up → GitHub ↗ The evening it took

Everything measured on macOS 26.6, against Claude, Cursor and Slack. Tooling, the complete undocumented command format, the 161-command catalog and the diagnostic are open source at github.com/justinfowler925/voice-mode — MIT. Where a claim here is inferred rather than verified, the repo says so.