blog-audio について
blog-audioは、GoogleのGemini TTSでブログ記事を音声化するスキルです。要約、全文朗読、二人の対話形式に対応し、音声の選択とHTML5埋め込みコードの出力ができます。
主な機能
- 01要約または全文のナレーション生成
- 02二人の対話スクリプト作成
- 03音声カタログから声を選択
- 04HTML5埋め込み用の音声を出力
- 05FFmpegがあればMP3に変換
活用シーン
- 01ブログ記事の音声版を用意
- 02記事の短い音声概要を作成
- 03記事をポッドキャスト風の対話にする
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ infrasity-labs/ dev-gtm-claude-skills --skill blog-audioインストール後、Claude Code で/blog-audioを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/voices.mdscripts/__init__.pygenerate_audio.pyrequirements.lockrequirements.txtrun.pysetup_environment.py詳細
ブログ音声:ブログ記事向け 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によって venv が自動管理されます) GOOGLE_AI_API_KEY環境変数(blog-image と同じキーを使用します)- FFmpeg(WAV から MP3 への変換に使用します。ない場合は WAV にフォールバックします)
必ず run.py ラッパーを使用する
# CORRECT:
python3 scripts/run.py generate_audio.py --text "..." --voice Charon --json
# WRONG:
python3 scripts/generate_audio.py --text "..." # Fails without venv
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(Informative)または Sadaltager(Knowledgeable)
- チュートリアル/ハウツー:Achird(Friendly)または Sulafat(Warm)
- ニュース/分析:Rasalgethi(Informative)または Schedar(Even)
- ライフスタイル/ウェルネス:Aoede(Breezy)または Vindemiatrix(Gentle)
- 対話の司会者:Puck(Upbeat)または Laomedeia(Upbeat)
- 対話の専門家:Kore(Firm)または Charon(Informative)
生成ワークフロー
/blog audio generate <file> の場合:
ステップ 1:ブログ記事を読む
ファイルを読み、以下を抽出します。
- タイトル(H1 または frontmatter から)
- 全文(Markdown 本文)
- おおよその語数
ステップ 2:モードを選ぶ
ユーザーに尋ねるか、--mode が指定されている場合は自動選択します。
| モード | 用途 | 出力 |
|---|---|---|
| Summary | 手短な音声概要(1~2 分) | 200~300 語の音声による要約 |
| Full | 全文の読み上げ(5~15 分) | 記事全体を自然な話し言葉で読み上げ |
| Dialogue | ポッドキャスト形式(3~8 分) | 記事についての 2 人の会話 |
ステップ 3:テキストを準備する
重要: テキストを準備するのは Claude です。スクリプトは TTS のみを実行します。
要約モード: 記事を音声で読み上げるための、200〜300語の要約を書きます。ルール:
- 書き言葉ではなく、自然な話し言葉にします
- 記事の主な発見や答えから始めます
- 3〜5個の主なポイントを取り上げます
- 実践的なアドバイスで締めくくります
- Markdown、「この記事では……」などの表現、メタコメントは使いません
- 会話的なつなぎの表現を使います(「重要なのは……」「主な発見は……」など)
全文モード: Markdown の内容を、音声で読み上げやすいテキストに整えます:
- 見出しは自然なつなぎの表現にします(「次に、……を見ていきましょう」など)
- リンクはプレーンテキストにします(URL を削除し、アンカーテキストは残します)
- 画像やグラフは省略するか、簡単に説明します(「データが示すように……」など)
- コードブロックは口頭で説明します(「このコードでは for ループを使って……」など)
- リストは自然な文章に変換します
- フロントマター、スキーママークアップ、HTML タグを削除します
- 短い導入を加えます:「これは、[日付]に公開された[タイトル]です。」
対話モード: 記事について、2 人の会話形式の台本を書きます:
- Speaker1 = ホスト(好奇心旺盛で、的確な質問をします)
- Speaker2 = 専門家(知識が豊富で、明快に答えます)
- 各行を次の形式にします:
[Speaker1] ここでの重要なポイントは何ですか? - 記事の主なポイントを会話形式で取り上げます
- 15〜25 回のやり取りにします(約3〜8分の音声になります)
- 堅苦しくない自然な会話にします(「まさにそのとおりです」より「それはいい指摘ですね」)
ステップ 4:音声を選ぶ
ユーザーが音声を選択している場合は、その音声を使います。選択していない場合は、モードに応じて推奨します:
- 要約/全文:デフォルトは Charon(情報提供)
- 対話:デフォルトは Puck(ホスト)+ Kore(専門家)
ステップ 5:音声を生成する
準備したテキストを一時ファイルに書き込み、次を呼び出します:
# Single voice (summary or full mode)
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
# Two voices (dialogue mode)
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">
Your browser does not support the audio element.
</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:ファイルの保存先
出力:
### Audio Narration
- **Path:** /path/to/audio/post-slug.mp3
- **Duration:** 3:42
- **Voice:** Charon
- **Embed:** `<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 種類の音声カタログ、コンテンツの種類別の推奨音声、対話向けの組み合わせ