stepfun-tts
- Repo stars 0
- Author updated Aug 24, 2026, 03:33 PM
- Author repo claude-code-skills
StepFun stepaudio-2.5-tts
Generate Chinese / Japanese speech with stepaudio-2.5-tts (released 2026-04, verified 2026-04-23). Contextual TTS — emotion and prosody go through natural-language description, not fixed labels.
Companion: for transcription with
stepaudio-2.5-asr(the sibling model), use thestepfun-asrskill — they share an API key but live on different endpoints with different body shapes.
Why this skill exists — StepAudio 2.5 has two non-obvious pitfalls that cost hours if you don't know them:
stepaudio-2.5-ttsrejectsvoice_label(the step-tts-2 way). Emotion/prosody now goes throughinstruction(natural-language description, ≤200 chars) and inline()parentheses inside the text itself.- Censorship is stricter — anything containing 死 / 消失 / sensitive political terms returns
censorship_block. Your rewrite options are inreferences/migration_from_v2.md.
Config and auth
API key lives in $STEPFUN_API_KEY (preferred) or ${CLAUDE_PLUGIN_DATA}/config.json (fallback for cross-session persistence). All bundled scripts try env first, then config.
First-time setup (one-liner):
mkdir -p "${CLAUDE_PLUGIN_DATA}" && cat > "${CLAUDE_PLUGIN_DATA}/config.json" <<EOF
{"api_key": "<paste key here>"}
EOF
If the user hasn't set a key, ask them to paste it (don't guess / don't use a placeholder). StepFun API keys are available at https://platform.stepfun.com/ → API Keys. Use a Normal key, not a Plan key (Plan keys are restricted to text models and silently fail on audio endpoints).
Common tasks — decision tree
| User wants... | Script | Key detail |
|---|---|---|
| Synthesize 1–500 char Chinese with emotion | scripts/tts_generate.py |
Use instruction for mood, () for inline prosody |
| Synthesize long text (500–1000 char) | scripts/tts_generate.py |
1000 char is the hard cap; split at semantic boundaries above that |
| Batch-generate game/app voice lines | scripts/tts_generate.py --batch <jsonl> |
Handle censorship_block fallback individually |
| A/B compare two TTS models | scripts/ab_compare.sh |
Compares duration/size across two directories |
Migrate from step-tts-2 |
see references/migration_from_v2.md |
voice_label.emotion → instruction rewrite + censorship list |
Starting points
- Synthesize a single line: Run
python3 scripts/tts_generate.py --text "你好" --out /tmp/hello.mp3 --instruction "温暖的希望感". For fine-grained control read the "Contextual TTS" section below. - A full migration from
step-tts-2→stepaudio-2.5-tts: readreferences/migration_from_v2.mdend-to-end before touching code. It has theINSTRUCTION_MAP, the SKIP_CENSORED list pattern, and the output-directory-strategy for non-destructive A/B.
Contextual TTS — beyond emotion labels
The headline feature of stepaudio-2.5-tts is that you stop mapping emotions to fixed tags and start describing what you want in natural language. Two layers:
Global context (instruction parameter) — sets the overall tone for the entire utterance. ≤200 chars. Think of it like giving stage direction to a voice actor.
instruction: "克制的悲伤,语气低沉柔弱,像快要消失一样"
Inline context (() parentheses inside input) —句内 directives. Parenthesised content is consumed as directions and is NOT read aloud. Use for precise control of pauses, breath, emphasis, or mid-sentence emotion shifts.
input: "(试探着问)你好吗?(开心地)太好了!(突然沉下来)不过...我快要消失了。"
Examples that worked in practice (from 2026-04-23 verification):
instruction: "活泼俏皮,像是在撒娇,带点嘴硬"— visibly speeds up delivery vs neutralinstruction: "耳语声,气声很重,几乎听不清"— produces audible whisper/breathinput: "你好(停顿一下)我是蕾格(轻声)今天(加重)的天气真不错。"— inline directives all respected
What stepaudio-2.5-tts will NOT accept — voice_label parameter. Error: voice_label is not supported for v2 models. This is the #1 migration gotcha from step-tts-2.
Common error patterns (real errors, real fixes)
| Error response | Actual cause | Fix |
|---|---|---|
"voice_label is not supported for v2 models" |
Sent voice_label to stepaudio-2.5-tts |
Remove voice_label; put the same intent into instruction as natural language |
"The content you provided or machine outputted is blocked." type: censorship_block |
Sensitive word (死 / 消失 / etc.) | Rewrite the phrase OR fall back to step-tts-2 for that specific line (mixed-model is fine) |
| Silent audio truncation (input > 1000 chars) | Hard cap exceeded | Split at semantic boundaries; don't truncate mid-sentence |
More in references/known_issues.md.
When to read references
references/api_reference.md— exact request/response JSON for/v1/audio/speech, all fields, error responses. Read when writing raw HTTP calls instead of using the bundled scripts.references/migration_from_v2.md— complete playbook for moving a step-tts-2 project to stepaudio-2.5-tts. Has the emotion→instruction rewrite table, the A/B directory strategy, decision checkpoints, and the 2026-04 speed/quality trade-off data (stepaudio-2.5-ttsis ~20% slower than step-tts-2; audible prosody improvement). Read before any migration work.references/known_issues.md— censorship patterns, TTS duration inflation, v2-family parameter naming gotcha, 1000-char hard cap. Read when debugging anomalous output or evaluating whether to adopt.
Design invariants (don't break these)
- Non-destructive A/B output — when regenerating a corpus with a new model, write to a parallel directory (
voice/zh_v25/), never overwrite the production corpus. The migration playbook shows why. - Per-line censorship handling — if 2/29 lines get
censorship_block, don't fail the batch. Log the skipped IDs, continue. Mixed-model fallback (step-tts-2 for the skipped 2) is normal. - Don't duplicate voice_label logic in new code — any new TTS code targeting stepaudio-2.5-tts should only use
instruction+ inline(). Do not write a branch that conditionally emitsvoice_label.
Pricing (verified 2026-04-23, volatile)
stepaudio-2.5-ttscontextual synthesis: ~5.8 元 / 万字符- Zero-shot voice cloning: ~9.9 元 / 音色
Re-verify at https://platform.stepfun.com/docs/zh/guides/pricing/details before quoting to stakeholders.
- Fluxly category
- Other
- Author-declared agents
- No explicit declaration found; this is not inferred or tested compatibility
- Static check
- 88 / 100 · heuristic scan, not runtime safety proof
- Author / version / license
- @daymade · no license declared
- Fluxly token estimate
- Lean
- Fluxly setup estimate
- Guided setup
- External API key
- Required · Vendor-specific
- Detected OS requirements
- Unspecified
- Runtime requirements
- Unspecified
- Detected file/system behavior
-
- Read-only
- Write / modify
- Detected network behavior
- External requests
- Install commands
- None (reference only)
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
The current SKILL.md does not define a fixed output example. API key lives in $STEPFUNAPIKEY (preferred) or ${CLAUDEPLUGINDATA}/config.json (fallback for cross-session persistence). All bundled scripts try env first, then config. First-time setup (one-liner): If the user hasn't set a key, ask them to paste it (don't…
User wants... · Script · Key detail Synthesize 1–500 char Chinese with emotion · scripts/ttsgenerate.py · Use instruction for mood, () for inline prosody Synthesize long text (500–1000 char) · scripts/ttsgenerate.py · 1000 char is the hard cap; split at…
Synthesize a single line: Run python3 scripts/ttsgenerate.py --text "你好" --out /tmp/hello.mp3 --instruction "温暖的希望感". For fine-grained control read the "Contextual TTS" section below. A full migration from step-tts-2 → stepaudio-2.5-tts: read…
The headline feature of stepaudio-2.5-tts is that you stop mapping emotions to fixed tags and start describing what you want in natural language. Two layers: Global context (instruction parameter) — sets the overall tone for the entire utterance. ≤200 chars.…
Error response · Actual cause · Fix "voicelabel is not supported for v2 models" · Sent voicelabel to stepaudio-2.5-tts · Remove voicelabel; put the same intent into instruction as natural language "The content you provided or machine outputted is blocked."…
references/apireference.md — exact request/response JSON for /v1/audio/speech, all fields, error responses. Read when writing raw HTTP calls instead of using the bundled scripts. references/migrationfromv2.md — complete playbook for moving a step-tts-2 project…
# StepFun stepaudio-2.5-tts
Generate Chinese / Japanese speech with `stepaudio-2.5-tts` (released 2026-04, verified 2026-04-23). Contextual TTS — emotion and prosody go through natural-language description, not fixed labels.
> Companion: for transcription with `stepaudio-2.5-asr` (the sibling model), use the `stepfun-asr` skill — they share an API key but live on different endpoints with different body shapes.
**Why this skill exists** — StepAudio 2.5 has two non-obvious pitfalls that cost hours if you don't know them:
1. `stepaudio-2.5-tts` **rejects** `voice_label` (the step-tts-2 way). Emotion/prosody now goes through `instruction` (natural-language description, ≤200 chars) and inline `()` parentheses inside the text itself.
2. Censorship is stricter — anything containing 死 / 消失 / sensitive political terms returns `censorship_block`. Your rewrite options are in `references/migration_from_v2.md`.
## Config and auth
API key lives in `$STEPFUN_API_KEY` (preferred) or `${CLAUDE_PLUGIN_DATA}/config.json` (fallback for cross-session persistence). All bundled scripts try env first, then config.
First-time setup (one-liner):
```bash
mkdir -p "${CLAUDE_PLUGIN_DATA}" && cat > "${CLAUDE_PLUGIN_DATA}/config.json" <<EOF
{"api_key": "<paste key here>"}
EOF
```
If the user hasn't set a key, ask them to paste it (don't guess / don't use a placeholder). StepFun API keys are available at https://platform.stepfun.com/ → API Keys. **Use a Normal key, not a Plan key** (Plan keys are restricted to text models and silently fail on audio endpoints).
## Common tasks — decision tree
| User wants... | Script | Key detail |
|---|---|---|
| Synthesize 1–500 char Chinese with emotion | `scripts/tts_generate.py` | Use `instruction` for mood, `()` for inline prosody |
… Author text anchors workflow facts; Fluxly only indexes current sections, terms, files, and commands.
sections -> Config and auth → Common tasks — decision tree → Starting points → Contextual TTS — beyond emotion labels → Common error patterns (real errors, real fixes) → When to read references
terms -> Why this skill exists · rejects · Use a Normal key, not a Plan key · Synthesize a single line · A full migration · Global context (instruction parameter) · Inline context (() parentheses inside input) · What stepaudio-2.5-tts will NOT accept
files/cmd -> stepaudio-2.5-tts · stepaudio-2.5-asr · stepfun-asr · voicelabel · instruction · censorshipblock · references/migrationfromv2.md · $STEPFUNAPIKEY
body sha256 -> fb87e6f44191
Decide Fit First
Design Intent
How To Use It
Boundaries And Review