Blog Audio -- Gemini TTS によるブログ記事ナレーション
Google Gemini TTS を使用して、ブログコンテンツのプロフェッショナルな音声ナレーションを生成します。 3つのモード: サマリー(200〜300語の音声概要)、全文読み上げ、または2人によるポッドキャスト形式の対話。30種類の音声、80以上の言語、HTML5埋め込み出力に対応。
クイックリファレンス
| コマンド | 機能 |
|---|---|
/blog audio generate <file> | ブログ記事の音声ナレーションを生成 |
/blog audio voices | 利用可能な音声とその特徴を表示 |
/blog audio setup | Gemini TTS 用のAPIキーを確認・設定 |
前提条件
- Python 3.11+(仮想環境は
run.pyで自動管理) GOOGLE_AI_API_KEY環境変数(blog-image と同じキー)- FFmpeg(WAV→MP3変換用。ない場合はWAV出力にフォールバック)
常に run.py ラッパーを使用する
# 正しい方法:
python3 scripts/run.py generate_audio.py --text "..." --voice Charon --json
# 間違った方法:
python3 scripts/generate_audio.py --text "..." # 仮想環境がないため失敗
APIキーチェック(ゲートパターン)
音声生成前にAPIキーを確認する:
echo $GOOGLE_AI_API_KEY
- 設定されている場合: 生成を続行
- 設定されていない場合: ユーザーに案内する:
"音声生成には Google AI API キーが必要です。無料で取得できます: https://aistudio.google.com/apikey
設定方法:
export GOOGLE_AI_API_KEY=your-keyこれは/blog imageと同じキーです。画像生成が動けば音声も動きます。" - 内部から呼び出された場合(blog-writeから): キーがない場合は静かに戻る。 決して書き込みワークフローをブロックしない。
セットアップ
/blog audio setup の場合:
- 環境変数
GOOGLE_AI_API_KEYが設定されているか確認 - blog-image が設定済みの場合(
.mcp.jsonを確認)、キーはすでに利用可能 - 設定されていない場合、ユーザーを https://aistudio.google.com/apikey に案内
- ドライランで検証:
python3 scripts/run.py generate_audio.py --text "Test" --dry-run --json
音声選択
/blog audio voices の場合:
references/voices.md を読み込み、音声カタログをユーザーに提示する。
ユーザーに希望の音声を尋ねるか、コンテンツタイプに基づいて推奨する:
- 記事ナレーション: Charon(情報提供向き)または Sadaltager(知識豊富)
- チュートリアル/ハウツー: Achird(フレンドリー)または Sulafat(温かみ)
- ニュース/分析: Rasalgethi(情報提供向き)または Schedar(バランス)
- ライフスタイル/ウェルネス: Aoede(軽快)または Vindemiatrix(優しい)
- 対話ホスト: Puck(明るい)または Laomedeia(明るい)
- 対話専門家: Kore(しっかり)または Charon(情報提供向き)
生成ワークフロー
/blog audio generate <file> の場合:
ステップ1: ブログ記事を読む
ファイルを読み込んで以下を抽出:
- タイトル(H1またはフロントマターから)
- 全文(マークダウン本文)
- おおよその単語数
ステップ2: モードを選ぶ
ユーザーに尋ねる(--mode が指定されていれば自動選択):
| モード | 使用タイミング | 出力 |
|---|---|---|
| サマリー | クイックオーディオ概要(1〜2分) | 200〜300語の音声サマリー |
| 全文 | 完全読み上げ(5〜15分) | 自然な音声の全文 |
| 対話 | ポッドキャスト形式(3〜8分) | 記事に関する2人での会話 |
ステップ3: テキストを準備する
重要: Claudeがテキストを準備します。スクリプトはTTSのみ行います。
サマリーモード: 記事の200〜300語の音声サマリーを作成します。ルール:
- 書き言葉ではなく、自然な話し言葉で書く
- 記事の重要な発見や答えで始める
- 3〜5個の主要ポイントをカバー
- 実用的なアドバイスで締めくくる
- マークダウン、"この記事では..."、メタ解説は使わない
- 会話的な接続詞を使う("ここで重要なのは..."、"鍵となる発見は...")
全文モード: マークダウンコンテンツをクリーンな話し言葉に変換:
- 見出しは自然なトランジションに("次に...を見てみましょう")
- リンクはプレーンテキストに(URLを削除、アンカーテキストは残す)
- 画像やチャート: 省略するか簡潔に説明("データが示すように...")
- コードブロック: 口頭で説明("コードはforループを使用して...")
- リスト: 自然な文章に変換
- フロントマター、スキーママークアップ、HTMLタグを削除
- 短いイントロを追加: "これは[タイトル]、[日付]公開です。"
対話モード: 記事についての2人会話スクリプトを作成:
- スピーカー1 = ホスト(好奇心旺盛、良い質問をする)
- スピーカー2 = 専門家(知識が豊富、明確に答える)
- 各行のフォーマット:
[Speaker1] ここでの重要なポイントは何ですか? - 記事の主要ポイントを会話形式でカバー
- 15〜25のやり取り(約3〜8分)
- 自然で、ぎこちなくない("研究が示すように…"ではなく"それは良いポイントですね")
ステップ4: 音声を選ぶ
ユーザーが音声を選択した場合はそれを使用。そうでない場合はモードに基づいて推奨:
- サマリー/全文: デフォルトで Charon(情報提供向き)
- 対話: デフォルトで Puck(ホスト)+ Kore(専門家)
ステップ5: 音声を生成する
準備したテキストを一時ファイルに書き込み、次を呼び出す:
# 単一音声(サマリーまたは全文モード)
python3 scripts/run.py generate_audio.py \
--text-file /tmp/blog_audio_prepared.txt \
--voice Charon \
--model flash \
--output /path/to/audio/post-slug.mp3 \
--json
# 2つの音声(対話モード)
python3 scripts/run.py generate_audio.py \
--text-file /tmp/blog_audio_dialogue.txt \
--voice Puck \
--voice2 Kore \
--model pro \
--output /path/to/audio/post-slug-dialogue.mp3 \
--json
モデル選択:
flash(デフォルト): 高速、低コスト。サマリーや標準ナレーションに最適。pro: 高音質。対話モードやプレミアムコンテンツに使用。
ステップ6: 結果を提供する
結果をユーザーに提示:
- ファイルパス -- 音声が保存された場所
- 再生時間 -- 人間が読める形式(例: "3:42")
- 埋め込みコード -- コピーして使えるHTML5 audioタグ
- コスト -- 推定APIコスト
- 配置候補 -- 埋め込みをブログ記事のどこに挿入するか
埋め込みガイド
標準HTML(Hugo、Jekyll、静的サイト)
<audio controls preload="metadata">
<source src="audio/post-slug.mp3" type="audio/mpeg">
お使いのブラウザは audio 要素をサポートしていません。
</audio>
MDX(Next.js、Gatsby)
<audio controls preload="metadata">
<source src="/audio/post-slug.mp3" type="audio/mpeg" />
</audio>
WordPress
[audio src="audio/post-slug.mp3"]
配置
オーディオプレーヤーは、導入部の後(最初のH2の下)または記事の最上部にラベル付きで挿入します: 「この記事を聴く」または「音声版」。
内部API(blog-write用)
blog-writeから内部で呼び出された場合:
入力:
text: 準備済みテキスト(Claudeがすでにクリーニング済み)voice: 音声名(デフォルト: Charon)voice2: 対話用の2番目の音声(オプション)model: flash または prooutput_path: ファイルの保存先
出力:
### 音声ナレーション
- **パス:** /path/to/audio/post-slug.mp3
- **再生時間:** 3:42
- **音声:** Charon
- **埋め込み:** `<audio controls preload="metadata"><source src="audio/post-slug.mp3" type="audio/mpeg"></audio>`
優雅なフォールバック: GOOGLE_AI_API_KEY が設定されていない場合、エラーなしですぐに戻る。書き込みワークフローは音声なしで継続する。音声生成が利用できないために blog-write をブロックすることは決してしない。
エラーハンドリング
| エラー | 解決方法 |
|---|---|
| GOOGLE_AI_API_KEY が未設定 | キーを取得: https://aistudio.google.com/apikey |
| FFmpeg が見つからない | インストール: sudo apt install ffmpeg。WAV出力にフォールバック。 |
| レート制限 | 待ってから再試行。制限を確認: https://aistudio.google.com/rate-limit |
| テキストが長すぎる(32kトークン超) | セクションに分割し、個別に生成 |
| 不明な音声名 | /blog audio voices を実行して有効なオプションを確認 |
| APIエラー | キーの有効性、モデルの利用可能性(プレビューモデル)を確認 |
| APIキー不足(内部呼び出し) | 静かに戻る -- 書き込みワークフローは継続 |
リファレンスドキュメント
オンデマンドで読み込む -- 起動時にすべてを読み込まない:
references/voices.md-- 全30音声カタログ、コンテンツタイプ別の推奨、対話ペアリング