Skip to main content

claude-speak — TTS for Claude Code

Hear every Claude Code reply without lifting a finger. Installs as a Claude Code hook — no API keys, no config required.

Claude picks up a tool  →  "Reading the config…"  spoken aloud
Claude picks up a tool  →  "Running the tests…"   spoken aloud
Claude finishes         →  full reply              spoken aloud

Recommended mode: narrate — voices each tool call as Claude works, then speaks the final reply. You always know what Claude is doing without looking at the screen.

Default backend: Microsoft Edge TTS (free, neural, online). Swap to system for fully offline playback (Windows SAPI / macOS say / Linux espeak-ng).


Install

# 1. Install the package
pipx install claude-speak

# 2. Register hooks in ~/.claude/settings.json
claude-speak install-interview   # recommended: narrate tool calls + speak final reply
# claude-speak install           # minimal: speak final reply only

Python ≥ 3.9 required. pipx keeps it isolated — pip install claude-speak also works.

Platform notes

Platform Notes
Windows Works out of the box. Edge TTS recommended (better quality than SAPI).
macOS Works out of the box. Uses say in system mode.
Linux Install espeak-ng for system mode: sudo apt install espeak-ng. Edge TTS works on all distros.

How it works

Two hooks wire into Claude Code's event system:

  • PreToolUse — fires before each tool call, speaks a short description of what Claude is about to do ("Searching for config files…", "Running tests…")
  • Stop — fires at the end of every turn, speaks the full final reply after stripping code blocks and markdown

Three speaking modes control what gets spoken:

Mode What's spoken How to enable
narrate ✦ recommended Tool calls narrated live, then the final reply claude-speak install-interview
end The full final response only claude-speak install
end + speaker-only Only the 🔊 Speaker: line if present claude-speak install-speaker

Slash commands

Type these directly in the Claude Code prompt:

Command What it does
/claude-speak:shh Stop speaking immediately
/claude-speak:mode Toggle between end and narrate
/claude-speak:speaker-only Speak only the 🔊 Speaker: summary line
/claude-speak:speaker-full Speak the full response (default)
/claude-speak:narrate Enable narrate mode (speaks while working)
/claude-speak:narrate-stop Disable narrate mode
/claude-speak:config Show current configuration
/claude-speak:help Show help text
/claude-speak:uninstall Remove all hooks and slash commands

CLI reference

claude-speak install            # register Stop hook
claude-speak install-speaker    # register Speaker-line extraction
claude-speak install-interview  # register narrate (PreToolUse) hook
claude-speak uninstall          # remove all hooks
claude-speak uninstall-interview

claude-speak speak "hello"      # one-shot TTS test
claude-speak voices             # list available voices
claude-speak config show        # show all settings
claude-speak config set <key> <value>
claude-speak mode               # toggle end ↔ narrate
claude-speak stop               # stop current playback

claude-speak hook stop          # (internal) called by Claude Code Stop hook
claude-speak hook pre-tool      # (internal) called by Claude Code PreToolUse hook

Configuration

All settings can be overridden with environment variables or set persistently:

claude-speak config set voice_en en-GB-SoniaNeural
claude-speak config set speak_mode narrate
claude-speak config set max_chars 800
Key Env var Default Description
speak_mode CLAUDE_SPEAK_SPEAK_MODE end end · narrate
speaker_only CLAUDE_SPEAK_SPEAKER_ONLY false Speak only the 🔊 Speaker: line
backend CLAUDE_SPEAK_BACKEND edge edge (online) · system (offline)
voice CLAUDE_SPEAK_VOICE (unset) Override both EN and ES voices
voice_en CLAUDE_SPEAK_VOICE_EN en-US-AriaNeural English voice
voice_es CLAUDE_SPEAK_VOICE_ES es-MX-DaliaNeural Spanish voice
rate CLAUDE_SPEAK_RATE 0 Speed offset: Edge uses percent (-50..100)
max_chars CLAUDE_SPEAK_MAX_CHARS 1200 Truncate responses longer than this
wake_word CLAUDE_SPEAK_WAKE_WORD (unset) Require this phrase before speaking
focus_pattern CLAUDE_SPEAK_FOCUS_PATTERN (unset) Regex — only speak if active window matches

Voices

List all available Edge voices:

claude-speak voices

Set your preferred voice:

claude-speak config set voice_en en-GB-RyanNeural    # British male
claude-speak config set voice_es es-ES-ElviraNeural  # Spain Spanish female

Language is detected automatically per response (EN/ES). Set voice (not voice_en/voice_es) to force a single voice for all languages.


Status line

Add the current mode to your Claude Code status bar:

claude-speak install-statusline

Shows 🔊 end, 🔊 narrate, or 🔇 off depending on active hooks.


Diagnostics

claude-speak doctor

Checks: Python version, pygame playback, Edge TTS connectivity, hooks registered in ~/.claude/settings.json, slash commands installed.


Uninstall

# Remove hooks + slash commands (keeps package installed)
claude-speak uninstall

# Remove the package entirely
pipx uninstall claude-speak

License

MIT

Metadata

Release files for claude-speak 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for claude-speak 0.1.0
File Size Uploaded
claude_speak-0.1.0.tar.gz 26.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for claude-speak 0.1.0
File Interpreter ABI Platform
claude_speak-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 55.6 kB

Release files / claude_speak-0.1.0.tar.gz

Download URL claude_speak-0.1.0.tar.gz
Size 26.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d88207599aaeb396f140630b44f3ab279341dec6a588f680e4805769e809206b
BLAKE2b-256 checksum
How to use checksums
9800248b9cb024b6e3293e2ae57dcedccad8538ef13ed8d4a475c6bdba94c116
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / claude_speak-0.1.0-py3-none-any.whl

Download URL claude_speak-0.1.0-py3-none-any.whl
Size 29.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
db0bd2505d538e96e69f9d907526fad9fe51eaf45a4e0c824cb4e4d8ebf64ec2
BLAKE2b-256 checksum
How to use checksums
aa5249515537b3a3fd5b753235d0ebb8a65232a2074f13e89329429cd2c474e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page