コンテンツ制作 · daymade/claude-code-skills

stepfun-tts

StepFun の stepaudio-2.5-tts を使用した中国語・日本語音声合成。step-tts-2 の `voice_label` を自然言語の `instruction`(≤200文字)と文内プロソディ用のインライン丸括弧 `()` に置き換えたコンテキスト対応 TTS です。音声合成で感情や抑揚の制御(囁き声、ポーズ、強調、文中の感情変化など)を行いたい場合、ゲームやアプリのボイスを一括生成したい場合、`step-tts-2` から移行する場合(`voice_label → instruction` の破壊的変更)、または StepFun 2.5 世代の厳格化された検閲(死/消失/政治用語)に対処する場合に使用します。阶跃 TTS、StepAudio 合成、语音合成、配音、文本转语音、TTS 升级、迁移 step-tts-2 でトリガーされます。兄弟モデル stepaudio-2.5-asr による文字起こしには、代わりに stepfun-asr スキルを使用してください。

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author daymadeGitHub daymade/claude-code-skills ↗Stars 1385License MIT(仓库根 LICENSE 文件;GitHub API spdx MIT;Copyright (c) 2025 daymade)Commit d5c4678cb5
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

中核となる知識は 2.5 世代における2つの大きな変更点です。voice_label が廃止され(自然言語 instruction ≤200文字 + テキスト内インライン () プロソディ指示へ変更)、検閲が厳格化されました(死/消失/センシティブな政治用語が censorship_block をトリガー)。

daymade-audio/stepfun-tts/SKILL.md
**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.
ここでの処理内容:「移行期における最大の落とし穴2点」を先回りして対処します。エラー原文はスクリプトによって実行可能なヒント('HINT: stepaudio-2.5-tts does not accept voice_label. Put emotion/prosody into `instruction`…')へと変換され、検閲ワード一覧とリライト戦略は references/migration_from_v2.md に記載されています。

スクリプトが /v1/audio/speech にリクエストを送信:JSON body(model/input/voice/response_format/speed/volume + 任意の instruction)、Authorization Bearer を設定し、成功時は mp3 バイト列をディスクへ直接書き込みます。

daymade-audio/stepfun-tts/scripts/tts_generate.py
body: dict[str, Any] = { "model": MODEL, "input": text, "voice": voice, "response_format": response_format, "speed": speed, "volume": volume, }
API_URL = "https://api.stepfun.com/v1/audio/speech"、MODEL = "stepaudio-2.5-tts"、DEFAULT_VOICE = "shuangkuaijiejie"。instruction が存在する場合は ≤200文字であることを検証します(超過時はリクエストを送信せずエラーを返却)。

instruction 長の厳格な検証 + テキスト透過によるインライン () プロソディ制御:文内の (试探着问)/(轻声)/(停顿一下) などの括弧内コンテンツはモデルに演技指示として解釈され、読み上げからは除外されます。

daymade-audio/stepfun-tts/scripts/tts_generate.py
if instruction: if len(instruction) > 200: return {"ok": False, "status": 0, "err": f"instruction too long: {len(instruction)} > 200 chars"}
SKILL.md に検証済み実例を記載:instruction に「活泼俏皮,像是在撒娇,带点嘴硬」を指定すると明らかな話速向上、「耳语声,气声很重」で息混じりの囁き声を実現。input に「你好(停顿一下)我是蕾格(轻声)今天(加重)的天气真不错。」を指定すると、インライン指示がすべて有効に機能します。

censorship_block に対する行単位のフォールバック:'censorship_block'/'blocked' を検知して失敗行をマークし、バッチモードではスキップした ID を記録して処理を継続、バッチ全体の停止を防ぎます。

daymade-audio/stepfun-tts/scripts/tts_generate.py
censored = "censorship_block" in raw or "blocked" in raw.lower()
バッチループ内では検閲行を censored リスト、その他の失敗行を failed リストに分類し、最後にサマリーを出力します。SKILL.md ではハイブリッドモデルによるフォールバック(該当行を step-tts-2 に戻す運用)を推奨しています。

バッチ処理:--batch で JSONL(1行1オブジェクト:{id, text, instruction?})を読み込み、--out-dir/<id>.mp3 へ1行ずつ合成、行間に sleep delay-ms を設けてレートリミットを回避します。

daymade-audio/stepfun-tts/scripts/tts_generate.py
out_path = args.out_dir / f"{line_id}.mp3" if result["ok"]: out_path.write_bytes(result["audio_bytes"])
read_batch は空行および # コメント行をスキップします。各行で voice/speed/volume を上書き可能です。main() 終了時は failed リストが空かどうかに応じて 0/1 を返し、censored は個別にカウントされます。

非破壊 A/B テストの設計不変条件:再生成されたコーパスは並行ディレクトリ(voice/zh_v25/)に書き込み、本番資産を上書きしません。ab_compare.sh は ffprobe/stat を用いて両ディレクトリの mp3 のサイズおよび再生時間を比較し、Markdown テーブルを出力します。

daymade-audio/stepfun-tts/SKILL.md
1. **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.
ab_compare.sh のヘッダーコメントには「compare two directories of mp3 files (size + duration)」と記載。双方に存在するファイルのみを比較し、一方にしか存在しないファイルは別途一覧表示します。ffprobe と GNU/BSD stat の双方に対応しています。

2コア機能

01単文合成(--text/--out/--instruction/--voice/--speed/--volume)
02中国語・日本語 1〜1000 文字の合成と、1000 文字の上限に対応する意味境界でのテキスト分割ガイダンス
03ボイスラインの一括合成(--batch jsonl + 行単位の検閲フォールバック + レート制限回避用の行間遅延)
04感情・抑揚(プロソディ)制御:グローバル instruction + 文内 () 括弧指示
05step-tts-2 → 2.5 移行ガイド(INSTRUCTION_MAP/SKIP_CENSORED/出力ディレクトリ戦略)
062モデル間 A/B 比較(ab_compare.sh:ffprobe 再生時間 + stat バイト数 + Δ% Markdown テーブル)
07検閲時のリライト/フォールバック指示(死/消失/政治用語 → リライトまたは該当行の step-tts-2 への切り戻し)

3外部依存関係

KindDependency / Endpoint
networkapi.stepfun.com(StepAudio TTS 端点)
networkplatform.stepfun.com(取 key/定价/voice 文档,仅指引)
clipython3(stdlib urllib,无第三方包)
cliffprobe(ffmpeg,ab_compare 用)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: daymade-audio/stepfun-tts/scripts/tts_generate.py
  • 网络端点: 外部ネットワークアクセスの宣言: POST https://api.stepfun.com/v1/audio/speech(リクエストボディに合成対象テキスト + instruction + Auth を含む)
  • 本地工作目录: ファイルの読み書きおよび成果物の出力: tts_generate.py がユーザー指定パスに --out(単文)または --out-dir/<id>.mp3(バッチ、mkdir parents)を出力
監査ノート: 統一分類基準に基づく:平文の API 認証情報($STEPFUN_API_KEY / ${CLAUDE_PLUGIN_DATA}/config.json)を取り扱うため Orange に該当。また、外部ネットワーク通信(テキスト内容を公式 api.stepfun.com TTS エンドポイントへ POST 送信)を行います。ローカルへの mp3 書き出しはユーザー指定の出力先であり、破壊的操作はありません。stepfun-asr と同様に、API キーの接触面およびサードパーティへのコンテンツ外部送信を伴うため Orange となります。

5二重目の独立検証

  • [ok] 端点/body/模型名(/v1/audio/speech + stepaudio-2.5-tts) — tts_generate.py API_URL/MODEL 常量与 body dict 逐字存在;api_reference.md 同。
  • [ok] voice_label 拒绝处理(迁移 gotcha) — 脚本对 raw 含 'voice_label is not supported' 时追加 HINT 文案;SKILL.md 错误表同描述。
  • [ok] instruction ≤200 硬校验 — synthesize() 内 'if len(instruction) > 200: return {ok: False, status: 0, err: ...}' 存在,超长不发请求。
  • [ok] censorship 逐行降级(不整批失败) — censored 列表单独收集、failed 汇总、循环 continue;main 返回码只按 failed 定。
  • [ok] API key 解析(env → CLAUDE_PLUGIN_DATA/config.json) — load_api_key 顺序与 asr 版一致(env 优先、config 兜底、fail-fast)。
  • [ok] A/B 脚本无网络、本地文件对比 — ab_compare.sh 仅 comm/stat/ffprobe;--noproxy/网络 token 零命中。
  • [ok] 功能声明 vs 夸大检查(voice cloning 未验证声明) — known_issues.md 第 56 行明确 'Zero-shot voice cloning (9.9 元/音色) … was not verified in this skill's test pass'——SKILL.md 也未把克隆列为核心能力,无夸大。
  • [ok] 元数据(license/stars/commit) — 仓库级 MIT、stars=1385、pushed_at=2026-09-09T12:33:29Z;本地 HEAD==pin d5c4678cb5d4fd6acc9c922690df035dbd33d247。

6結論

  • 2.5 の破壊的変更(voice_label → instruction)と検閲厳格化に対応する完全な移行マニュアルおよびスクリプト側のエラー翻訳を提供し、既存ユーザーの移行コストを大幅に削減。
  • グローバル instruction と文内 () 括弧指示の組み合わせにより、実際の声優収録ワークフローに極めて近い感情・抑揚制御を実現(2026-04-23 の実測検証例付き)。
  • 単一行の失敗に強いバッチ処理:検閲フォールバックやハイブリッドモデルへの切り戻しを、例外ではなく正常な処理パスとして設計。
  • 本番資産を保護する非破壊 A/B 不変条件を備え、貼り付け可能な比較テーブルを出力する ab_compare を同梱。
  • 制約事項の誠実な明記:価格の変動性、未検証の音声クローン機能、再生時間の伸張、検閲に関する既知の問題を references に明記し、ステークホルダーへの不正確な報告を防止。
  • 最適な用途: 適用シーン:中国語・日本語で感情や文内プロソディを反映した音声合成が必要な場合(ゲーム/アプリのボイス、吹き替え);step-tts-2 から stepaudio-2.5-tts へ移行する既存プロジェクト(移行マニュアルが主軸);一括合成が必要で単一行の検閲スキップを許容できる場合、または2モデル間の A/B 比較検証を行いたいチーム。
    不向きな用途: 非推奨シーン:StepFun Normal キーを所持していないユーザー;コンテンツに検閲対象ワードが多数含まれ、リライトや旧モデルとの併用ができない場合(バッチ全体がブロックされます);音声クローンが必要な場合(本スキルでは未検証);1000文字を超える長文を一度に合成したい場合(意味単位での分割が必須);感情制御が不要でニュートラルな読み上げのみを求める軽量ユースケース(より低コストな step-tts-2 系で十分)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-09
    Option A · Direct DownloadDownload stepfun-tts.tar.gz
    sha256: f7fa276a8ae68d1a…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit d5c4678cb5.