Magnum Vox

Hold Control, speak, release. Fully offline dictation, no account, no per-word cost.

macOS only Apple Silicon or Intel Runs fully offline after setup No account required

1Unzip and open a terminal in the folder

Unzip this archive anywhere you like. Then open Terminal and get it sitting inside the unzipped folder, without typing a path by hand:

  1. Open Terminal.
  2. Type cd (with a trailing space) but do not press Enter yet.
  3. Drag the unzipped folder from Finder into the Terminal window. It fills in the correct path automatically.
  4. Press Enter.
This sidesteps the single most common way a copy-pasted terminal command fails: guessing where a folder ended up. Dragging it in is always exactly right.

2Run the installer

cd ~/Downloads/local-dictate && bash install.sh

It checks for ffmpeg (and for Homebrew only if ffmpeg is missing), sets up its own Python environment, installs what it needs, lists your microphones and lets you pick one, then installs and starts the background service.

Safe to re-run any time. Re-running it updates the existing install in place, it does not create a second one.

Apple Silicon: the first real dictation downloads the Whisper model (about 1.5GB, one time, needs internet). Intel: the installer downloads a smaller model (about 480 MB, one time, safe to re-run, it resumes) during this step. Either way, every dictation after that is fully offline.

3Grant two permissions (macOS requires this by hand)

The installer prints an exact file path at the end. Copy it, then:

  1. Open System Settings → Privacy & Security → Input Monitoring. Click +, press Cmd+Shift+G, paste the path, click Open, and make sure it is toggled on.
  2. Do the same in System Settings → Privacy & Security → Accessibility.
  3. Run cd ~/Downloads/local-dictate && bash install.sh again (or the restart command it printed) so the change takes effect.

Without these, the transcript still lands on your clipboard, so Cmd+V always works as a manual fallback while you sort out permissions.

4Test it

Click into any text field. Hold either Control key, say a full sentence out loud, then release.

Apple Silicon or Intel Mac

The installer checks your Mac's chip and sets up the right engine by itself. You do not have to choose.

To see which engine is running, look for backend=mlx or backend=ct2 near the top of the log (grep backend ~/Library/Logs/local-dictate.log). The custom word list, vocabulary.txt, works on both. Keep it short on Intel.

Voice commands

Say a command out loud and Magnum Vox types the character instead of the words. It only converts when you say it as a command, not inside a normal sentence. "Hello, new line, how are you" becomes two lines; "we launched a new line of products" stays exactly as you said it. On by default, no setup.

Spacing is tidied for you, including the comma or period Whisper tends to add next to a command, and the next word after a new line or a sentence ending gets a capital letter.

It only converts when you say it as a command, not inside a normal sentence. Right after words like a, the, my, this or one, or right before words like of, item, symbol, key or cancer, the phrase is treated as plain words: "the next paragraph of the report", "a new line item" and "colon cancer" stay as typed. When in doubt it leaves your words alone.

To type the words themselves, say literally right before the phrase. "literally new line" types the words new line.

To turn voice commands off, create an empty file named commands_off next to dictate_daemon.py, or set the environment variable LOCAL_DICTATE_COMMANDS=0. Delete the file to turn them back on. No restart needed.

touch ~/Developer/local-dictate/commands_off

Flow punctuation

Whisper puts a full stop at every pause, even in the middle of a thought. "I think we should go ahead. And ship it on Monday. If the team agrees." Flow punctuation joins those stray full stops, so it reads "I think we should go ahead and ship it on Monday if the team agrees." On by default, no setup.

It joins a full stop when the next sentence carries the thought on (and, but, so, because, which, then, if, when and a few more), or when the sentence before is a short opener like "In fact." or "Honestly." A whole new clause, a question, or a long sentence keeps its full stop. It never joins across a new line, never touches a full stop you said as a command, and never removes the last full stop of a dictation.

To turn it off, create an empty file named flow_off next to dictate_daemon.py, or set the environment variable LOCAL_DICTATE_FLOW=0. Delete the file to turn it back on. No restart needed.

touch ~/Developer/local-dictate/flow_off

If something goes wrong

Watch the log while you test:

tail -f ~/Library/Logs/local-dictate.log

Three real bugs showed up building this. Worth knowing since any of them can resurface:

Full detail on all three, plus every other command you might need, is in README.md in this same folder.