Inspired by Wispr Flow — built for Apple M4
A fully local, free voice dictation tool that works in every app on your Mac. Speak in any of 99 languages (or mix them) — Local Murmur auto-detects the language, translates it to English, cleans filler words via Ollama, and pastes polished text wherever your cursor is.
| Feature | How |
|---|---|
| Global hotkey (hold Right Option) | pynput |
| Fast transcription | whisper.cpp with Metal (Neural Engine) |
| Choice of model — Tiny to Large v3 | Pick & download in Settings → Models |
| Filler word cleanup | Ollama + llama3.2 (local, private) |
| Auto-paste anywhere | AppleScript Cmd+V injection |
| Runs 100% offline | No API keys, no subscriptions |
The DMG ships without a transcription model — it stays small and fast to
download. whisper-cli (with Metal support) is already bundled inside the app.
- Open the DMG and drag Local Murmur to Applications.
- Launch it. On first run, the Settings window opens straight to Models.
- Pick a model and hit Download — sizes range from ~75 MB (Tiny) to ~2.9 GB (Large v3), with a live progress bar.
- Once downloaded, the model activates automatically and you're ready to dictate (hold Right Option).
You can come back to Settings → Models anytime to download additional models, switch the active one, or delete models you no longer need to free up disk space.
| Model | Size | Speed | Accuracy | Best for |
|---|---|---|---|---|
| Tiny | ~75 MB | Fastest | Basic | Quick English notes |
| Base | ~142 MB | Very fast | Good | Everyday dictation |
| Small | ~466 MB | Fast | Great | Recommended — balanced |
| Medium | ~1.5 GB | Moderate | Excellent | Mixed-language & accented speech |
| Large v3 Turbo | ~1.6 GB | Fast | Excellent | Large-model accuracy, faster |
| Large v3 | ~2.9 GB | Slow | Best | Maximum accuracy, any language |
Local Murmur runs OpenAI's Whisper, which understands 99 languages —
including mixed-language speech within a single clip. The spoken language
is auto-detected and automatically translated to English before filler
words are cleaned up. Larger models (medium, large-v3) are most accurate
for mixed-language and accented speech.
Full language list
Afrikaans, Albanian, Amharic, Arabic, Armenian, Assamese, Azerbaijani, Bashkir, Basque, Belarusian, Bengali, Bosnian, Breton, Bulgarian, Burmese, Cantonese, Catalan, Chinese, Croatian, Czech, Danish, Dutch, English, Estonian, Faroese, Finnish, French, Galician, Georgian, German, Greek, Gujarati, Haitian Creole, Hausa, Hawaiian, Hebrew, Hindi, Hungarian, Icelandic, Indonesian, Italian, Japanese, Javanese, Kannada, Kazakh, Khmer, Korean, Lao, Latin, Latvian, Lingala, Lithuanian, Luxembourgish, Macedonian, Malagasy, Malay, Malayalam, Maltese, Maori, Marathi, Mongolian, Nepali, Norwegian, Nynorsk, Occitan, Pashto, Persian, Polish, Portuguese, Punjabi, Romanian, Russian, Sanskrit, Serbian, Shona, Sindhi, Sinhala, Slovak, Slovenian, Somali, Spanish, Sundanese, Swahili, Swedish, Tagalog, Tajik, Tamil, Tatar, Telugu, Thai, Tibetan, Turkish, Turkmen, Ukrainian, Urdu, Uzbek, Vietnamese, Welsh, Yiddish, Yoruba
The steps below are only needed if you're running flow.py directly with
Python instead of the packaged app.
chmod +x setup.sh
./setup.shThis will:
- Install Homebrew (if needed)
- Clone & build
whisper.cppwith Metal support - Download the
mediumWhisper model (~1.5 GB) as a starting point - Install Python deps:
sounddevice,numpy,pynput - Install Ollama + pull
llama3.2
Running from source still uses the same in-app Settings → Models picker — you can switch to any other model size at any time without re-running Setup.sh.
Go to System Settings → Privacy & Security and allow Terminal (or your Python launcher) for:
- ✅ Microphone — to capture your voice
- ✅ Accessibility — to simulate Cmd+V paste
- ✅ Input Monitoring — to detect the hotkey globally
You'll be prompted automatically on first run.
Terminal 1 — start Ollama in the background:
ollama serveTerminal 2 — start Flow (from inside the project folder):
python3 flow.pyThen click into any app (Slack, browser, Notes, VS Code…) and:
- Hold Right Option → recording starts (beep 🔔)
- Release Right Option → recording stops, transcribes + cleans, pastes
- Edit
com.localmurmur.dictation.plist— replaceYOUR_USERNAMEwith your actual username - Copy to LaunchAgents:
cp com.localmurmur.dictation.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.localmurmur.dictation.plistEdit flow.py top section:
HOTKEY = "right_option" # change hotkey if you want
OLLAMA_MODEL = "llama3.2" # swap to mistral, gemma3, etc.
SOUND_START = True # set False to disable beepsOpen Settings → Models, download the model you want, then click
Use this model. No code edits or restarts needed — the next dictation
uses the newly selected model. small/base are faster; medium/large-v3
are more accurate for multilingual and mixed-language speech.
| Model | Transcription speed | Multilingual accuracy |
|---|---|---|
large-v3 |
~2–4s for 30s audio | ⭐⭐⭐⭐⭐ |
medium |
~0.8–1.5s for 30s audio | ⭐⭐⭐⭐ |
small |
~0.4s for 30s audio | ⭐⭐⭐ |
Your M4 with 24 GB can comfortably run large-v3 + llama3.2 simultaneously.
"Nothing heard" every time → Check Microphone permission in System Settings
Paste doesn't work → Check Accessibility permission
Hotkey not detected → Check Input Monitoring permission
Ollama error
→ Make sure ollama serve is running in another terminal
Whisper not found
→ (Source/dev mode) Re-run Setup.sh, or check ~/whisper.cpp/build/bin/whisper-cli exists.
The packaged app bundles whisper-cli already — if you see this in the app, reinstall it.
"No model installed" / dictation does nothing → Open Settings → Models and download a model — Local Murmur needs at least one model installed to transcribe.
| Component | Cost |
|---|---|
| whisper.cpp | Free & open source |
| large-v3 model | Free (OpenAI released weights) |
| Ollama | Free |
| llama3.2 | Free (Meta released weights) |
| Total | $0/month |