podcast-pipeline について
podcast-pipelineは、ポッドキャストの文字起こしを各プラットフォーム向けコンテンツと公開カレンダーに変換するスキルです。RSSのエピソードとローカルの文字起こしに対応し、採点と重複排除も行います。
主な機能
- 01RSSエピソードや文字起こしの取り込み
- 02ストーリーや引用などの要素抽出
- 03各プラットフォーム向け草稿の生成
- 04コンテンツの採点と重複排除
- 05週次公開カレンダーの作成
活用シーン
- 01新しいポッドキャストを複数媒体向けに再利用
- 02複数のRSSエピソードを一括処理
- 03文字起こしから公開カレンダーを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ericosiu/ ai-marketing-skills --skill podcast-pipelineインストール後、Claude Code で/podcast-pipelineを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.env.examplepodcast_pipeline.pyREADME.mdrequirements.txt詳細
前書き(スキル開始時に実行)
# Version check (silent if up to date)
python3 telemetry/version_check.py 2>/dev/null || true
# Telemetry opt-in (first run only, then remembers your choice)
python3 telemetry/telemetry_init.py 2>/dev/null || true
プライバシー: このスキルは使用状況をローカルの
~/.ai-marketing-skills/analytics/に記録します。リモートテレメトリーはオプトインのみです。コード、ファイルパス、リポジトリの内容が収集されることは一切ありません。詳細はtelemetry/README.mdをご覧ください。
Podcast-to-Everything パイプライン
ポッドキャストのエピソードを、あらゆるプラットフォーム向けの完全なコンテンツカレンダーに変換します。 1 本のエピソードから、15〜20 個のコンテンツが生成されます — スコアリング、重複排除、スケジュール設定済みです。
ステップ 1: 取り込み — トランスクリプトを取得する
入力ソースを判定し、クリーンなトランスクリプトを取得します。
オプション A: RSS フィード(--rss <url>)
- RSS フィードの XML を取得する
- 最新エピソードの音声 URL を抽出する(バッチ処理には
--episodes Nを使用) - 音声ファイルをダウンロードする
- OpenAI Whisper API で文字起こしする(タイムスタンプ付き)
- トランスクリプトをエピソードのメタデータ(タイトル、日付、説明、長さ)とともに保存する
オプション B: 生のトランスクリプト(--transcript <file>)
- トランスクリプトファイルを読み込む(プレーンテキスト、SRT、または VTT)
- タイムスタンプがあれば解析する
- ファイル名からエピソードのメタデータを抽出するか、ユーザーに確認する
オプション C: バッチモード(--batch <rss_url> --episodes N)
- RSS フィードを取得する
- 直近 N 件のエピソードを抽出する
- それぞれを完全なパイプラインで処理する
- バッチ内のすべてのエピソードにわたって重複を排除する
トランスクリプトのクリーンアップ
- 書き言葉向けのコンテンツでは、フィラーワード(um、uh、like、you know)を削除する
- 動画クリップの提案のために、タイムスタンプ付きの原本を保持する
- トピックの切り替わりごとに論理的なセグメントへ分割する
ステップ 2: 編集ブレイン — 深い分析
完全なトランスクリプトを、次の抽出フレームワークとともに LLM に投入します:
以下のコンテンツアトムを抽出します:
-
ナラティブアーク — セットアップ → 緊張 → 解決を備えた完全なストーリーセグメント。 開始/終了のタイムスタンプでタグ付けします。
-
引用可能な瞬間 — 印象的でシェアしやすい発言。単独で成立する一言。 「誰かがこれをスクリーンショットするだろうか?」というテストを通過する必要があります。
-
論争を呼ぶ見解 — 一般通念に反する意見。 人々に「全然賛成できない」や「やっと誰かが言ってくれた」と言わせるようなもの。
-
データポイント — 具体的な数値、パーセンテージ、金額、期間。 信頼性を高める具体的な裏付け。
-
ストーリー — 個人的な逸話、ケーススタディ、クライアント事例。 人物、問題、結果が揃っている必要があります。
-
フレームワーク — ステップバイステップのプロセス、メンタルモデル、意思決定マトリクス。 人々が保存やブックマークをしたくなるような構造化されたものすべて。
-
予測 — トレンド、市場、テクノロジーに関する未来的な主張。 物事がどこへ向かうかについてのホットな見解。
アトムごとの出力形式:
- Type: [narrative_arc | quote | controversial_take | data_point | story | framework | prediction]
- Content: [extracted text]
- Timestamp: [start - end, if available]
- Context: [what was being discussed]
- Viral Score: [0-100, see Step 4]
- Suggested platforms: [where this atom works best]
ステップ 3: コンテンツ生成 — 1 本のエピソードから多数のピースへ
各エピソードについて、抽出したアトムから以下をすべて生成します:
3a. ショートフォーム動画クリップ(1 エピソードあたり 3〜5 本)
- Hook: [First 3 seconds — pattern interrupt or bold claim]
- Clip segment: [Timestamp range from transcript]
- Caption overlay: [Text for the screen]
- Platform: [YouTube Shorts / TikTok / Instagram Reels]
- Why it works: [What makes this clippable]
優先順位: 論争を呼ぶ見解 > オチのあるストーリー > 意外なデータポイント
3b. Twitter/X スレッド(1 エピソードあたり 2〜3 本)
- Thread hook (tweet 1): [Curiosity gap or bold opener]
- Thread body (5-10 tweets): [Each tweet is one complete thought]
- Thread closer: [CTA — follow, reply, retweet trigger]
- Source atoms: [Which content atoms feed this thread]
ルール: 280 文字を超えるツイートは禁止。各ツイートは単独で成立すること。データポイントを裏付けとして使うこと。
3c. LinkedIn 記事のドラフト(1 エピソードあたり 1 本)
- Headline: [Specific, benefit-driven]
- Hook paragraph: [Before the "see more" fold — must earn the click]
- Body: [3-5 sections with headers, 800-1200 words]
- CTA: [Engagement driver — question, not link]
- Hashtags: [3-5 relevant, not spammy]
トーン: プロフェッショナルだが企業的ではない。一人称。ストーリー主導。
3d. ニュースレターセクション(1 エピソードあたり 1 本)
- Section headline: [Scannable, specific]
- TL;DR: [One sentence, the core insight]
- Body: [3-5 bullet points, each with a takeaway]
- Pull quote: [The most shareable line from the episode]
- Link: [Back to full episode]
3e. 引用カード(1 エピソードあたり 3〜5 枚)
- Quote text: [Max 20 words — must work as text overlay]
- Attribution: [Speaker name]
- Background suggestion: [Color/mood that matches the tone]
- Platform sizing: [1080x1080 for IG, 1200x675 for Twitter, 1080x1920 for Stories]
3f. ブログ記事のアウトライン(1 エピソードあたり 1 本)
- Title: [SEO-optimized, includes primary keyword]
- Primary keyword: [Search volume + difficulty estimate]
- Secondary keywords: [3-5 related terms]
- Meta description: [155 chars max]
- H2 sections: [5-7, each maps to a content atom]
- Internal linking opportunities: [Topics that connect to existing content]
- Estimated word count: [1500-2500]
3g. YouTube Shorts / TikTok スクリプト(1 エピソードあたり 1 本)
- HOOK (0-3s): [Pattern interrupt — question, bold claim, or visual]
- SETUP (3-15s): [Context — why should they care]
- PAYOFF (15-45s): [The insight, data, or story resolution]
- CTA (45-60s): [Follow, comment prompt, or part 2 tease]
- On-screen text: [Key phrases to overlay]
- B-roll suggestions: [Visual ideas if not talking-head]
ステップ 4: コンテンツスコアリング — バイラルポテンシャル
生成されたすべてのピースを 3 つの次元でスコアリングします(それぞれ 0〜100):
| 次元 | 測定対象 | シグナル |
|---|---|---|
| 新規性 | これは新しい、または意外か? | 逆張りの見解、予想外のデータ、初めて言及されたもの |
| 論争性 | 人々はこれについて議論するか? | 強い意見、規範への挑戦、立場の明示 |
| 有用性 | 誰かがこれをすぐに使えるか? | フレームワーク、ハウツー、テンプレート、具体的な数値 |
バイラルスコア = (新規性 × 0.4) + (論争性 × 0.3) + (有用性 × 0.3)
スコアのしきい値:
- 80以上 → 優先的に公開します。エンゲージメントがピークとなる時間帯にスケジュールします。
- 60~79 → 良質なコンテンツです。カレンダーを埋めるために使います。
- 40~59 → 穴埋め用です。カレンダーに空きがある場合のみ使います。
- 40未満 → 削除します。公開枠を使う価値はありません。
ステップ 5:重複排除エンジン
最終確定の前に、生成したすべてのコンテンツを次の項目と照合します。
- 今回のバッチ — 同じ切り口を扱うコンテンツが重複しないようにします
- 最近の履歴 — 直近 N 日間の出力と比較します(デフォルト:30 日)
- 類似度のしきい値 — 意味的な重複が 70%を超える組み合わせにフラグを付けます
重複排除のルール:
- 2 つのコンテンツの重複が 70%を超える場合:スコアの高い方を残し、もう一方を削除します
- コンテンツが最近公開された内容と重複する場合:⚠️ を付け、差別化する切り口を提案します
- 公開したすべてのコンテンツのハッシュを
output/content_history.jsonに記録します
ステップ 6:カレンダーの生成(--calendar)
スコア付けと重複排除が完了したコンテンツを、週次の公開カレンダーにまとめます。
スケジュールのルール:
- Twitter/X: 1 日 1~2 件、ピーク時間帯(東部時間の午前 8~10 時、午後 12~1 時、午後 5~7 時)
- LinkedIn: 1 日あたり最大 1 件、火曜日から木曜日の午前中
- YouTube Shorts/TikTok: 1 日 1 件、夕方
- ニュースレター: 毎週同じ曜日
- ブログ: 週 1~2 件
- 引用カード: コンテンツが少ない日に挿入します
カレンダーの出力形式:
{
"week_of": "2024-01-15",
"episode_source": "Episode Title - Guest Name",
"content_pieces": [
{
"date": "2024-01-15",
"time": "09:00 ET",
"platform": "twitter",
"type": "thread",
"content": "...",
"viral_score": 85,
"status": "draft"
}
],
"total_pieces": 18,
"avg_viral_score": 72,
"coverage": {
"twitter": 6,
"linkedin": 3,
"youtube_shorts": 3,
"newsletter": 1,
"blog": 1,
"quote_cards": 4
}
}
ステップ 7:出力
すべての出力は output/ ディレクトリに保存されます。
output/
├── episodes/
│ ├── YYYY-MM-DD-episode-slug/
│ │ ├── transcript.txt
│ │ ├── atoms.json # Extracted content atoms
│ │ ├── content_pieces.json # All generated content
│ │ └── calendar.json # Scheduled calendar
│ └── ...
├── calendar/
│ └── week-YYYY-WNN.json # Aggregated weekly calendar
├── content_history.json # Dedup tracking
└── pipeline_log.json # Run history and stats
CLI リファレンス
# Process latest episode from RSS feed
python podcast_pipeline.py --rss "https://feeds.example.com/podcast.xml"
# Process a local transcript
python podcast_pipeline.py --transcript episode-42.txt
# Batch process last 5 episodes
python podcast_pipeline.py --batch "https://feeds.example.com/podcast.xml" --episodes 5
# Generate weekly calendar from existing outputs
python podcast_pipeline.py --calendar
# Process with custom dedup window
python podcast_pipeline.py --rss "https://feeds.example.com/podcast.xml" --dedup-days 60
# Process and only keep 80+ viral score content
python podcast_pipeline.py --rss "https://feeds.example.com/podcast.xml" --min-score 80
環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
OPENAI_API_KEY | はい(Whisper 用) | 音声文字起こし用の OpenAI API キー |
ANTHROPIC_API_KEY | はい(生成用) | コンテンツ生成用の Anthropic API キー |
OPENAI_LLM_KEY | 任意 | 代わりに GPT で生成する場合に使用する別の OpenAI キー |
参照ファイル
| ファイル | 用途 |
|---|---|
podcast_pipeline.py | メインのパイプラインスクリプト |
requirements.txt | Python の依存関係 |
README.md | セットアップと使用方法のガイド |