Gemini TTS MP3 Skill
前提
- APIキーは次の順で参照する
./.env
scripts/../.env(リポジトリ直下)
- 環境変数
GEMINI_API_KEY(最後のフォールバック)
node(推奨: 18以上)と curl が利用可能
ffmpeg がインストール済み
クイックスタート
.env を作成する
cat > .env <<'EOF'
GEMINI_API_KEY=your-api-key
EOF
- 一括実行でMP3を作る(長文は文単位で自動分割)
./scripts/tts_to_mp3.sh \
--text "こんにちは。Gemini TTSの音声テストです。" \
--voice Zephyr \
--max-chars 300 \
--output-dir outputs \
--output-base sample
- 出力を確認する
主要スクリプト
scripts/generate_tts.sh
- Gemini APIへリクエストして
response.json を保存
scripts/decode_pcm_to_wav.js
inlineData.data をPCMとしてデコードしWAV化
scripts/split_text_chunks.js
- 文単位でテキストを分割し、長文を複数チャンクにする
scripts/wav_to_mp3.sh
scripts/tts_to_mp3.sh
- 分割 -> TTS -> WAV結合 -> MP3変換を一括実行
推奨設定
- MP3品質:
-q:a 2(LAME VBR、高音質と容量のバランスが良い)
- 音声モデル:
gemini-2.5-flash-preview-tts
- 音声名の例:
Zephyr, Kore, Aoede
- 分割文字数:
--max-chars 200-400(初期値は300、破綻する場合は小さくする)
追加オプション
--output-dir: 出力先フォルダを指定する(デフォルト: .)
--max-chars: 長文分割の閾値を指定する(推奨: 200-400)
--keep-temp: 中間ファイル(JSON/WAV/チャンク)を保持する
- オプション利用例:
./scripts/tts_to_mp3.sh \
--text "中間ファイルも保存します" \
--output-dir outputs \
--output-base debug \
--max-chars 250 \
--keep-temp
実行後検証(必須)
TARGET="outputs/sample.mp3" # 実際の --output-dir/--output-base に合わせて変更
ffprobe -v error -show_entries stream=codec_name -of default=nw=1:nk=1 "$TARGET"
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 "$TARGET"
codec_name が mp3
duration が 0 より大きいこと
運用メモ
gemini-2.5-flash-preview-tts が失敗する場合は --model で切り替えて確認する
- 長文で不安定な場合は
--max-chars を小さくして再実行する
- API失敗時は5秒待機して手動で最大3回まで再実行する
- APIキーはログ・画面共有・履歴に出さない(
GEMINI_API_KEY を直接表示しない)
.env は GEMINI_API_KEY=... 形式で記述する(行末コメントは付けない)
トラブルシュート
GEMINI_API_KEY is not set.
./.env または scripts/../.env に GEMINI_API_KEY=... があるか確認する
- なければ環境変数
GEMINI_API_KEY を設定する
ffmpeg is required but not found in PATH.
Audio data not found in response JSON.
--max-chars must be a positive integer.