Skip to content

About

AI news podcast generator — daily episodes via GitHub Pages

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

newspicker — 多言語 RSS Podcast Generator

複数の言語からなる最新のニュース(AI、技術、自動車など)を RSS から自動収集・日本語で要約・音声化して、GitHub Pages 上で Podcast として配信するシステムです。RSS と Gemini Grounding Search を活用した自動メンテナンス機能を備えています。

サンプルとして AI 関連のニュースを集めた Podcast、朝刊ワールドAIニュース を公開しています:

🏗 アーキテクチャ

毎朝 6:00 JST (GitHub Actions)   timeout-minutes: 20
    │
    ├─ @scout    agents/scout.py   → 多言語 RSS (日・中・英) → 上位 7 記事
    │                                 [timing] ログ
    │
    ├─ @editor   agents/editor.py  → Gemini 3 Flash → カテゴリ別・動的台本生成
    │                                 API timeout: 120s / retry: max 3
    │                                 [timing] / [editor] ログ
    │
    ├─ @voice    agents/voice.py   → Gemini TTS → MP3 & SRT (字幕)
    │                                 API timeout: 120s / retry: max 3
    │                                 segment単位の [timing] / [voice] ログ
    │
    └─ @android  agents/android.py → Podcast RSS (feed.xml) 更新
                                      [timing] ログ
                       │
毎週日曜 12:00 JST
    └─ @maintenance scripts/maintain_feeds.py → Gemini Grounding Search
                                             → 生存確認・URL復旧・新規発見

⚙️ 独自の内容に変える手順

このテンプレートは、設定ファイルを書き換えるだけで別ジャンルの Podcast に流用できます。新しいテーマで使うときは、以下の順で変更すると手戻りが少なくなります。

  1. 配信名と公開URLを決める
    • GitHub リポジトリ名を変える場合は、この段階で変更
    • config/podcast_meta.yml の base_url を https://<GitHubユーザー名>.github.io/<リポジトリ名> に更新
    • scripts/publish_to_github.py は現在の Git 情報から owner/repo を自動判定するので、通常は追加修正不要
  2. 番組メタ情報を変える
    • config/podcast_meta.yml の title, short_title, description, author, category を更新
    • Apple Podcasts / Spotify 向けに name と email を設定すると、RSS に itunes:owner と atom:link rel="self" が入る
    • prompt_persona, prompt_greeting を新テーマ向けの語り口に合わせる
    • 配信先URLが変わったら、既存の docs/feed.xml と docs/index.html は再生成される前提で扱う
  3. ニュースソースを入れ替える
    • config/sources.yml の keywords を対象テーマ向けに変更
    • rss_feeds を収集したい媒体に入れ替える
  4. 見た目を差し替える
    • docs/podcast_cover.jpg を新しいカバー画像に差し替える
    • 推奨サイズは 1400x1400px、500KB 以下
  5. 動作確認する
    • uv run python scripts/run_pipeline.py を実行
    • 生成された docs/feed.xml と docs/index.html を確認
    • 問題なければ GitHub Pages と Podcast アプリで購読テスト

補足:

  • pyproject.toml の name は Python プロジェクト名です。リポジトリ名と一致していなくても動作はしますが、配布名や環境表示も揃えたい場合は変更してください。
  • pyproject.toml の name を変えた場合は uv sync または uv lock をやり直すのが安全です。

🔑 必要な Secrets

GitHub リポジトリの Settings → Secrets and variables → Actions に登録:

名前 取得元 役割
GEMINI_API_KEY Google AI Studio 台本生成, 音声合成, Grounding Search

⚙️ セットアップ

  1. このリポジトリを fork / clone
  2. config/podcast_meta.yml の base_url を自分の GitHub Pages URL に変更
  3. GitHub Secrets (GEMINI_API_KEY) を設定
  4. リポジトリの Settings → Pages → Source を docs/ フォルダに設定
  5. Actions タブから daily_podcast.yml を手動実行してテスト

🛠 フィード自動メンテナンス

scripts/maintain_feeds.py は以下の機能を提供します:

  • 生存確認: 応答がないフィードを検知(3回連続で自動削除)
  • 自動修復: URL が変わった場合、Gemini Grounding Search で新しいアドレスを検索・更新
  • 自動発見: 人気の RSS フィードを Grounding Search で定期的に検索し、リストに追加

✍️ エディタープロンプトの使い方

台本生成は、config/podcast_meta.yml の editor_prompt_template で定義したプロンプトをもとに行います。agents/editor.py では、このテンプレートが見つからない場合に備えてフォールバック用の既定プロンプトを持っています。

  • 主要な調整ポイントは persona、greeting、tts_model、short_title などです。
  • 文章のトーン、見出しの長さ、ふりがなルール、記事の並び順などは、このテンプレート内で制御できます。
  • 新しいテーマに切り替えるときは、まず editor_prompt_template を編集して、読み上げ方針や用語ルールを合わせるのがおすすめです。
  • ふりがなについては、括弧は読みのためだけに使い、括弧内はひらがな・カタカナの単純な読みのみとするルールを明示すると、音声化時のノイズを減らせます。

📱 アプリでの購読

Podcast アプリ(AntennaPod, Apple Podcasts 等)を開き、以下の URL を登録:

https://<あなたのユーザー名>.github.io/<あなたのリポジトリ名>/feed.xml

📦 依存関係・環境構築

uv を使用します。

# 依存パッケージのインストール
uv sync

# パイプラインの手動実行
uv run python scripts/run_pipeline.py

# フィードメンテナンスの手動実行
uv run python scripts/maintain_feeds.py --auto-add

🛠 開発とデバッグ

デバッグモードの利用

パイプライン実行時に --debug フラグを付けることで、デバッグ情報が出力され、中間データが保存されます。

uv run python scripts/run_pipeline.py --debug
  • PCMデータの保存: docs/episodes/ 内に、TTSから返された生の音声データ (.pcm) が保存されます。音声品質の確認に利用できます。
  • 詳細なエラーログ: APIレスポンスの詳細(finish_reason や安全しきい値の状態など)が出力されます。

最近の改善点

  • パイプライン安定化 (3段階防御):
    • 実行時間ログ: 全セクション(@scout, @editor, @voice, @android)とVoice各segmentの実行時間を [timing] / [voice] ログで出力。どこで時間を消費しているか特定可能。
    • GitHub Actions タイムアウト: Run pipeline ステップに timeout-minutes: 60 を設定。長時間のハングを防止。
    • API タイムアウト・リトライ: Gemini API 呼び出しに120秒のタイムアウトと最大3回のリトライ(指数バックオフ+jitter)を実装。一時的なAPI障害を自動回復。恒久的エラー(400系)は即時失敗。
  • エディタープロンプトでは、括弧はふりがな表示にのみ使用し、括弧内はひらがな・カタカナの単純な読みだけにするルールを明示しました。
  • 音声合成前のテキスト整形では、1文に複数の括弧付き表記があっても、前後の文脈を巻き込まずに各ふりがなを処理するようにしました。

便利な環境変数

ローカルでの開発・テスト時に以下の環境変数を設定することで、動作をカスタマイズできます。

  • GEMINI_API_KEY: 必須。
  • TEST_OUTPUT_PATH: 出力先(通常は docs/)を一時的に別の場所に変更したい場合に使用します。

ffmpeg が必要です。GitHub Actions には標準搭載されています。

About

AI news podcast generator — daily episodes via GitHub Pages

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages