Communityコーディング&開発github.com

tas — テキストと音声の双方向変換 (Speakee API)

テキストを音声に変換(TTS)し、音声/動画ファイルをテキストや字幕に書き起こします(STT)。Speakee API を使用し、両方向の処理を1つのスクリプトで実現します。

tas — テキストと音声の双方向変換 (Speakee API) とは?

このスキルは、テキストと音声の間で双方向の変換を提供します。一方はテキスト読み上げ(TTS)で、40以上の言語、100以上の音声、カスタム音声UID、長文分割、複数話者による会話モード、ffmpeg による結合、品質検証に対応しています。もう一方は音声認識(STT)で、音声/動画ファイルのテキスト書き起こし、単語タイムスタンプ、SRT/WebVTT 字幕の生成を自動分割で行います。 すべての処理はバンドルされた1つのPythonスクリプト(scripts/tas.py)で動作し、pip インストールやローカルモデルは一切不要です。OpenCode、Claude Code、npx skills などの主要なAIエージェントプラットフォームで読み込めます。 重要なルールとして、バンドルスクリプトのみを使用すること、パッケージをインストールしないこと、音声QAで品質検証を行うこと、言語コードを明示すること、音声名を推測しないことなどが徹底されています。キャッシュ機構により再実行が高速で、HTTP 429 レート制限への対応、リトライ処理も組み込まれています。

対応✓Claude Code~Codex CLI~Cursor✓OpenCode
npx skills add https://github.com/nayem-48ai/TAS/tree/HEAD/skills/tas

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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 ではありません。

絶対ルール(すべてのリクエストに適用)

  1. バンドルスクリプトを使用する。 TTS や STT のためのアドホックな curl や Python スニペットは使わない。
  2. 絶対に何もインストールしない。 pip install faster-whisper、pip install whisper、pip install torch を実行したり、モデルをダウンロードしない。スクリプトは Speakee API 経由で STT を行い、Python 標準ライブラリのみを使用 — ローカルモデル、ローカルダウンロード、pip は不要。
  3. 提供前に検証する。 tts と conversation は自動的に音声QAを実行します。QA: FAIL は修正し、決して納品してはいけません。
  4. 結果を報告する: 最終パス、再生時間、サイズ、QAステータス(TTS)、最終SRT/VTT/テキストパスとキュー数(STT)。
  5. 常に事前確認する。 言語、モデル、音声はリクエスト前に検証され、推測した音声を送信してはいけません。
  6. キャッシュをオンのままにする(ユーザーが別途指示した場合を除く)。再実行が高速になり、失敗した会話の再開も可能です。
  7. 音声名を推測しない。 voices / suggest で解決するか、UUID を渡す。
  8. 無料APIを尊重する: デフォルトは --workers 4。HTTP 429 の場合は数を減らす。
  9. スクリプトにテキストの正規化を任せる。 マークダウン、URL、HTML、絵文字はデフォルトで削除されます。ユーザーがリテラルテキストを希望する場合のみ --raw を使用。
  10. 長いテキストを事前に分割しない。 スクリプトが文の区切りでチャンク分割し、自動マージします。
  11. STTでは言語がわかっている場合、常に -l <コード> を渡す。 自動検出は信頼できません(Whisper はベンガル語とグジャラート語を混同します)。正しいベンガル語には -l bn が必要です。
  12. 結果を別のツールやスクリプトで使用する場合は --json を使う。

コマンド

コマンド目的
tts1つのテキストブロックを合成(TTS)
uidカスタム音声UIDで合成(language=uid)
conversation複数話者の対話 → 1つの結合・検証済みMP3
stt音声/動画ファイルを書き起こし → テキスト(+ オプションでSRT/VTT)
transcribestt のエイリアス
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, --modelsonic-3.5sonic-3.5 / sonic-3 / sonic-turbo / sonic-2
-v, --voice_idプリセット/デフォルト音声名またはUUID
-o, --out自動出力ファイル / ディレクトリ(--no-stitch時)
-s, --speed1.20.5–2.0
--preset—news, story, assistant, audiobook
--chunk-limit1200リクエストあたりの文字数
--retries4指数バックオフでのリトライ
--workers4並列リクエスト数
--no-cache / --forceオフキャッシュバイパス / 再生成
--no-verifyオフ自動QAをスキップ(非推奨)
--dry-runオフ計画を表示し、リクエストは行わない
--jsonオフ機械可読な出力

STTオプション

フラグデフォルト意味
-l, --languageautoISOコード(ベンガル語には bn)
--chunk-seconds120アップロードあたりの音声秒数
--no-chunkオフ1回のリクエスト(最大約3.5 MB)
--workers2並列アップロード数
--srt / --srt-pathオフSRTを書き込む
--vtt / --vtt-pathオフWebVTTを書き込む
--no-word-timestampsオフ高速; 字幕のタイミングは推定
--max-chars42最大キュー文字数
--max-line-seconds6.0最大キュー秒数
--timeout / --retries300 / 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 — 厳選された音声プリセット(編集して独自のものを追加可能)。

関連スキル