Speech to code converter
VoiceGem's speech-to-code converter turns a spoken code sentence into source with a lookup table, not a language model. Type "camel case user profile equals null" and get userProfile = null. The same pure function runs inside the Mac app, so the output here is the output there.
Given a spoken code sentence, produce the source line it becomes, in under 1 second.
const handler = async(request) =>
Take the phrase table with you.
The transform above is a lookup over 90 spoken phrases. Reading the whole table once is what turns this from a trick into something you use — most people settle on about fifteen phrases and never look again.
Open the complete spoken-phrase referenceVoiceGem has no mailing list and runs no drip sequence. An address left here is stored on voicegem.app for one purpose — sending you a single message when the code-dictation accuracy benchmark publishes — and is deleted after that send. The lawful basis is your consent, given by submitting this form; the field is optional and nothing is pre-selected. Leaving it blank costs you nothing on this page, because everything above is already yours. See the privacy policy.
This tool runs entirely in your browser. Nothing you type is sent anywhere, stored, or logged — the conversion is a JavaScript function on this page, and it works with the network off. The one exception is the email box under the result: an address left there is sent to VoiceGem, and nothing else on this page is.
What a speech-to-code converter actually does
A speech-to-code converter is the second half of dictating code. The first half is transcription — turning audio into words. That part is a machine-learning model, and every dictation tool has one. The second half is turning those words into punctuation, identifiers and structure, and that is where the tools differ from each other.
VoiceGem calls that second half the Deterministic Pass: it converts spoken symbols and casing commands into source code with a pure lookup-and-assemble function — no model inference, no network call. The converter above is that function, running in this page. It walks your sentence once from left to right. At each position it tries a casing command, then a symbol phrase matched three words first, then two, then one, then a whitespace command. A word that matches none of them passes through exactly as you typed it.
That last rule is the one that makes the whole thing usable. Because unrecognized words are left alone, an English sentence dictated into a code comment stays an English sentence. Try the "Plain English" sample above — nothing in it is a command, so nothing in it changes.
How to dictate code without a converter
Dictating code with plain macOS dictation, or with any dictation tool that has no code mode, means saying the punctuation out loud and accepting English words back. "const handler equals async open paren request close paren fat arrow" arrives as that exact sentence, spelled out. You then retype the symbols by hand, which is the work you were trying to avoid.
The workaround most people reach for is text expansion: define a snippet for "openparen" that expands to an open parenthesis, and one for every other symbol. It works for perhaps a dozen symbols. It breaks on casing — the part VoiceGem handles with a casing command — because a snippet cannot know that the next three words belong together as one identifier, and it breaks on spacing, because a snippet does not know whether the character it inserted should hug the token on its left.
The other workaround is to ask a language model to clean the transcript up. That works too, and for prose it is the right answer. For code it introduces a property you have to live with, which the next section is about.
Where the manual way breaks
Spacing is where hand-fixing a dictated line stops being quick. Source code has no single rule for the space around a symbol: an opening parenthesis hugs the token on both sides in a call, a comma hugs left and breathes right, and an equals sign breathes on both sides. VoiceGem stores those two flags per symbol and applies them when it joins the tokens, which is the difference between foo(bar) and foo ( bar ). Retyping that by hand on every dictated line costs more time than the dictation saved.
Casing is the second break. Saying "user profile" and wanting userProfile requires something that knows where the identifier starts and where it ends. A casing command in VoiceGem claims the run of ordinary words that follows it and stops at the first thing that is a symbol or another command, which is why "camel case total count plus one" gives totalCount + one rather than swallowing the rest of the line.
The third break is the one that only shows up after a week. A model-based formatter can return a different result for the same sentence on two different runs, because the model is sampling. For prose that is invisible. For code it means proofreading every line, which erases the speed you dictated for. A lookup table cannot do that: the same input produces the same output, and you can learn it the way you learn a keyboard shortcut.
What this page is, and what it is not
VoiceGem publishes this converter as a marketing tool built from product code. The converter is VoiceGem's own formatter, ported to TypeScript and checked against the Mac app's test vectors, but the page is not the app and cannot be. A browser tab cannot listen to you, cannot see which editor is focused, and cannot type into it.
VoiceGem on macOS 14.4 or later does those three things: it transcribes on-device, it notices that the frontmost application is your editor, and it runs this exact pass on the transcript before pasting the result where your cursor is. The gap between typing a sentence here and speaking one there is the entire product, and there is no honest way to close it inside a web page.
- The converter is free and unmetered. There is no daily limit, no sign-in, and no truncated output — it costs nothing to run, so capping it would be theatre.
- Every phrase it understands is published in full on the spoken symbol reference: 90 phrases producing 48 distinct outputs.
- The port is covered by the Mac app's own test vectors, so a divergence between this page and the app fails a test rather than misleading a reader.
Related: how the casing converter works, the spoken-symbol reference, or how the filler word remover works.
Common questions
No. The conversion is a JavaScript function running in your browser tab. Disconnect from the network and it keeps working. Nothing typed into the box is transmitted, stored, or logged.
Yes — the same algorithm over the same tables. The app's version is Swift and this one is TypeScript, and the Swift unit tests are ported alongside the code so the two cannot quietly drift apart.
Determinism. A table returns the same output for the same input every time, needs no network round trip, and never sends your source to a third party. A model can produce better prose and cannot promise any of those three.
Nothing at all. Unrecognized words pass through untouched, which is what lets you dictate an English sentence into a code comment without it being mangled into symbols.
Not in this browser tool — it ships the table exactly as VoiceGem ships it. The Mac app has a personal dictionary and word-replacement rules for project-specific vocabulary, which the word replacement rule tester on this site lets you try.