How to Do Voice to Text on a Mac: Complete Guide

macOS ships with on-device dictation that transcribes your voice in any text field — tap Fn twice (or press ⌘ twice if enabled) and start speaking. Most third-party voice-to-text apps on Mac add a global push-to-talk shortcut and AI-powered formatting, typically for $12–15/month. The gap most guides miss: neither method knows what you're pointing at on screen — they just dump text where your cursor is, so developers working with AI coding agents end up circling elements in screenshots anyway to give the agent context.
What are the built-in voice to text options on macOS?
macOS includes Enhanced Dictation, a fully on-device transcription engine that runs without an internet connection once downloaded (Settings → Keyboard → Dictation → Download). The default keyboard shortcut is Fn Fn (press Function twice), but you can switch to ⌘⌘ (press Command twice) in the same pane under "Shortcut."
When you trigger dictation, a small microphone icon appears next to your cursor in any editable text field — TextEdit, Mail, Messages, Slack, VS Code, whatever. Speak naturally; the transcription appears in real time. Press Fn again (or ⌘ again, depending on your shortcut) to stop, or wait for a silence timeout (~30 seconds of no speech). macOS supports punctuation commands like "comma," "period," "new line," and "new paragraph," but you have to say them explicitly — it won't auto-punctuate.
On-device dictation works offline once you've downloaded the language model (100–200 MB per language). Turn on "Use Enhanced Dictation" in Settings → Keyboard → Dictation to enable offline mode. Without it, macOS sends audio to Apple servers (requires an internet connection and has a ~40-second time limit per session).
The limitation: dictation is text-only. It inserts words where your cursor is, but it has no understanding of the UI around that cursor — if you're dictating a bug report about "this button" while pointing at your screen, the agent reading your text has no idea which button you mean.
How do I set a custom voice to text Mac shortcut?
Apple restricts the built-in dictation shortcut to Fn Fn or ⌘⌘. You can't assign it to a custom hotkey like ⌥⌘Space through System Settings. Third-party apps bypass this by registering a global CGEventTap that listens for any key combo you choose.
Wispr Flow (~$12–15/mo) popularized the pattern: hold ⌥Space (or any custom key), speak, release. It transcribes on-device, formats with GPT-4, and pastes the result wherever your cursor is. The value is the push-to-talk interaction (no accidental triggers, instant start/stop) and AI cleanup (adds punctuation, fixes typos). The tradeoff is a subscription and the fact that it still just pastes text — it doesn't capture context about what's on screen.
Aiko ($15/mo) works the same way: assign a global hotkey, speak, release, transcribed text appears. Both tools prove Mac users will pay for a tighter voice-to-text loop than Fn Fn → speak → Fn Fn.
If you want a custom hotkey for the built-in dictation, your only option is an Automator script or a Keyboard Maestro macro that simulates pressing Fn Fn, but macOS often blocks synthetic keystrokes to the dictation shortcut for security reasons. Most developers just stick with Fn Fn or ⌘⌘ and rely on muscle memory.
Can I do voice to text in Microsoft Word on Mac?
Yes — Microsoft Word for Mac honors macOS dictation. Place your cursor in the document, press Fn Fn (or ⌘⌘), and speak. Word's native "Dictate" button (in the Home ribbon, requires a Microsoft 365 subscription and internet connection) routes through Microsoft's cloud transcription instead of Apple's on-device engine, so you get two options:
| Method | Shortcut | Offline? | Cost | Accuracy notes |
|---|---|---|---|---|
| macOS dictation | Fn Fn or ⌘⌘ | Yes (after download) | Free | Good for US English; weaker on accents/domain jargon |
| Word Dictate button | Click in ribbon | No | Microsoft 365 (~$7–10/mo) | Better punctuation, supports more languages, but requires internet |
Most Mac developers skip Word's built-in button and use the system-wide Fn Fn shortcut because it works in every app (Slack, Linear, GitHub comment boxes) without switching tools. The limitation is the same: voice to text Mac Word workflows still require you to manually describe what you're looking at if you're reporting a UI bug or giving feedback to a designer.
What voice to text Mac shortcut works across all apps?
Fn Fn (or ⌘⌘ if you've switched it) is the only truly global, built-in shortcut. It triggers dictation in any text field across Safari, Xcode, Notion, Figma comments, terminal prompts (yes, you can dictate git commit messages), anywhere the OS detects an editable field.
Third-party apps like Wispr Flow and Aiko register their own global hotkeys (⌥Space, ⌃Space, whatever you assign) that work everywhere because they paste the transcribed text via the system pasteboard — they're not hooking into the app's text field, they're just simulating ⌘V. That's faster than Fn Fn → speak → Fn Fn, but you lose the real-time feedback (the microphone icon next to your cursor) that Apple's dictation provides.
For developers: if you're dictating code or terminal commands, turn off "Auto-capitalization" and "Auto-correction" in Settings → Keyboard → Text Input → Input Sources → Edit (next to your language). macOS will try to capitalize the first word after a period and autocorrect npm to NPM, which breaks shell syntax.
The missing piece in every voice-to-text workflow is spatial context. You can say "change this button's color to blue," but unless you're also circling the button or pasting a screenshot, the person (or agent) reading your dictation has to guess which button. That's why developers still end up using screenshot tools alongside dictation — you record the voice instruction, then separately capture the screen, then paste both into Linear or Slack.
How does voice to text on Mac compare to voice coding or spatial capture?
Voice coding (like Talon or Cursorless) is a different category: you're speaking code syntax ("funk main args string array open brace"), and the tool inserts formatted code into your editor. It's for hands-free programming, not for giving instructions to an agent. Voice to text on macOS is instruction-level — you're dictating the intent ("make this button 20% larger"), not the implementation (width += width * 0.2).
Spatial capture adds a layer on top: you hold a hotkey, circle or point at a UI element while speaking, and the tool resolves the exact named element you're referring to. PinVari does this by reading the macOS Accessibility tree (AXUIElementCopyElementAtPosition → role, title, value, frame, parent chain) at the pixel you pointed to, binding deictic words ("this," "that") to timestamped pointer positions, and handing a resolved, executable instruction to your AI coding agent over a local MCP server.
| Method | What you get | Works offline? | Context aware? | Typical use case |
|---|---|---|---|---|
| macOS dictation | Raw transcribed text | Yes | No | Dictating emails, notes, commit messages |
| Wispr Flow / Aiko | AI-formatted text (punctuation added) | No (formats via API) | No | Same as above, but faster interaction |
| Voice coding (Talon) | Formatted code | Yes | No | Hands-free programming |
| PinVari | Transcribed instruction + resolved AX element + screenshot | Yes (transcription on-device) | Yes (knows element role/label/frame) | Pointing at a bug, giving UI feedback to an agent |
The difference: with dictation alone, you say "change this button to blue" and paste that text into Linear. With spatial capture, you say "change this button to blue" while circling the button, and the tool resolves AXButton "Submit" frame:(420,680,120,44) and hands that named element + transcription + cropped screenshot to Claude Code or Cursor. The agent doesn't guess — it gets the ground truth.
What are the real limits of voice to text on Mac?
macOS dictation accuracy depends on your accent, microphone quality, and the domain you're dictating in. It's trained on general English (US, UK, Australian, etc.), so it handles everyday vocabulary well but struggles with jargon, brand names, and technical terms. If you say "Kubernetes pod," it might transcribe "communities pod." You'll spend time correcting.
The 40-second timeout on server-based dictation (when Enhanced Dictation is off) forces you to break long thoughts into chunks. Enhanced Dictation (on-device) has no time limit, but the model is smaller and less accurate on complex sentences.
Punctuation is manual. You have to say "comma," "period," "question mark," "new line" out loud. If you forget, you get a wall of unpunctuated text. Third-party apps like Wispr Flow auto-punctuate by sending your transcription to GPT-4, but that's a cloud round-trip (adds 1–2 seconds latency) and costs API credits (baked into the $12–15/mo subscription).
No spatial awareness. This is the gap developers hit constantly: you dictate "this dropdown is broken," but which dropdown? You end up taking a separate screenshot, pasting it into Slack or Linear, then typing "see screenshot." The feedback loop is: speak → transcribe → screenshot → paste → type context → send. PinVari collapses that to: hold ⌥⌘A → circle the dropdown while saying "this dropdown is broken" → release. The resolved element, transcription, and cropped screenshot flow to your agent in one gesture.
Privacy note: Built-in macOS dictation (server mode) sends audio to Apple. Enhanced Dictation (on-device mode) processes locally. Third-party apps vary — Wispr Flow and Aiko process transcription on-device but send text to OpenAI/Anthropic for formatting. PinVari transcribes on-device (Apple Speech framework) and never uploads by default; the user brings their own LLM/agent.
How do developers use voice to text with AI coding agents?
Most developers using AI coding agents like Claude Code, Cursor, or Codex combine dictation with manual screenshots. The workflow: dictate the instruction ("refactor this component to use hooks"), take a separate screenshot of the component, paste both into the agent's chat. The agent reads the text and the image, then generates code.
The friction: you can't point and speak in one gesture. You dictate first, then you reach for CleanShot X or the built-in ⌘⇧4, crop the region, paste it, then send. If the agent misunderstands which component you meant, you clarify with another screenshot. The loop is: dictate → capture → paste → clarify → repeat.
Spatial capture fixes this by resolving the element as you speak. PinVari's MCP server (pinvari-mcp, installed at ~/.pinvari/mcp/pinvari-mcp) exposes a pinvari_next_instruction tool that returns:
- The spoken instruction (transcribed on-device).
- The exact AX element you circled (role, label, value, frame, parent chain).
- A confidence score (0.0–1.0; below 0.8 asks for confirmation instead of guessing).
- A cropped screenshot of the region you marked.
- The full window text (up to 40,000 characters, including scrolled-out content) and an interactive-element map.
Connect in one click: PinVari → Connect → Claude Code / Cursor / VS Code / Codex, or via the CLI:
claude mcp add --scope user pinvari -- "$HOME/.pinvari/mcp/pinvari-mcp"
Then: hold ⌥⌘A, circle the component, say "refactor this to use hooks," release. The agent gets the named element + instruction + screenshot automatically. No separate screenshot step, no pasting, no clarifying which component.
The best AI coding assistants already consume screenshots (Claude, GPT-4V, Gemini Vision), but they can't tell which button in a screenshot you're talking about unless you draw on it or describe it in prose. Spatial capture gives them the ground truth: AXButton "Submit" at (420, 680).
Does voice to text work with Accessibility Inspector on Mac?
Yes, in a sideways way. The Accessibility Inspector (Xcode → Open Developer Tool → Accessibility Inspector) shows you the AX tree for any running app — the same tree PinVari reads to resolve elements. You can use macOS dictation to fill in text fields inside the Accessibility Inspector (e.g., dictating a search query in the "Filter" field), but the Inspector itself is a debugging tool, not a voice-to-text interface.
The connection: if you're building an accessible Mac app, you'll use the Accessibility Inspector to verify that every interactive element has a proper AXTitle, AXValue, and AXRole. Those are the same attributes PinVari reads when you point at an element. If your app's AX tree is empty or unlabeled, spatial capture falls back to on-device Vision OCR (slower, pixel-based, no semantic role), just like a screen reader would fail on an inaccessible UI.
Developers shipping web apps can check the accessibility tree view in Chrome (DevTools → Elements → Accessibility pane) to see what assistive tools (and PinVari) will resolve. If a <button> has no accessible name, Chromium labels it "Unlabeled button" in the tree, and PinVari will surface that as "AXButton (unlabeled)" — which tells you to add aria-label or visible text.
What's the best workflow for voice to text on Mac if you already use CleanShot X?
CleanShot X ($29 one-time or $8/mo) is the dominant Mac screenshot tool — scrolling capture, annotation, OCR, cloud upload. If you already own it, keep using it for pixel-perfect screenshots and screen recordings. Add PinVari ($39 launch price, one-time) for spatial-capture feedback loops where you need to point at a UI element and speak an instruction in the same gesture.
The combined workflow:
- Use CleanShot X for pixel-perfect design reviews, scrolling captures, annotated screenshots you're sending to non-technical stakeholders.
- Use macOS dictation (Fn Fn) for drafting emails, Slack messages, commit messages, anything text-only where spatial context doesn't matter.
- Use PinVari for pointing at a UI element and giving an instruction to your AI agent (or filing a bug to Linear/GitHub/Slack with the exact element path + screenshot already attached).
Example: you're reviewing a client's staging site. You take a CleanShot scrolling capture of the whole homepage for the Figma handoff. Then you notice a broken button. Instead of screenshotting the button separately, typing "this button is broken" in Linear, and pasting the image, you hold ⌥⌘A, circle the button, say "this button doesn't respond to clicks," release. PinVari resolves the button (AXButton "Sign Up" frame:(800,450,140,50)), transcribes your instruction, crops the screenshot, and hands it to your agent or files it to Linear with the metadata already filled in.
CleanShot X and PinVari are complementary tools, not substitutes. One is for pixel capture, the other is for semantic capture. Most best productivity apps for Mac lists include CleanShot; the spatial-capture category is newer.
FAQ
Can I use voice to text on Mac without an internet connection?
Yes. Enable Enhanced Dictation in Settings → Keyboard → Dictation → "Use Enhanced Dictation" and download the language model (100–200 MB). Once installed, press Fn Fn and speak — transcription happens entirely on-device. Third-party apps like Wispr Flow and Aiko transcribe on-device but send text to OpenAI/Anthropic for formatting, so they require internet. PinVari transcribes on-device (Apple Speech framework) and processes the AX tree locally; no internet needed unless you're using a cloud-based LLM with the agent.
What is the fastest voice to text Mac shortcut for developers?
Fn Fn (or ⌘⌘ if you've switched it in Settings → Keyboard → Dictation → Shortcut) is the fastest built-in option — zero install, works everywhere, on-device. Third-party apps like Wispr Flow (~$12/mo) replace it with a push-to-talk hotkey (⌥Space by default) that's faster to trigger (hold-release vs. tap-speak-tap), but you're paying monthly. For spatial-capture workflows (pointing + speaking), PinVari's ⌥⌘A is the fastest loop — you circle the element while dictating, and the resolved instruction + screenshot flow to your agent in one gesture.
Does voice to text Mac OS work in terminal and code editors?
Yes, but with limits. You can dictate in any editable text field, including Terminal prompts, VS Code, Xcode, and Sublime. The problem: macOS auto-capitalizes the first word after a period and autocorrects common misspellings (e.g., npm → NPM), which breaks shell syntax. Turn off "Auto-capitalization" and "Auto-correction" in Settings → Keyboard → Text Input → Input Sources → Edit. Even then, you'll need to say punctuation manually ("git commit dash m quote fix bug quote"), which is slower than typing. Most developers dictate intent ("add error handling to the login function") and let the AI agent generate the code, rather than dictating code syntax line by line.
Can I dictate UI feedback directly to Claude Code or Cursor?
Not natively — Claude Code and Cursor don't have built-in spatial capture. You dictate the feedback, paste it into the agent's chat, then separately screenshot the UI and paste that. PinVari bridges the gap by exposing an MCP server that Claude Code, Cursor, VS Code, and Codex connect to. You hold ⌥⌘A, circle the UI element while speaking, release — PinVari transcribes on-device, resolves the exact AX element you pointed at, and hands the instruction + screenshot to the agent automatically. Connect in one click inside PinVari (Connect → Claude Code / Cursor) or via CLI: claude mcp add --scope user pinvari -- "$HOME/.pinvari/mcp/pinvari-mcp". The agent's pinvari_next_instruction tool returns the spoken instruction, the element path, the confidence score, and a cropped screenshot.
Is voice to text on Mac accurate enough for technical writing?
For general prose (emails, notes, Slack messages), macOS dictation is 85–90% accurate if you have a clear accent and a decent microphone. For technical writing (API docs, code comments, architecture specs), accuracy drops to 70–80% because the model isn't trained on domain jargon — "Kubernetes pod" becomes "communities pod," "OAuth token" becomes "old off token." You'll spend time correcting. Third-party apps like Wispr Flow and Aiko add AI-powered cleanup (punctuation, capitalization), but they don't fix domain-specific transcription errors. Most developers dictate the rough draft, then edit manually. PinVari's strength isn't long-form transcription — it's short, spatial instructions ("refactor this component," "fix this layout bug") where the element you're pointing at provides the missing context.
What's the difference between voice to text and voice coding on Mac?
Voice to text (macOS dictation, Wispr Flow, PinVari) transcribes your natural-language instruction ("make this button bigger") into text. Voice coding (Talon, Cursorless) translates spoken code syntax ("funk main args string array open brace") into formatted code in your editor. Voice coding is for hands-free programming (accessibility, RSI); voice to text is for giving instructions to a human or an AI. Spatial-capture tools like PinVari sit in between: you're dictating an instruction ("refactor this function") while pointing at the function, so the agent gets both the intent and the ground truth (the exact AXStaticText node containing the function name). Voice coding assumes you're already looking at the code; spatial capture assumes you're pointing at something on screen that the agent can't see without a screenshot.
Hand your agent the exact element
PinVari resolves what you point at into a named, executable instruction — on-device, no keys, your own agent. One click inside PinVari connects Claude Code, Cursor, VS Code or Codex — or paste one CLI line from pinvari.com/connect.
PinVari → Connect → your agent (one click)Get PinVari — $39 →


