agentsclimarketplace

Local tts

Skill vdk888/local-tts/skills/local-tts

Local TTS plugin for Claude Code — 30 languages, voice design, voice cloning. Free, offline, powered by VoxCPM2.

Install
npx -y skills add vdk888/local-tts --skill local-tts

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Generate speech from text locally using VoxCPM2 (Apache-2.0, 30 languages, voice design, voice cloning). Use when the user asks to "say" or "speak" something, wants a voiceover or narration, wants to clone a voice, or wants to generate audio from text. Free, runs locally, no API calls. Output is a 48 kHz wav file.

The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

5.6 KB, as published. Nobody here has run it

Local TTS (VoxCPM2)

Local, offline text-to-speech via OpenBMB VoxCPM2 (2B params, 30 languages, Voice Design, Voice Cloning). Runs on Apple Silicon via Metal (MPS). Apache-2.0, zero cost, zero cloud.

When to use

  • User asks to "say", "speak", "read out loud", "generate a voiceover", or "turn this into audio"
  • User wants to clone a voice from a reference clip
  • User wants to create a character voice from a description
  • You need to attach a voice message to a Telegram reply
  • Any narration, voiceover, or TTS task

Do not use for real-time voice agents — the RTF on Apple Silicon is ~2.3x (slower than realtime). Good for batch generation, not live streaming.

Supported languages (30)

Arabic, Burmese, Chinese (+ dialects), Danish, Dutch, English, Finnish, French, German, Greek, Hebrew, Hindi, Indonesian, Italian, Japanese, Khmer, Korean, Lao, Malay, Norwegian, Polish, Portuguese, Russian, Spanish, Swahili, Swedish, Tagalog, Thai, Turkish, Vietnamese. No language tag needed — just pass the text.

Setup

On first use, run the setup script to create the Python environment:

bash ${CLAUDE_PLUGIN_ROOT}/scripts/setup.sh

This creates a venv at ~/.local-tts/venv and installs dependencies. Takes ~2 minutes. First generation will additionally download ~10 GB model weights (one-time).

You can customize the venv location with LOCAL_TTS_VENV and the Python binary with LOCAL_TTS_PYTHON environment variables.

Invocation

VENV=~/.local-tts/venv
SCRIPT=${CLAUDE_PLUGIN_ROOT}/scripts/generate.py
OUT=/tmp/tts_$(date +%s).wav

"$VENV/bin/python" "$SCRIPT" \
  --text "Your text here." \
  --out "$OUT"

Script prints OK <duration>s <rtf>x <path> on success. The wav is 48 kHz.

Three modes

1. Default voice

"$VENV/bin/python" "$SCRIPT" --text "Hello world." --out /tmp/hi.wav

2. Voice Design (no reference audio)

Describe the voice in parentheses at the start of the text. The parenthetical is stripped from the spoken audio and used as style conditioning.

"$VENV/bin/python" "$SCRIPT" \
  --text "(A warm, calm female voice, mid-30s, American accent)Welcome back." \
  --out /tmp/design.wav

Examples of descriptions that work:

  • (young woman, gentle and sweet voice)
  • (older man, deep resonant voice, slow pace)
  • (cheerful, energetic, fast-talking)
  • (voix feminine chaleureuse, ton pose) — descriptions in any supported language are fine

3. Voice Cloning

Provide a short (3-10s) reference clip. Clones timbre, accent, emotional tone. You can still layer style guidance with a (description) prefix.

"$VENV/bin/python" "$SCRIPT" \
  --text "This is the cloned voice speaking." \
  --ref /path/to/reference.wav \
  --out /tmp/clone.wav

Ultimate cloning (reference + prompt = max fidelity, reproduces micro-level vocal nuances):

"$VENV/bin/python" "$SCRIPT" \
  --text "Highest fidelity clone." \
  --ref /path/to/ref.wav \
  --prompt-wav /path/to/ref.wav \
  --prompt-text "The exact transcript of what is said in ref.wav" \
  --out /tmp/ultimate.wav

Script options

FlagPurpose
--text STRText to synthesize.
--stdinRead text from stdin (use instead of --text for long / piped input).
--out PATHOutput wav path. Required.
--ref PATHReference audio for cloning.
--prompt-wav PATHPrompt wav for ultimate cloning.
--prompt-text STRTranscript of the prompt wav (required with --prompt-wav).
--cfg FLOATClassifier-free guidance (default 2.0).
--steps INTDiffusion inference steps (default 10). Higher = slower, marginally better.
--model IDModel id or local path (default openbmb/VoxCPM2).
--quietSuppress loading messages.

Performance (Apple Silicon, MPS, bfloat16)

  • First load: ~340s (downloads ~10 GB weights to ~/.cache/huggingface/)
  • Subsequent loads: ~25s (cache warm)
  • Generation: RTF ~2.3x (10s audio = ~23s compute)

Common patterns

Generate and attach to a Telegram reply

VENV=~/.local-tts/venv
SCRIPT=${CLAUDE_PLUGIN_ROOT}/scripts/generate.py
OUT=/tmp/msg_$(date +%s).wav
"$VENV/bin/python" "$SCRIPT" --text "Your message" --out "$OUT"
# then use the telegram reply tool with files=["$OUT"]

Long text via stdin

cat article.txt | "$VENV/bin/python" "$SCRIPT" --stdin --out /tmp/article.wav

Clone + style overlay

"$VENV/bin/python" "$SCRIPT" \
  --text "(enthusiastic, happy, smiling)Great news everyone!" \
  --ref /path/to/voice-sample.mp3 \
  --out /tmp/happy_clone.wav

Troubleshooting

  • "ModuleNotFoundError: voxcpm" — Run bash ${CLAUDE_PLUGIN_ROOT}/scripts/setup.sh to create the environment.
  • "No such file: VoxCPM2 weights" — First run downloads the model (~10 GB). Requires internet.
  • Slow first call — Model load is ~25s after cache warmup. Each invocation loads the model fresh.
  • prompt_wav_path error — When using --prompt-wav, you must also provide --prompt-text with the transcript.

References

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.