ra-yavuz › claude-can-speak

claude-can-speak
Let Claude Code decide what to say out loud. Most "speak Claude aloud" tools read every reply at you. This one leads with a skill that lets Claude voice only what is worth hearing, a "build is done", a heads-up, a shoutout, while everything else stays text. The speak-everything firehose is included too, but the deliberate skill is the point. Local neural voice, no cloud, no API keys.
Two ways to use it
| Mode | What it does | Enable |
|---|---|---|
| Deliberate the headline |
A speak skill lets Claude choose what to voice: "the build is done", a heads-up while you look away, a shoutout. Selective, on purpose, model-controlled. This is what most other tools do not do. |
claude-can-speak install-skill |
| Firehose optional |
A Stop hook speaks every finished reply. It has its own explicit on/off switch (off by default), independent of Claude Code's /voice dictation. |
claude-can-speak onor /ccs on |
Requirements
Claude Code, Node.js 16+ / npm, and Docker (the TTS engines
run in a container so they never touch your host Python). On Linux you also
need an audio player: pw-play, paplay, or
aplay. The CLI checks for Docker and tells you how to install it
if it is missing.
Install
npm install -g claude-can-speak
claude-can-speak setup # Docker check, build, install skill + /ccs + hook
# then restart Claude Code once. Deliberate mode is on; the firehose is off
# by default. Turn the firehose on when you want every reply spoken:
claude-can-speak on # speak every reply (terminal)
/ccs on # same, from inside Claude Code
claude-can-speak off # back to silent (default)
If npm install -g fails with EACCES (a
system-owned npm prefix like /usr), either set a user prefix
once with npm config set prefix ~/.npm-global and add
~/.npm-global/bin to your PATH, or install with
sudo. Models download on first use into
~/.cache/claude-can-speak/models; nothing model-shaped ships
in the package.
The toggle is a command, not a built-in slash setting.
claude-can-speak does not hook into Claude Code's /voice; if
you type / in Claude Code before setup and find nothing, that
is expected. Control the firehose from the terminal with
claude-can-speak on / off, or from inside Claude
Code with the /ccs slash command that setup
installs. After turning the firehose on, replies are spoken from the next
session that starts; Claude Code reads its hook roster at session start, so
start a fresh session once after the first
setup for the speak-every-reply hook to take effect.
Check it:
claude-can-speak status # gate, container, voice, model cache
claude-can-speak test # speak a sample line
Choosing a voice
The default is Kokoro af_heart (natural US English). List
options with claude-can-speak voices. For German or Turkish,
switch to the multilingual Piper engine:
claude-can-speak engine piper
claude-can-speak voice de_DE-thorsten-high # German
claude-can-speak voice tr_TR-dfki-medium # Turkish
Interrupting
Stop playback any time with claude-can-speak stop, or just send
your next message: a UserPromptSubmit hook silences the previous
reply. A new reply also supersedes the old one. Interrupts stop both
in-flight synthesis and active playback.
How it works
When a reply finishes and the firehose is on, the Stop hook strips
markdown and code, then hands the text to a persistent Docker container that
synthesises a WAV with Kokoro or Piper; the host plays it. The container
starts once and stays warm, so the model import cost is paid once, not per
reply. Only audio crosses back to the host. The speak skill
drives the same pipeline through claude-can-speak say, but only
when Claude (or you) chooses to speak. Everything runs locally: no network at
speak time, no telemetry.