mcpField
B
blog-audio

blog-audio

github.com/infrasity-labsクリエイティブ・メディア15095 回インストール18 週間前に更新
リポジトリ

blog-audio について

blog-audioは、GoogleのGemini TTSでブログ記事を音声化するスキルです。要約、全文朗読、二人の対話形式に対応し、音声の選択とHTML5埋め込みコードの出力ができます。

主な機能

  1. 01要約または全文のナレーション生成
  2. 02二人の対話スクリプト作成
  3. 03音声カタログから声を選択
  4. 04HTML5埋め込み用の音声を出力
  5. 05FFmpegがあればMP3に変換

活用シーン

  1. 01ブログ記事の音声版を用意
  2. 02記事の短い音声概要を作成
  3. 03記事をポッドキャスト風の対話にする

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/infrasity-labs/dev-gtm-claude-skills --skill blog-audio

インストール後、Claude Code で/blog-audioを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
voices.md
scripts/
__init__.py
generate_audio.py
requirements.lock
requirements.txt
run.py
setup_environment.py

詳細

ブログ音声:ブログ記事向け Gemini TTS ナレーション

Google の Gemini TTS を使って、ブログコンテンツのプロフェッショナルな音声ナレーションを生成します。 3 つのモードに対応しています:要約(200~300 語の音声による概要)、記事全体の読み上げ、または 2 人の話者によるポッドキャスト形式の対話。30 種類の音声、80 以上の言語に対応し、HTML5 埋め込み形式で出力します。

クイックリファレンス

コマンド動作
/blog audio generate <file>ブログ記事の音声ナレーションを生成します
/blog audio voices特徴付きの利用可能な音声を表示します
/blog audio setupGemini 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 の場合:

  1. GOOGLE_AI_API_KEY が環境変数に設定されているか確認します
  2. blog-image が設定済みの場合(.mcp.json を確認)、キーはすでに利用可能です
  3. そうでない場合は、https://aistudio.google.com/apikey をユーザーに案内します
  4. ドライランで確認します: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:結果を提供する

結果をユーザーに提示します:

  1. ファイルパス:音声の保存先
  2. 長さ:人が読みやすい形式(例:「3:42」)
  3. 埋め込みコード:すぐに貼り付けられる HTML5 audio タグ
  4. 費用:API 費用の概算
  5. 配置の提案:ブログ記事内で埋め込みを挿入する場所

埋め込みガイド

標準 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 または pro
  • output_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 種類の音声カタログ、コンテンツの種類別の推奨音声、対話向けの組み合わせ

コメント