Audio tts
Local, on-device audio toolbox for AI agents: voice-clone TTS, instrumental music, and audio verification — three installable Agent Skills.
npx -y skills add bman654/audio-forge --skill audio-ttsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 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 locally by cloning a voice from a short reference sample — chunked, sentence-aware, voice-cloned text-to-speech that writes WAV or MP3, with optional word-level and expression-cue timestamps (forced alignment). Runs fully on-device on Apple Silicon over the mlx-speech fish-s2-pro model (no cloud, no API key). Use when the user asks to: narrate text, read something aloud, generate a voiceover / VO, synthesize speech, clone a voice, make a character say lines, produce narration for a video or scene, or get word timings / subtitles / karaoke-style timestamps for synthesized audio. Trigger keywords: tts, text to speech, text-to-speech, voiceover, voice over, narration, narrate, read aloud, speak, synthesize speech, voice clone, voice cloning, clone my voice, character voice, word timestamps, forced alignment, subtitles from audio, fish-speech, fish-s2-pro.
The file declares its own license as MIT. 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.9 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
Audio TTS — local voice-clone text-to-speech
Turn a text file into narrated WAV or MP3 in a chosen (cloned) voice, running entirely on this
Mac. A default voice (claude) ships with the skill; add your own by dropping a short reference
clip into assets/voices/. Optionally emit word + expression-cue timestamps via forced
alignment.
Paths below are relative to this skill directory. If you're not cd'd into it, prefix with the
skill's absolute path (e.g. .../skills/audio-tts/scripts/tts.sh).
Platform
Synthesis is Apple-Silicon only — it runs on mlx-speech (Apple's MLX/Metal framework) and
does not work on Linux/Windows. If you're not on an Apple-Silicon Mac, use the upstream
fish-speech workflow documented in the repo README (§ Linux / Windows); the base model is the
same Fish Audio family, so voices carry over. The rest of this skill assumes Apple Silicon.
One-time setup
cd skills/audio-tts
uv venv --python 3.13 .venv # or: python3.13 -m venv .venv
uv pip install --python .venv -r requirements.txt # or: .venv/bin/pip install -r requirements.txt
The launcher scripts/tts.sh auto-uses .venv when present. First run downloads the fish-s2-pro
weights (~6 GB) to the Hugging Face cache.
For --timestamps (optional), also create the alignment venv (torch is deliberately kept out
of the synthesis venv):
uv venv .venv-align
uv pip install --python .venv-align -r requirements-align.txt
Synthesize
# Default 'claude' voice → MP3 (format chosen by the -o extension)
scripts/tts.sh input.txt -o out.mp3
# A different bundled/added voice
scripts/tts.sh input.txt -o out.wav --voice morgan
# One-off clone from an explicit reference (wav + its transcript)
scripts/tts.sh input.txt -o out.mp3 --reference-audio ref.wav --reference-text "the transcript"
# Model's base voice, no cloning
scripts/tts.sh input.txt -o out.mp3 --no-clone
# Also emit word + expression-cue timestamps (needs the align venv) → out.json
scripts/tts.sh input.txt -o out.mp3 --timestamps
# Plan only — show the chunking, no model load
scripts/tts.sh input.txt -o out.mp3 --dry-run
Input can be a UTF-8 file or - for stdin. Useful flags: --max-chars (chunk size, default 400
≈ 18 s), --gap-ms (silence between chunks), --bitrate, --normalize-peak, -v (per-stage
timings). Run scripts/tts.sh -h for the full list.
The synthesizer splits text into sentence-aligned chunks that stay inside the model's coherence window (≈ a paragraph), clones the reference voice once, synthesizes each chunk, stitches them with a short gap, and peak-normalizes. Generation is ≈ 2–3× realtime.
Adding a voice
A voice is a pair in assets/voices/: <name>.wav + <name>.txt.
<name>.wav: ~10–30 s of clean, single-speaker audio (the timbre to clone).<name>.txt: the exact transcript of that clip.
Then synthesize with --voice <name>. Point at a different folder with --voices-dir.
Expression & pacing
Inline [bracket] tags restyle the following words. Expression cues that render as audio
events — [laughing], [sigh], [gasp], [cough], … — are the ones --timestamps locates;
other tags (emotion/voice/volume/pacing) only recolor the words and are stripped from the word
stream. In practice punctuation out-performs tags for pacing (. ! ?, two spaces after a
sentence ender, a blank line for the longest pause). For emphasis, wrap words in
[loud] … [normal] rather than ALLCAPS (cleaner, and avoids token-mangling). See
references/rendering-notes.md for the full pacing guide and hard-won QA gotchas.
Always audition the render
fish-s2-pro is excellent but occasionally mangles a token (certain ALLCAPS/acronym words can hard-break a render, and it varies per voice). So listen to / verify every render — don't ship blind:
- Verify with the audio-lens skill (sibling in this repo): check for silence, clipping, and a
sane spectrogram.
node ../audio-lens/bin/audio-lens.js analyze <out.wav>. - If a word came out wrong, tweak just that token (lowercase → phonetic respell "sock two" →
letterize
S-O-C→ reword) and re-render. Keep the working.txtbeside the render.
Details and the token-breakage catalog are in references/rendering-notes.md.
Timestamps output
--timestamps writes a JSON sidecar:
{audio, sample_rate, duration_ms, text, items:[{type:"word"|"expression", value, s, e}]} (ms).
Words come from torchaudio MMS_FA forced alignment; expression cues are placed in the inter-word
gap where the model rendered them, refined with Silero VAD. Run scripts/tts-align.sh -h to align
an existing audio+text pair directly.
What ships with it: 9 files
1546.8 KB alongside SKILL.md, 4 of them executable
assets/
- voices/claude.txt202 B
- voices/claude.wav1520.3 KB
references/
- rendering-notes.md3.4 KB
scripts/
- claude_align.pyruns8.2 KB
- claude_tts.pyruns13.0 KB
- tts-align.shruns565 B
- tts.shruns460 B
- requirements-align.txt376 B
- requirements.txt283 B
Gives 0 of the 12 instructions most video audio skills give in ~1.3k tokens
Counted across 622 of the 795 authors here whose files we hold, read 2026-08-07
- Read individual rule files for detailed explanationsin 21 of 622, across 10 files
- Render final videoin 13 of 622, across 6 files
- Use WAV PCM 16kHz mono audio formatin 12 of 622, across 3 files
- Use this skill when dealing with Remotion codein 11 of 622, across 4 files
- Save generated audio to a WAV filein 11 of 622, across 4 files
- Handle conversion errors gracefullyin 10 of 622, across 6 files
- Add captions to videos alwaysin 10 of 622, across 4 files
- Generate music from text descriptions using MusicGenin 9 of 622, across 2 files
- Do not skip pipeline layersin 9 of 622, across 3 files
- Do not make one tool do everythingin 9 of 622, across 3 files
- Use Azure Document Intelligence for complex PDFsin 9 of 622, across 4 files
- Never ask the user to paste their full API keyin 9 of 622, across 3 files
Said here and by no other author read
- create a virtual environment before synthesis
- run synthesis from the skill directory
- use scripts/tts.sh for synthesis
- provide reference audio and text for voice cloning
- add reference pairs to assets/voices
- use bracketed inline tags for expression and pacing
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.