Set up offline dictation on a Mac

Install ParrotFlow, grant the microphone and let it download its speech models once. After that, dictation runs on your Mac with the network off.

What you will get

Dictation that runs on your Mac with Wi-Fi off. The speech model, your vocabulary, your rules and your scripts all run locally. Nothing you say is uploaded.

You say You get
um we have twenty one users and the meeting is at ten fifteen We have 21 users and the meeting is at 10:15

What needs the network

Some steps go online once. A few go online every time, and you can turn them off.

What Network When
Installing the app Yes Once
The speech models, about 1.5 GB Yes Once, at first launch
A model fetched the first time a feature uses it Yes Once, on first use
eSpeak NG, optional Yes Once, through Homebrew
Ollama and a local language model, optional Yes Once, to pull the model
The update check Yes Until you turn it off
A cloud model you add under models: Yes Every call
Dictation, vocabulary, rules, scripts, reading the screen No
A model that Ollama runs on your Mac No

Steps

  1. Check the Mac. ParrotFlow needs Apple silicon and macOS 15 or later. It uses about 3 GB of disk and about 1 GB of memory.

  2. Install the app while you are online.

    brew install znat/tap/parrotflow

    Without Homebrew, the install script puts the same app in the same place:

    curl -fsSL https://raw.githubusercontent.com/znat/parrotflow/main/scripts/install.sh | sh
  3. Grant the microphone. The app asks at first launch.

  4. Choose how text reaches your app. The default types it into the app you are in, and needs the Accessibility permission. If you would rather not grant it, set insert_mode: clipboard under transcription: in config.yaml. ParrotFlow then copies the text and you press ⌘V. See Permissions.

  5. Let the setup window download the models. It starts at launch and shows the model it is fetching. Parakeet, the speech model, is about 470 MB of it. Stay online until the last screen says “Ready”.

  6. Optional. Install eSpeak NG while you are still online. It helps ParrotFlow match your own names and jargon by sound. The setup window shows the command:

    brew install espeak-ng

    Once it is installed, ParrotFlow installs about 170 MB of Python into ~/Library/Application Support/ParrotFlow/python in the background. Let that finish before you go offline.

  7. Dictate a few sentences while you are still online. Some models are fetched the first time a feature uses them. For example, the 81 MB sound model for your vocabulary is fetched on the first English dictation that has a vocabulary in it.

  8. Optional. Turn off the update check. Add this to config.yaml:

    updates:
      after_days: -1

    -1 never asks. The check is a call to GitHub’s release API. It sends nothing about you and nothing you dictate.

Check that it works offline

The commands below use the full path to the app. If you installed with Homebrew, parrotflow runs the same binary.

Ask the app what it loaded:

/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --check-config

With the update check off, the output has this line:

  · updates           never checked

Any model that leaves your Mac is named in the same output. If you added a cloud model, you see a line like this one:

  · models: "gpt" sends text off this Mac — https://api.openai.com/v1, gpt-5.6-luna, key from the Keychain

Then turn Wi-Fi off and dictate a sentence into any text field.

You can also test transcription with no microphone. macOS can speak a sentence into a file:

say -o /tmp/pf-check.wav --data-format=LEI16@16000 --channels=1 "Testing one two three"
/Applications/ParrotFlow.app/Contents/MacOS/ParrotFlow --transcribe /tmp/pf-check.wav

Testing 123. is a correct result. What matters is that text came back. If the speech model was not on disk yet, this command downloads it, so run it once while you are online.

Limits

  • A model that failed to download is fetched again the first time ParrotFlow needs it. That needs the network.
  • Prompt transforms need a language model. Offline, that means Ollama on your Mac with the model already pulled. Without one, the rest of dictation still works.
  • A cloud model fails open with no network. The text stays exactly as it was dictated.
  • Spoken spelling corrections, such as “hey parrot, Tasmin spells T A S M E E N”, need a model. Without one, “hey parrot” still opens the correction panel.
  • --check-config cannot report Accessibility, because macOS credits the check to the terminal. The app logs the real value at launch. Run grep "launched —" ~/Library/Logs/ParrotFlow.log | tail -1 and look for accessibility=Granted.