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

blog-audio

ブログ記事のプロフェッショナルな音声ナレーションをGoogle Gemini TTSで生成します。サマリー、全文読み上げ、2人トークの3モードに対応。

blog-audio とは?

このスキルは、Google Gemini TTSを活用してブログ記事の高品質な音声ナレーションを生成するためのものです。3つの動作モード(200〜300語の概要サマリー、全文読み上げ、2人によるポッドキャスト形式の対話)を備え、30種類の音声、80以上の言語に対応し、HTML5埋め込みコードを出力します。主にブログ執筆ワークフロー内で使用され、`/blog audio generate <file>` コマンドで記事ファイルを指定すると、Claudeが自動的にテキストを準備し、音声を生成します。内部APIとして `blog-write` から呼び出された場合は、APIキーがなければ静かにスキップするなど、執筆ワークフローを妨げない設計になっています。APIキーは `GOOGLE_AI_API_KEY` 環境変数で設定し、`blog-image` スキルと同じキーを利用します。

対応✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-audio

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

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

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

ドキュメント

Blog Audio -- 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 で自動管理)
  • 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 の場合:

  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(情報提供向き)または 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: 結果を提供する

結果をユーザーに提示:

  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">
  お使いのブラウザは 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 または pro
  • output_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音声カタログ、コンテンツタイプ別の推奨、対話ペアリング

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

関連スキル