From open-source-prep
Generates AI speech from text using OpenAI TTS, ElevenLabs with voice cloning, Bailian Qwen TTS, MiniMax, SiliconFlow CosyVoice/SenseVoice, and PlayHT. Outputs mp3/wav/ogg/flac for narration, dubbing, or reading aloud.
npx claudepluginhub iamzhihuix/happy-claude-skills --plugin open-source-prepThis skill uses the workspace's default tool permissions.
Turns text into speech across 6 providers through one CLI. All providers are synchronous (TTS is fast — typically under 10 seconds) except Bailian's voice-design flow (which is still covered but uses a longer poll window).
assets/EXTEND.template.mdpackage.jsonreferences/config/extend-schema.mdreferences/config/first-time-setup.mdreferences/error_codes.mdreferences/providers.mdreferences/voices.mdscripts/main.tsscripts/providers/bailian.tsscripts/providers/elevenlabs.tsscripts/providers/minimax.tsscripts/providers/openai.tsscripts/providers/playht.tsscripts/providers/siliconflow.tsscripts/types.tsscripts/utils/output.tsscripts/utils/text_chunk.tsGenerates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Turns text into speech across 6 providers through one CLI. All providers are synchronous (TTS is fast — typically under 10 seconds) except Bailian's voice-design flow (which is still covered but uses a longer poll window).
# Shortest path — OpenAI default voice
bun scripts/main.ts --text "Hello, world" --out ./hello.mp3
# Chinese, MiniMax
bun scripts/main.ts --provider minimax --text "大家好" --voice male-qn-qingse --out ./hello.mp3
# Long-form, Bailian (auto-splits by sentence)
bun scripts/main.ts --provider bailian --textfiles ./script.md --out ./narration.mp3
Do not route here when the user wants to transcribe audio → text (that's STT, different domain), or edit / mix audio files (use a dedicated audio editor).
Locate EXTEND.md:
./.happy-skills/happy-audio-gen/EXTEND.md$XDG_CONFIG_HOME/happy-skills/happy-audio-gen/EXTEND.md~/.happy-skills/happy-audio-gen/EXTEND.mdIf none found, run bun scripts/main.ts --setup and walk the user through references/config/first-time-setup.md.
Verify at least one provider has credentials (env var or 1Password reference).
Verify Bun is available. Fallback: npx -y bun.
Preference order:
--provider <id>default_provideropenai > elevenlabs > bailian > minimax > siliconflow > playhtPick by language / voice intent:
openai (gpt-4o-mini-tts / tts-1).elevenlabs.bailian (qwen-tts auto-chunks long scripts) or minimax.bailian (voice-design with qwen3-tts-vd) or siliconflow (CosyVoice2).playht (2.0).--text or --textfiles: input. Always quote.--out <path>: REQUIRED. Extension determines format (.mp3 / .wav / .ogg / .flac).--voice <id>: provider-specific. See references/voices.md for the short list of well-known voices.--rate 0.5..2.0: speaking rate.--instruction "...": voice direction (only openai gpt-4o-mini-tts and siliconflow honor this).--language <code>: en, zh, ja — only a few providers honor this explicitly.bun scripts/main.ts \
--provider openai \
--model gpt-4o-mini-tts \
--voice alloy \
--text "..." \
--out ./out.mp3
JSON mode:
{ "success": true, "provider": "openai", "model": "gpt-4o-mini-tts", "voice": "alloy", "output": "/abs/out.mp3", "size_bytes": 76032, "format": "mp3" }
happy-audio-gen automatically splits long input for providers that cap per-call length (Bailian ≤ 200 Chinese chars per call). Chunks are concatenated byte-for-byte on output.[openai] OpenAI TTS 400 with invalid voice → the voice name is not supported by the model. Use one of alloy, ash, coral, echo, fable, onyx, nova, sage, shimmer.[minimax] ... 2049 invalid api key → try MINIMAX_BASE_URL=https://api.minimaxi.com/v1 (different region).[bailian] ... 400 DataInspectionFailed → Aliyun content filter. Surface to the user.[elevenlabs] 401 → key invalid or subscription expired.references/providers.md — per-provider env vars, default models, voice lists.references/voices.md — curated voices for each provider.references/error_codes.md — common errors and fixes.references/config/first-time-setup.mdreferences/config/extend-schema.mdassets/EXTEND.template.md