mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-11 14:50:02 +00:00
* feat(cli): add `tts` command for local text-to-speech via Kokoro-82M Adds `hyperframes tts` — generate speech audio locally using Kokoro-82M (ONNX), no API key needed. Mirrors the transcribe command architecture. - New command: `hyperframes tts "text" --voice af_heart --output speech.wav` - 54 voices across 8 languages, ~5x realtime on CPU - Auto-downloads model (~311 MB) + voices (~27 MB) to ~/.cache/hyperframes/tts/ - Requires Python 3.8+ with kokoro-onnx installed - Extracted shared `downloadFile` utility from whisper/manager.ts with atomic .tmp→rename to prevent partial download corruption - Added hyperframes-tts skill with voice selection guide - Updated CLAUDE.md with TTS docs, voice table, and skill reference Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(tts): improve skill per skill-creator guidelines - Move trigger info from body to frontmatter description - Remove `trigger` field (not a valid frontmatter field) - Remove CLI flag docs Claude can derive from --help - Remove redundant voice tables (keep content-to-voice mapping) - Fix composition audio example to use actual <audio> element pattern - Keep non-obvious workflows: TTS+transcribe for captions, long scripts Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(tts): add guidance for using external TTS sources Help users understand when to use cloud TTS (voice cloning, broader languages, higher quality) vs the built-in Kokoro model, and how external audio integrates into the same composition workflow. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(tts): prioritize HeyGen API as recommended cloud TTS Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs(tts): remove external TTS section for now Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(tts): set required: false on input arg so --list works standalone Citty treats positional args as required by default unless explicitly set to required: false. Without this, `hyperframes tts --list` fails with "Missing required positional argument". Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(tts): add --help examples and fix required:false for --list Add examples section to `tts --help` matching the pattern from other commands (transcribe, render, etc.). Fix citty positional arg requiring explicit `required: false` for --list to work standalone. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add CLI command checklist to CLAUDE.md Ensure new commands always get --help examples in help.ts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
name, description
| name | description |
|---|---|
| hyperframes-tts | Generate speech audio locally using Kokoro-82M (no API key). Use when asked to create narration, voiceover, or text-to-speech audio for compositions, or when a user needs spoken audio from text. Covers voice selection, speed tuning, and integrating TTS output with compositions and captions. |
Text-to-Speech
Voice Selection
Match voice to content. Default is af_heart.
| Content type | Voice | Why |
|---|---|---|
| Product demo | af_heart/af_nova |
Warm, professional |
| Tutorial / how-to | am_adam/bf_emma |
Neutral, easy to follow |
| Marketing / promo | af_sky/am_michael |
Energetic or authoritative |
| Documentation | bf_emma/bm_george |
Clear British English, formal |
| Casual / social | af_heart/af_sky |
Approachable, natural |
Run npx hyperframes tts --list for all 54 voices (8 languages: EN, JP, ZH, KO, FR, DE, IT, PT).
Speed Tuning
- 0.7-0.8 — Tutorial, complex content, accessibility
- 1.0 — Natural pace (default)
- 1.1-1.2 — Intros, transitions, upbeat content
- 1.5+ — Rarely appropriate; test carefully
Composing with TTS Audio
Generate a voiceover and use it as the audio track:
npx hyperframes tts "Your script here" --voice af_nova --output narration.wav
Then reference it in the composition as a standard <audio> element:
<audio
id="narration"
data-start="0"
data-duration="auto"
data-track-index="2"
src="narration.wav"
data-volume="1"
></audio>
TTS + Captions Workflow
Generate speech, then transcribe it back for word-level caption timestamps:
# 1. Generate speech
npx hyperframes tts script.txt --voice af_heart --output narration.wav
# 2. Transcribe for word-level timestamps
npx hyperframes transcribe narration.wav
# 3. Result: narration.wav + transcript.json ready for captions
This avoids manually timing captions — whisper extracts precise word boundaries from the generated audio.
Long Scripts
For scripts longer than a few paragraphs, write the text to a .txt file and pass the path:
npx hyperframes tts script.txt --voice bf_emma --output narration.wav
The model handles long text well but very long inputs (>5 minutes of speech) may benefit from splitting into segments.
Requirements
- Python 3.8+ with
kokoro-onnxandsoundfileinstalled (pip install kokoro-onnx soundfile) - Model downloads automatically on first use (~311 MB + ~27 MB voices, cached in
~/.cache/hyperframes/tts/)