Voice output for Claude Code using Kokoro TTS
npx claudepluginhub shreyas-s-rao/claude-code-narratorVoice output for Claude Code using Kokoro TTS. Speaks responses, tool steps, and notifications aloud.

A Claude Code plugin that speaks responses aloud using Kokoro TTS, a local neural text-to-speech engine. No cloud APIs, no latency — everything runs on your machine.
In Claude Code, run these slash commands:
Add the marketplace:
/plugin marketplace add shreyas-s-rao/claude-code-narrator
Install the plugin:
/plugin install narrator
Reload:
/reload-plugins
Linux note: If
/tmpis a separate filesystem (tmpfs), plugin installation may fail withEXDEV: cross-device link not permitted. Fix by setting TMPDIR before launching Claude Code:mkdir -p ~/.cache/tmp && TMPDIR=~/.cache/tmp claudeThen run the install commands above in that session. This is a Claude Code platform limitation, not specific to this plugin.
If you've cloned the repo locally:
Add the marketplace:
/plugin marketplace add /path/to/claude-code-narrator
Install and reload as above
claude --plugin-dir /path/to/claude-code-narrator
/narrator:on in Claude Code~/.claude-narrator-venv) on first run. This takes a few minutes./narrator:cast af_bella (or any voice from the table below)/narrator:hush to stop current speech, /narrator:off to disable entirely| Command | Description |
|---|---|
/narrator:on | Enable voice output (auto-installs Kokoro on first run) |
/narrator:off | Disable voice output |
/narrator:cast [voice] | Change voice or list available voices |
/narrator:speed [value] | Change speech speed (0.5–2.0, default 1.1) |
/narrator:speak [text] | Speak on demand, even if narrator is off |
/narrator:hush | Silence all current and queued speech |
All commands accept --local to apply settings to the current directory only (see Per-Directory Config).
| Voice | Gender | Description |
|---|---|---|
af_heart | Female | Warm, expressive (default) |
af_bella | Female | Clear, professional |
af_nicole | Female | Soft, gentle |
af_sarah | Female | Bright, energetic |
af_sky | Female | Calm, composed |
am_adam | Male | Deep, authoritative |
am_michael | Male | Warm, friendly |
am_fenrir | Male | Bold, commanding |
| Event | What you hear |
|---|---|
| Tool use (Read, Write, Bash, etc.) | Short description, e.g. "Reading file settings dot json" |
| Text between tool calls | The assistant's intermediate commentary |
| Final response | First ~1000 characters, ending at a sentence boundary |
| Notification | Title and message from Claude Code notifications |
| User input | Speech is automatically silenced when you type or click |
You can override narrator settings per directory, which is useful when running multiple Claude Code sessions with different voices.
/narrator:on --local # enable narrator in this directory only
/narrator:cast --local am_adam # use a different voice in this directory
/narrator:speed --local 1.5 # use a different speed in this directory
/narrator:off --local # disable narrator in this directory only
Local settings are stored in <cwd>/.claude-code-narrator/config. Only the keys you set locally are overridden — missing keys fall back to the global config at ~/.claude-code-narrator/config.
Add the local config file to your .gitignore so it's not committed:
echo .claude-code-narrator >> .gitignore
All sessions share a single daemon and FIFO (sequential playback, no overlap). Each session's utterances carry their own voice and speed settings, so if session A uses am_adam and session B uses af_bella, utterances interleave with the correct voices.
To work on the plugin locally, clone the repo and load it:
git clone https://github.com/shreyas-s-rao/claude-code-narrator