Audio feedback for Claude Code using pocket-tts
npx claudepluginhub phiresky/claude-toolsAudio feedback when Claude Code agent completes tasks using pocket-tts
Audio feedback plugin for Claude Code using pocket-tts. Runs natively on Node.js 22+ (native TypeScript via type stripping).
Add the marketplace and install the plugin:
/plugin marketplace add phiresky/claude-voicy
/plugin install voicy@phiresky-claude-tools
uvx pocket-tts serve in auto-start-tts-server mode)auto-start-tts-server mode)Ask Claude to configure voice feedback using the configure MCP tool. Examples:
narrateoffTwo MCP tools and five hooks provide voice feedback:
always mode, blocks tool calls without a preceding narrate. Stashes tool descriptions for richer permission prompt speech.| Component | off | quiet | narrate | always |
|---|---|---|---|---|
| narrate MCP tool speaks | - | - | yes | yes |
| pre-tool-use enforcement | - | - | consume only | block |
| post-tool-use reminder | - | yes | yes | yes |
| stop hook (speak + enforce) | - | yes | yes | yes |
| notifications spoken | - | yes | yes | yes |
| prompt narration section | - | - | soft | mandatory |
All config lives in ~/.claude/voicy.json.
| Key | Default | Description |
|---|---|---|
mode | "always" | Voice mode: off, quiet, narrate, always |
voice | "alba" | Voice name for pocket-tts |
prompt | "" | Custom instruction for summary style |
speak_mode | (required) | "auto-start-tts-server" or "connect-to-speak-server" |
tts_url | "http://localhost:25155" | pocket-tts base URL |
speak_server_url | "http://localhost:25156" | Speak server base URL (for connect-to-speak-server mode) |
speak_server_listen | "localhost:25156" | Bind address for speak-server.ts |
auto-start-tts-server — Connects directly to pocket-tts at tts_url. If the server isn't running, auto-starts it via uvx pocket-tts serve. Audio plays locally via ffplay. Best for local development.
connect-to-speak-server — Delegates to a speak-server at speak_server_url, which handles TTS and playback. Best for remote containers (devcontainer, SSH, WSL) where the container has no audio device.
Local usage:
{
"mode": "narrate",
"voice": "alba",
"speak_mode": "auto-start-tts-server"
}
Remote container (speak-server running on host):
{
"mode": "narrate",
"voice": "alba",
"speak_mode": "connect-to-speak-server",
"speak_server_url": "http://host.docker.internal:25156"
}
When Claude Code runs inside a devcontainer, SSH remote, or WSL, the container has no audio device. The speak-server bridges this gap — it runs on the host and receives HTTP requests from the container.
On the host (where speakers are):
node src/speak-server.ts
In the container, set speak_mode and speak_server_url in ~/.claude/voicy.json:
{
"speak_mode": "connect-to-speak-server",
"speak_server_url": "http://host.docker.internal:25156"
}