Ambient › Guides

Claude Code text to speech: have replies read aloud on Mac

Updated · 4 min read

Claude Code can't speak its replies. Its /voice mode is for talking to it, not hearing it. On a Mac you have two ways to add text to speech: a Stop hook that pipes the final message through the built-in say command after every turn, or Ambient's Read Aloud, where you select the part of a reply you want to hear and press ⌥⎋, with a Mac voice, Kokoro running offline, or OpenAI and ElevenLabs with your own key.

Get Ambient Free for macOS 14 and later.

What Claude Code does on its own

Claude Code has had a voice mode since March 2026: type /voice, hold the space bar, speak, and release to send. That covers input only. When Claude finishes a turn, the most it does is show a desktop notification or ring the terminal bell, depending on your settings. There is no option to have the reply read aloud, so everything below adds it from outside.

A Stop hook that reads every reply

Stop runs when Claude finishes responding, and its input includes last_assistant_message, the text of Claude's final message. The hooks reference recommends that field over the transcript file for exactly this kind of read-aloud hook. Add this to ~/.claude/settings.json:

{
  "hooks": {
    "Stop": [
      { "hooks": [{ "type": "command", "command": "killall say 2>/dev/null; jq -r '.last_assistant_message // empty' | head -c 600 | say", "async": true }] }
    ]
  }
}

What each part does: killall say cuts off a reply that's still being read when the next one arrives. jq pulls the message out of the JSON on stdin (it ships with macOS 15 and later; brew install jq on older systems). head -c 600 keeps it to a few sentences, because a long reply is tedious to sit through. say speaks it with your system voice, and "async": true lets Claude carry on while it talks. If your file already has a hooks key, add Stop next to the events in it, then restart open sessions or type /hooks to check it's registered.

Pick a voice and a pace

say uses the system voice from System Settings › Accessibility › Spoken Content. To choose one for the hook alone, add -v: say -v Samantha. List what's installed with say -v '?', and download more under Spoken Content › System voice › Manage Voices. -r 200 sets the pace in words per minute.

A spoken prompt when Claude needs you

If you want to hear only the moments that need you, use the Notification event instead. It carries a message like “Claude needs your permission”, and its permission_prompt and idle_prompt matchers fire when Claude is waiting on you:

{
  "hooks": {
    "Notification": [
      { "matcher": "permission_prompt|idle_prompt", "hooks": [{ "type": "command", "command": "jq -r .message | say", "async": true }] }
    ]
  }
}

The built-in permission notification waits a few seconds before it fires; the permission notifications guide covers a PermissionRequest hook that doesn't, and the same say command works there.

Ambient: read the part you choose, in a voice worth hearing

A hook reads whatever Claude wrote, markdown and all. Ambient's Read Aloud goes the other way: you pick what to hear. Select part of a reply in the Claude desktop app, in Codex or in your terminal, and press ⌥⎋, or choose Read Selection Aloud from the menu bar, or, in apps that support it, the app's menu › Services › Speak with Ambient. Ambient turns markdown, paths and code blocks into something that makes sense spoken, and the notch island shows it speaking, with pause, continue and stop. The keyboard's ⏯ key and AirPods or other headphones pause and continue it too.

Choose the voice in Settings › Voice: a Mac voice, Kokoro running offline on your Mac after a one-time download of about 330 MB, OpenAI or ElevenLabs with your own key, or your own OpenAI-compatible server. With a Mac voice or Kokoro the text never leaves your Mac. With an online voice, each selection is sent to the service you chose, using your key, which is kept in your login Keychain. The shortcut reads the selection through Accessibility, which you allow once, and Ambient uses that for nothing else.

Stop babysitting terminals.

Free for macOS 14 and later. Works with Claude Code, Codex and Gemini CLI.

Get Ambient

Or brew install --cask viveky259259/tap/ambient · Star on GitHub

Common questions

Does Claude Code have a voice mode?

For input, yes. Type /voice and hold the space bar to talk to Claude Code instead of typing; it has been rolling out since March 2026. Nothing in Claude Code speaks the reply back. For that you need a hook or an app like Ambient.

Why does the hook read out asterisks, backticks and file paths?

say reads the text as written, and Claude writes markdown. Most punctuation is silent, but a path like src/App.swift and a code block get spelled out. Ambient's Read Aloud rewrites markdown, paths and code blocks into something worth hearing before it speaks; with a plain hook, the fix is to keep the spoken part short.

Can the hook read only the end of the reply?

Yes. Replace head -c 600 with tail -c 300 to hear the last few sentences, where Claude usually sums up. Or ask Claude in CLAUDE.md to finish every reply with a one-sentence summary and read only that.

Does any of this work offline?

say does, with the voices installed on your Mac. In Ambient, a Mac voice and the Kokoro model both run entirely on your Mac; only the OpenAI and ElevenLabs voices need a connection and send the selected text to that service with your key.

Sources

More guides: Claude Code sound when done · Claude Code permission notifications · Claude Code notifications on Mac