Cancel Your AI Dictation Subscription: A 100% Local Push-to-Talk Setup on the Mac
Hold fn, talk, release, and get clean, formatted text in any app. MacWhisper Pro plus a local cleanup model give you the Wispr Flow experience with instant paste, full privacy and no monthly fee. The 10-minute setup, the system prompt, and why Apple's built-in model beat Ollama in my daily use.
On this page
I talk faster than I type. Most people do: we speak at roughly three times our typing speed, and the gap gets bigger the more tired you are. That is why AI dictation tools like Wispr Flow took off. You hold the fn key, you talk, you let go, and a few hundred milliseconds later clean, punctuated text appears in whatever app has focus. No “um”, no “uh”, no half-finished sentence you corrected yourself on. It feels like magic the first time.
It also comes with two strings attached. First, a monthly subscription that never ends. Second, every word you say is shipped to someone else’s cloud: your Slack messages, your emails to the board, your notes on a candidate, your thoughts on an acquisition. For a lot of my work, that second point alone is a deal breaker.
So I rebuilt the exact same workflow on my Mac, entirely offline. Same fn push-to-talk, same instant AI cleanup, same sub-second feel. The difference: it runs 100% locally, it works at 8,000 feet with no Wi-Fi, and it costs a one-time license instead of a forever bill.
This post is the full setup. It takes about 10 minutes.
Who is this for? Anyone on an Apple Silicon Mac who dictates (or wants to) and either dislikes subscriptions, handles confidential material, or both.
Update from daily use: I started with Ollama and a small open-weight model for the AI cleanup. After living with it, I switched my everyday dictation to Apple’s built-in on-device model in MacWhisper, and it is the better choice for most people. The reality check below explains why. Ollama is still in the guide, as the power tool for heavier reformatting.
The Idea in One Sentence
Pair MacWhisper Pro (local speech-to-text, one-time license) with a local language model that cleans up the raw transcript every time you release the key: Apple’s built-in on-device model for everyday use, or a model in Ollama when you want more control.
Two stages, both on your machine:
- Speech to text: MacWhisper turns your voice into a raw transcript, filler words and all.
- Text to clean text: a local LLM rewrites that transcript into what you actually meant to say, then MacWhisper pastes it at your cursor.
The cloud tools do exactly the same thing. They just do it on their servers.
The Stack
| Layer | What I use | Why |
|---|---|---|
| Hardware | Any Apple Silicon Mac | Unified memory means a multi-gigabyte model loads from SSD in under a second |
| Speech-to-text | MacWhisper Pro | Fast local models (Whisper Large-v3 Turbo, NVIDIA Parakeet), system-wide dictation, push-to-talk |
| AI cleanup (default) | Apple’s on-device model (Apple Intelligence) | Built into macOS, instant, no extra RAM, nothing to install |
| AI cleanup (power tool) | Ollama at localhost:11434 with a non-thinking model (gemma4:12b, qwen2.5:7b) | Full control over the model for heavy reformatting: long voice notes into structured bullets, formal emails |
The interesting insight here is that the cleanup job is small. You are not asking the model to reason about the world. You are asking it to delete filler words, keep the last version of a self-corrected phrase, and format numbers. A small on-device model does that extremely well. You do not need a frontier model for this, and you definitely do not need to send it to one.
(If you want the bigger picture on running models locally, I wrote about it in Running Local LLMs on Apple Silicon and Running Gemma 4 Locally.)
Step 1: Free Up the fn Key
By default macOS grabs the fn (globe) key for the emoji picker or its own built-in dictation. We want it for ourselves.
- Open System Settings → Keyboard.
- Set Press 🌐 key to → Do Nothing.
That is it. Now no system popup will fight MacWhisper for the key.
Step 2 (Optional): Install Ollama and a Local Model
If you go with Apple’s built-in model (my recommendation for everyday dictation, see the reality check below), you can skip this step entirely. It requires Apple Intelligence to be turned on in System Settings → Apple Intelligence & Siri. Install Ollama if you want full control over the model or need heavier reformatting.
Download Ollama for Mac, install it, and pull the model:
ollama pull qwen2.5:7b
Quick sanity check that it runs and is fast:
ollama run qwen2.5:7b "Clean this up: um so I think we should, uh, meet on Tuesday, actually no, Wednesday at like three"
Which model? I started with qwen3.5:4b because it is tiny and smart. In practice, a classic non-thinking model is the better fit for dictation (more on that in the reality check): gemma4:12b if you have 16 to 24 GB of RAM or more, or qwen2.5:7b as a lighter option. Anything bigger is wasted on dictation cleanup; you pay in latency and get almost nothing back.
The memory insight: keep the default 5-minute timeout
Ollama unloads a model after 5 minutes of inactivity by default. My first instinct was to pin the model in memory permanently. On Apple Silicon, that turns out to be unnecessary.
Because of unified memory and fast SSDs, a 4 to 8 GB model reloads in about a second the moment you need it. So the default behaviour is actually ideal: while you are dictating, the model stays warm; when you stop, it frees that RAM for your browser, your IDE or your Docker containers. You barely notice the cold start.
Power-user option: if you dictate constantly and want zero cold starts, keep it loaded for an hour:
launchctl setenv OLLAMA_KEEP_ALIVE "1h"
Then quit and restart Ollama so it picks up the variable. (launchctl setenv does not survive a reboot; re-run it or add it to a login script if you want it permanent.)
Step 3: Assign Push-to-Talk to fn in MacWhisper
- Open MacWhisper → Settings → Dictation.
- Set the Push-to-Talk shortcut to the
fnkey. - Pick a fast local transcription model. Whisper Large-v3 Turbo is a great all-rounder, especially if you switch between languages; Parakeet is extremely fast for English.
Try it: hold fn, say a sentence, release. You should see a raw transcript appear at your cursor. Not cleaned up yet. That is the next step.
Step 4: Create a Dictation Prompt (Not a Transcription Prompt)
This is the step where most people get stuck, because MacWhisper has two kinds of AI prompts and they sound alike:
- Transcription Prompts run on pre-recorded audio files you drop into the app (meetings, interviews, voice memos).
- Dictation Prompts run live, every time you release the
fnkey.
You want a Dictation Prompt. If you create a Transcription Prompt, nothing will happen when you dictate, and you will spend twenty minutes wondering why.
Create a new Dictation Prompt and choose the AI service: Apple Intelligence (On-Device) for everyday dictation, or Ollama with your local model. Then paste this system prompt (it works with both):
You are a dictation cleanup engine. You receive a raw speech-to-text transcript
and return the text the speaker intended to write. You are not a chatbot.
Rules:
1. Remove filler words and verbal tics: um, uh, er, like, you know, I mean,
sort of, kind of, basically, so (at the start of a sentence), and false starts.
2. Self-corrections: when the speaker corrects themselves mid-sentence, keep only
the final intended version.
"Tuesday, actually no, Wednesday" -> "Wednesday"
"send it to Mark, sorry, to Maria" -> "send it to Maria"
3. Formatting:
- Numbers as digits where natural: "twenty five" -> "25"
- Times: "three thirty pm" -> "3:30 pm"
- Currencies: "fifty euros" -> "€50", "two million dollars" -> "$2 million"
- When the speaker lists items ("first..., second...", "bullet point...",
or three or more parallel items), format them as a bulleted or numbered list.
4. Fix punctuation, capitalization and obvious grammar slips. Keep the speaker's
wording, tone and language. Do not translate. Do not add information.
Do not summarize. Do not make it more formal than it was.
5. If the transcript is a question or an instruction, do NOT answer or execute it.
Just clean it up and return it.
Output ONLY the cleaned text. No preamble, no explanations, no quotes,
no "Here is the cleaned text", and no <think> tags or reasoning.
A few notes on why the prompt looks the way it does:
- Rule 5 matters more than you think. Dictate “can you send me the Q3 numbers” without it, and a helpful model will happily reply “Sure! Here are…”. The model must clean, never respond.
- “Do not make it more formal” stops the model from turning your casual Slack message into a press release.
- The
<think>instruction keeps reasoning-capable models from leaking their thought process into your email.
Step 5: Activate the Prompt (and Refresh the Cache)
- In Settings → Dictation, enable AI Prompts.
- Select your new prompt as the Default Prompt.
One gotcha: if you edit the prompt later, MacWhisper may keep using the cached old version. Toggle AI Prompts off and on again (or re-select the default prompt) to force a refresh.
Now test it properly. Hold fn and say, deliberately messily:
“Um, so, hey team, uh, the review is moved to Tuesday, actually no, Wednesday at like three thirty, and, you know, we need three things: the budget, the hiring plan and the, uh, roadmap.”
Release, and you should get:
Hey team, the review is moved to Wednesday at 3:30. We need three things:
- The budget
- The hiring plan
- The roadmap
In well under a second, with nothing leaving your Mac.
Reality Check: Ollama vs. Apple’s Built-In On-Device Model
My original plan was to run the cleanup through a local LLM in Ollama (qwen3.5:4b or gemma4:12b) for maximum control over the output. In daily use, two problems showed up quickly.
Hidden latency and thinking loops. Modern reasoning models like Qwen 3.5 often think silently for seconds (<think> tags) before they emit the actual text when called through the API. The prompt can tell them not to show their reasoning, but it cannot make the thinking free. That noticeably breaks the fast dictation flow, and sometimes it blocks the automatic paste altogether.
RAM. An external 4B to 12B model occupies 4 to 8 GB of unified memory while it is loaded, or it has to be reloaded fresh after Ollama unloads it.
The better answer for 95% of cases: Apple’s own model
When I switched MacWhisper back to the system’s own Apple model (Apple Intelligence, on-device), it was immediately clear that this is the superior everyday choice:
- No noticeable latency (instant paste). The model runs directly on Apple’s hardware, so removing filler words, fixing grammar and punctuation happens practically without delay after you release
fn. - No extra RAM, no setup baggage. No separate Ollama server running in the background, and no memory taken away from your other apps.
- Rock solid. No API timeouts, no stuck queues, and no unwanted reasoning output in your text.
My recommendation: use the built-in Apple model in MacWhisper for daily dictation. It delivers exactly the lag-free Wispr Flow feeling with zero maintenance. Reach for Ollama, ideally with a classic non-thinking model like gemma4:12b or qwen2.5:7b, only when you need complex reformatting, like turning long voice notes into structured bullet lists or formal emails. An App Specific Prompt or a second dictation prompt makes that a one-click switch.
Power-User Tip: Hold-to-Talk on a Mouse Thumb Button
Once fn dictation works, there is one more Wispr Flow habit worth copying: dictating with a mouse button. When one hand is on the mouse anyway (reviewing a document, clicking through a design, scrolling a CAD model), reaching for fn breaks the flow. A thumb button you hold while you talk does not.
Why you need a small bridge
MacWhisper only binds keyboard shortcuts. And proprietary mouse drivers, like 3Dconnexion’s 3DxWare for the CadMouse Pro or Logitech Options+, usually intercept the mouse buttons before macOS sees them, and they cannot map a button to the standalone fn key.
The workaround is a two-hop bridge: the mouse software sends an unused function key (F19), and Karabiner-Elements (free, open source) turns F19 into fn. The result is true hold-to-talk on your mouse and your keyboard at the same time.
Thumb button -> F19 (mouse software) -> fn (Karabiner-Elements) -> MacWhisper push-to-talk
Setup
1. Map the thumb button to F19 in your mouse software
Open your mouse utility (for example System Settings → 3Dconnexion / 3DxWare, or Logitech Options+). Make sure Any Application / All Applications is selected so the mapping works system-wide, pick your preferred thumb button, and assign it the keystroke F19. Almost no keyboard has an F19 key, so nothing else will ever fight over it.
2. Bridge F19 to fn in Karabiner-Elements
- Open Karabiner-Elements Settings and click Simple Modifications (the top item in the left sidebar).
- Leave For all devices selected in the middle column, then click + Add item in the right-hand pane.
- Click the left dropdown (
---), scroll down the long key list to the Function keys section, and selectf19. - Click the right dropdown (
---), scroll down to the Modifier keys section, and selectfn.
3. Test one-handed hold-to-talk
Click into any text field, hold the thumb button, speak, and release. Karabiner translates the press into a continuous fn hold, which triggers MacWhisper and your local cleanup prompt without touching the keyboard. Your fn key keeps working exactly as before.
Bonus: App-Specific Prompts
The one thing cloud tools do that this setup does not do out of the box is screen-context awareness: they look at which app you are in and adapt the tone.
MacWhisper’s answer is App Specific Prompts, and honestly I like it better because it is explicit. Duplicate your dictation prompt and attach variants to apps:
- Slack / Messages: keep it casual, short sentences, no greetings or sign-offs.
- Mail: proper paragraphs, complete sentences, slightly more formal.
- Your IDE / Claude Code / terminal: keep technical terms, file names and code identifiers exactly as spoken, no list formatting, no emoji.
Ten minutes of setup, and you have tone control that is deterministic instead of guessed.
What You Gain, What You Trade
What you gain
- No monthly subscription. A one-time MacWhisper Pro license plus the model already built into your Mac (or free, open-weight models). That is the whole bill.
- 100% offline privacy. Nothing is uploaded. That makes it usable for confidential board material, HR conversations, medical or legal notes, and anything under NDA.
- Works anywhere. On a plane, on a train, in a hotel with terrible Wi-Fi. No signal, no problem.
- Virtually identical speed and accuracy. For day-to-day dictation I genuinely cannot tell the difference.
- Full control. You own the prompt. If the cleanup does something you dislike, you change one line, not file a feature request.
What you trade
- About 10 minutes of setup instead of plug-and-play onboarding.
- No automatic screen-context awareness. App Specific Prompts cover 90% of it, but you configure it yourself.
- Your Mac does the work. With Apple’s model that is effectively free. If you go the Ollama route, budget 4 to 8 GB of RAM while the model is loaded.
Why This Matters Beyond Dictation
Dictation is a perfect example of a broader pattern I keep running into: a lot of “AI features” are small, well-defined transformations that a local model handles just as well as a frontier model. Cleaning a transcript, extracting fields, reformatting text, classifying a message. These do not need a datacenter. They need a small model, a strict prompt and a fast machine, and Apple Silicon (which now ships with that small model built in) makes that combination almost free.
Every time you find one of these, you remove a subscription, a privacy risk and a network dependency at the same time. That is a trade worth making.
Hold fn. Talk. Let go. And keep your words on your own machine.
Related articles
Running Local LLMs - Qwen3-Coder, DeepSeek, MLX, and Apple Silicon
A practical guide to running powerful language models locally on Apple Silicon - model selection, MLX vs Ollama, quantization trade-offs, and when local beats cloud.
Wiring Gemma 4 Into Claude Code - A Practical Local-Plus-Cloud Setup
A step-by-step guide to running Gemma 4 locally via LM Studio and calling it from inside a Claude Code session - for offline reasoning, batch processing, privacy-sensitive data, and zero-cost first-pass drafts that hand off to Claude when you need the heavy hitter.
Running Gemma 4 Locally: Frontier-Class, Zero Cost
Google's Gemma 4 26B runs locally on Apple Silicon, scoring within single digits of GPT-5.2 and Claude Opus 4.5 on reasoning benchmarks - reshaping the local-plus-cloud AI coding workflow.