The dictionary, and getting your words right
Unbiased, the speech model writes shadcn as "shadkin" and useEffect as "use effect". One line of vocabulary fixes both, on your own machine, before anything is sent anywhere. This page walks the accuracy levers in order of what they buy you — your own words first, then vocabulary packs, model size and the microphone — and ends with the dictionary file's own reference, including the two caps that decide which half of it to reach for.
The dictionary, and getting your words right
In rough order of what they buy you.
Teach it your words. The biggest lever, and the only one that costs no latency: unbiased,
base.en renders shadcn as "shadkin" and useEffect as "use effect", and one line of vocabulary
fixes both. Select a word anywhere and press Ctrl+Win+D, or edit
%USERPROFILE%\.deixis\dictionary.toml — the Dictionary tab is that same file (Vocabulary
libraries, Words to expect, Fixes, Filler words).
Two caps decide which half of the file to reach for. Only the first 36 terms reach the whisper
prompt: each costs ~1 ms of decode and past 36 accuracy measurably degrades, so the cap is a
measurement rather than a guess. Overflow is not thrown away — up to 256 terms still go to the
cleanup model, which is also what carries your words into translate — but it stops biasing the
transcription itself, and the editor tells you when you are over. [[replacements]] are
unbounded: applied at word boundaries after the decode, matched case-insensitively, landing
verbatim. Past the cap, put new corrections there.
Switch on a vocabulary pack. Whole libraries rather than words one at a time. Five ship built
in — Software development (developer, on by default), Accounting & finance (accounting),
Business & product (business), Medical (medical) and Legal (legal) — each sized to
fit the prompt whole on its own. Drop your own .toml into %USERPROFILE%\.deixis\packs\ and it
appears beside them under the same packs = [...] key. Enabling several overflows the 36-term cap,
which the editor reports rather than hides.
Move up a model size. Settings → Speech model offers base.en ("Standard (fast)") and
small.en, whose control reads "Higher accuracy (~3x slower decode, 465 MB)" — the cost is on the
control because it is your call to make. It downloads on switch and is hot-swapped into the running
engine with no restart. Worth it for long prose; not worth it if the dictionary already fixes what
you are getting wrong.
Use a better microphone. No software lever recovers a word the microphone never captured, and a headset beats a laptop array in exactly the conditions that break dictation — a room with other people in it. Settings → Microphone switches device live, so this is cheap to test both ways.
Know what cleanup can and cannot fix. The LLM second pass rewrites prose, not hearing: it
never learns what you actually said, so a misheard proper noun stays misheard, and cleanup is
deliberately forbidden from re-casing anything but the first character so that it cannot undo the
biasing above. Mishearings are the dictionary's job. What it does buy is punctuation, structure
and transforms, with your vocabulary and your previous utterance in that field sent along so it
keeps your spellings and follows on from what it just wrote. Settings → Cleanup chooses when it
runs — When it helps (auto, the default), Every time, Never — and with no endpoint
configured all three behave as rules-only. The table of what leaves your machine says exactly what each
choice sends.
User dictionary
%USERPROFILE%\.deixis\dictionary.toml — all keys optional, a parse error falls back to defaults
with a warning:
# Extra terms whisper should recognise. Extends the builtin dev-stack list
# (set include_defaults = false to replace it). Capped at 36 terms in the
# prompt: each term costs ~1 ms of decode and past the cap accuracy degrades —
# the startup line tells you when you are over.
vocabulary = ["Infisical", "Hyperdrive"]
# Words to strip in addition to the builtin "um/uh/erm/..." list.
extra_fillers = ["basically"]
# Post-ASR corrections, applied at word boundaries in file order. Matching is
# case-insensitive; the replacement lands verbatim. Unbounded and free —
# prefer these over vocabulary terms once you hit the prompt cap.
[[replacements]]
from = "shadkin"
to = "shadcn"
[[replacements]]
from = "use effect"
to = "useEffect"
The behavioural contract is core/tests/dictionary_vectors.json — 32 vectors covering fillers,
corrections, and casing invariants, run by cargo test.
Keep reading
From the blog
Teach dictation your vocabulary: names, jargon and acronyms
When dictation mangles names, jargon and acronyms, a custom vocabulary fixes it. How to teach Deixis your words, which to add, and why the list is capped.
How to type by voice in any Android app, with the speech recognised on the phone
Dictate into any Android app's text field from a floating microphone. Speech recognition runs on the phone, and meetings are transcribed there too.
How to type by voice in any app on a Mac, with the speech recognised on the Mac itself
How to type by voice in any app on a Mac: hold Ctrl+Option, speak, let go. Speech recognition runs on your Mac, free and with no account.
Hold a key. Speak. Keep working.
Deixis is free, needs no account, and runs on your own device.
v1.2.2 · 64‑bit Windows 10/11 · macOS 13 on Apple silicon · 51 MB · nothing else to install · also for Windows