TAS — テキストと音声、双方向(Speakee API)
1つのスクリプトで両方の方向を処理します。
- テキスト → 音声(TTS): 40以上の言語、100以上の音声、カスタム音声UID、長文チャンク分割、複数音声による会話モード、ffmpeg 結合、音声QA。
- 音声 → テキスト(STT): 任意の音声/動画ファイルをテキスト、単語タイムスタンプ、SRT/WebVTT 字幕に書き起こし、長時間録音の自動分割に対応。
すべてはバンドルされたスクリプトで実行されます — インラインで再実装せず、絶対に何もインストールしない(whisper、torch、faster-whisper、pip は不要)。
<スキルベースディレクトリ>/scripts/tas.py
一般的なインストール場所:
~/.config/opencode/skills/tas/scripts/tas.py(opencode)、
~/.claude/skills/tas/scripts/tas.py(Claude Code)、
~/.agents/skills/tas/scripts/tas.py(skills CLI、npx skills add)。
スキル名は tas — ロードするときは tas で、決して tts ではありません。
絶対ルール(すべてのリクエストに適用)
- バンドルスクリプトを使用する。 TTS や STT のためのアドホックな curl や Python スニペットは使わない。
- 絶対に何もインストールしない。
pip install faster-whisper、pip install whisper、pip install torchを実行したり、モデルをダウンロードしない。スクリプトは Speakee API 経由で STT を行い、Python 標準ライブラリのみを使用 — ローカルモデル、ローカルダウンロード、pip は不要。 - 提供前に検証する。
ttsとconversationは自動的に音声QAを実行します。QA: FAILは修正し、決して納品してはいけません。 - 結果を報告する: 最終パス、再生時間、サイズ、QAステータス(TTS)、最終SRT/VTT/テキストパスとキュー数(STT)。
- 常に事前確認する。 言語、モデル、音声はリクエスト前に検証され、推測した音声を送信してはいけません。
- キャッシュをオンのままにする(ユーザーが別途指示した場合を除く)。再実行が高速になり、失敗した会話の再開も可能です。
- 音声名を推測しない。
voices/suggestで解決するか、UUID を渡す。 - 無料APIを尊重する: デフォルトは
--workers 4。HTTP 429 の場合は数を減らす。 - スクリプトにテキストの正規化を任せる。 マークダウン、URL、HTML、絵文字はデフォルトで削除されます。ユーザーがリテラルテキストを希望する場合のみ
--rawを使用。 - 長いテキストを事前に分割しない。 スクリプトが文の区切りでチャンク分割し、自動マージします。
- STTでは言語がわかっている場合、常に
-l <コード>を渡す。 自動検出は信頼できません(Whisper はベンガル語とグジャラート語を混同します)。正しいベンガル語には-l bnが必要です。 - 結果を別のツールやスクリプトで使用する場合は
--jsonを使う。
コマンド
| コマンド | 目的 |
|---|---|
tts | 1つのテキストブロックを合成(TTS) |
uid | カスタム音声UIDで合成(language=uid) |
conversation | 複数話者の対話 → 1つの結合・検証済みMP3 |
stt | 音声/動画ファイルを書き起こし → テキスト(+ オプションでSRT/VTT) |
transcribe | stt のエイリアス |
subtitle | 書き起こし + SRT 出力 |
verify | 任意のファイルの音声QAを実行 |
voices -l <コード> | 言語の音声一覧を表示 |
suggest -l <コード> | 推奨マーク付きの音声一覧を表示 |
presets | 組み込み音声プリセット一覧 |
languages | サポートされる言語一覧 |
models | モデル一覧(デフォルト sonic-3.5) |
cache-clear | 合成キャッシュを削除 |
ワークフローA — テキスト読み上げ(TTS)
ステップ1 — スコープの決定
言語(または自動検出に任せる)、トーン(ニュース / ストーリー / アシスタント / オーディオブック)、単一話者か対話か、希望する出力パス、字幕(--srt)やメタデータ(--title/--artist)が必要かどうかを特定します。
ステップ2 — 言語と音声の選択
python3 "$S" languages # 43コード
python3 "$S" suggest -l bn # 推奨音声を先頭に表示
python3 "$S" presets # 厳選された音声セット
ユーザーがカスタム音声UIDを持っている場合は uid モードを使用します。それ以外の場合は、デフォルトよりもプリセットまたは推奨音声を優先します。
ステップ3 — 合成
単一話者:
python3 "$S" tts "আপনার টেক্সট" -l bn -o out.mp3
python3 "$S" tts --text-file article.md -l en --preset news -o article.mp3
対話:
python3 "$S" conversation dialog.txt -l bn \
--map "মানুষ=Nayem,AI=Pooja - Everyday Assistant" \
--loudnorm --srt dialog.srt -o dialog.mp3
長時間または高コストな実行の場合は、最初に --dry-run を使用します。
ステップ4 — 検証
QAは自動的に実行されます。任意のファイルを再チェックする場合:
python3 "$S" verify out.mp3
チェック内容: デコード、再生時間、統合ラウドネス(ebur128)、トゥルーピーク/クリッピング、リーディング/トレーリング/内部サイレンス。終了コード5はFAILを意味します。
ステップ5 — 提供
報告:
out.mp3 — 2.8s, 0.04 MB, QA PASS (-18.9 LUFS, peak -4.2 dBFS)
特に要求がない限り、生のJSONを貼り付けないでください。
ステップ6 — 再利用
再実行はキャッシュにヒットします(~/.cache/speakee-tas)。再生成するには --force、キャッシュを消去するには cache-clear を使用します。
ワークフローB — 音声認識(STT)
ユーザーが音声または動画ファイルを持っていて、書き起こし、字幕、キャプション、SRTを希望する場合にこれを使用します。Whisper をインストールしない — バンドルスクリプトが Speakee /api/stt エンドポイントを直接呼び出します。
ステップ1 — ファイルの確認
python3 "$S" verify /path/to/audio.mp3 # オプション: デコード可能か確認
ls -la /path/to/audio.mp3
ステップ2 — 言語の選択
# 自動検出(信頼できません — Whisper はベンガル語とグジャラート語を混同します):
python3 "$S" stt audio.mp3
# 言語がわかっている場合は常に明示的に指定:
python3 "$S" stt audio.mp3 -l bn
重要: 正しいスクリプトのために -l <コード> を渡してください。ベンガル語には -l bn を使用します。自動検出はベンガル語の音声に対してグジャラート語を返します。低信頼度(< 0.5)の警告は、検出された言語がおそらく間違っていることを意味します。
ステップ3 — 書き起こし + 字幕作成
# 入力ファイルの隣に SRT + VTT を書き込み、テキストも保存:
python3 "$S" stt audio.mp3 -l bn \
--srt --srt-path audio.srt --vtt --vtt-path audio.vtt \
-o audio.txt
# 省略形: SRT のみ(subtitle コマンド):
python3 "$S" subtitle audio.mp3 -l bn -o audio.srt
# 機械可読なJSON(他のツール向け):
python3 "$S" stt audio.mp3 -l bn --json -o result.json
# 長時間録音: 自動チャンク約120秒。小さなチャンクまたは1回のアップロードを強制:
python3 "$S" stt audio.mp3 -l bn --chunk-seconds 60
python3 "$S" stt audio.mp3 -l bn --no-chunk # ~3.5 MB未満の場合のみ
ステップ4 — 提供
報告:
audio.srt — 111 cues (8.05分, ベンガル語)
audio.txt — 書き起こし保存済み
STTフラグ: --srt, --srt-path, --vtt, --vtt-path, --no-word-timestamps(高速、推定タイミング), --chunk-seconds, --no-chunk, --workers, --max-chars, --max-line-seconds。
会話モード(TTS)
スクリプトフォーマット、各行が1ターン:
The show begins. <- 「Speaker:」なし → ナレーター音声
মানুষ: ভাই, ২+২ কত?
AI: আপনার প্রশ্নটি গ্রহণ করা হয়েছে।
- 話者ラベルは
:の前の短いトークン(16文字以内、スペースなし)。 - 「Speaker:」プレフィックスがない行はナレーター/コメンテーターです。ナレーターは特別なキー
narratorでマッピングされるため、3つ目の音声は--map "narrator=VoiceC,মানুষ=VoiceA,AI=VoiceB"のように指定します。 --map "話者=音声"は音声名(あいまい一致)またはUUIDを受け付けます。--mapがない場合、異なる音声が自動的に割り当てられます。- 音声は異なっている必要があります。 2人の話者が同じ音声に解決されると、スクリプトは
WARNINGを表示します。各話者に異なる音声をマッピングしてください。常にAIと人間には異なる音声を割り当て(コメンテーター/ナレーター行が存在する場合は3つ目の音声も)、ナレーターにも別の音声を使用します。 --silence 0.35でターン間のギャップを設定。--loudnormで -16 LUFS に正規化。--manifest FILEですべてのセグメントを記録。--srt FILEで字幕を書き込みます。--no-stitchで1つのMP3ではなく個別のセグメントファイルを保持します。--workersで並列リクエスト数を制御(デフォルト4)。
オプション(よく使われるもの)
| フラグ | デフォルト | 意味 |
|---|---|---|
-l, --language | 自動検出 | ISOコードまたは uid |
-m, --model | sonic-3.5 | sonic-3.5 / sonic-3 / sonic-turbo / sonic-2 |
-v, --voice_id | プリセット/デフォルト | 音声名またはUUID |
-o, --out | 自動 | 出力ファイル / ディレクトリ(--no-stitch時) |
-s, --speed | 1.2 | 0.5–2.0 |
--preset | — | news, story, assistant, audiobook |
--chunk-limit | 1200 | リクエストあたりの文字数 |
--retries | 4 | 指数バックオフでのリトライ |
--workers | 4 | 並列リクエスト数 |
--no-cache / --force | オフ | キャッシュバイパス / 再生成 |
--no-verify | オフ | 自動QAをスキップ(非推奨) |
--dry-run | オフ | 計画を表示し、リクエストは行わない |
--json | オフ | 機械可読な出力 |
STTオプション
| フラグ | デフォルト | 意味 |
|---|---|---|
-l, --language | auto | ISOコード(ベンガル語には bn) |
--chunk-seconds | 120 | アップロードあたりの音声秒数 |
--no-chunk | オフ | 1回のリクエスト(最大約3.5 MB) |
--workers | 2 | 並列アップロード数 |
--srt / --srt-path | オフ | SRTを書き込む |
--vtt / --vtt-path | オフ | WebVTTを書き込む |
--no-word-timestamps | オフ | 高速; 字幕のタイミングは推定 |
--max-chars | 42 | 最大キュー文字数 |
--max-line-seconds | 6.0 | 最大キュー秒数 |
--timeout / --retries | 300 / 3 | リクエストあたりのタイムアウト / リトライ回数 |
キャッシュと安全性
- セグメントはコンテンツハッシュで
~/.cache/speakee-tasにキャッシュされ、再実行とリトライは自動的に再開されます。 - 一時的な結合ファイルは常に削除されます。
--no-cacheの一時ディレクトリは終了時にクリーンアップされます。 - レスポンスは検証(
Content-Type: audio/*+ MP3ヘッダー)されるため、エラーJSONが音声として保存されることはありません。 - HTTP 429 は
Retry-Afterを尊重。5xx/タイムアウトはバックオフでリトライ。永続的な4xxはサーバーメッセージとともに即座に失敗します。 - STTはPython標準ライブラリだけでプロセス内で実行 — ネットワークインストール、モデルダウンロード、pipは不要。
- 終了コード:
0成功、1エラー、2使用方法、3検証、4ネットワーク/API、5音声QA失敗。
リファレンスファイル
references/api.md— エンドポイント、ペイロード、検証、リトライ、キャッシュ。references/voices.md— 言語/音声カタログ、UIDモード、プリセット。references/troubleshooting.md— 症状、修正方法、一般的な失敗モード。assets/presets.json— 厳選された音声プリセット(編集して独自のものを追加可能)。