ai-podcast について
inference.sh のワークフローで、キャラクター画像、音声、アバター動画を作成し、複数話者のポッドキャスト動画にまとめるスキルです。ポッドキャストやデモ、プロモーション用の会話動画を作る人向けに、人物の一貫性と制作時の確認方法も案内します。
主な機能
- 01キャラクター画像とアイデンティティプロファイルの生成
- 02各発話のテキスト読み上げ音声生成
- 03画像と音声からトーキングヘッド動画を生成
- 04クリップを最終動画に結合
- 05フレーム確認と台本作成のガイド
活用シーン
- 01複数話者のポッドキャスト動画を制作
- 02トーキングヘッドのデモ動画を作成
- 03プロモーション用の会話動画を制作
- 04実在人物のショット間の外見を統一
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ qu-skills/ superpowers --skill ai-podcastインストール後、Claude Code で/ai-podcastを入力して読み込まれたか確認します。
詳細
AI ポッドキャストジェネレーター
inference.sh パイプラインを使って、複数人が登場するトーキングヘッド形式のポッドキャスト動画を作成します。パイプラインは、ポートレート生成 → TTS 音声 → アバター動画 → 結合の順で処理します。Phota を使った実在の人物、3D マスコット、イラストキャラクター、またはそれらを組み合わせた出演者に対応しています。
ユーザーがポッドキャスト、トーキングヘッド動画、デモリール、プロモーション用の会話、または複数の話者が登場する動画コンテンツの作成を希望する場合に使用します。
パイプラインの概要
Characters (images) → TTS (audio per turn) → Avatar (video per turn) → Merge (final video)
プロセス
ステップ 1:キャラクターの作成
キャラクターの種類ごとに適切なツールを選択します。
| キャラクターの種類 | ツール | 備考 |
|---|---|---|
| 実在の人物(新規) | pruna/p-image | 16:9、prompt_upsampling: true。すぐに使えて、トレーニングも不要ですが、複数回生成したときに同一人物にはなりません。 |
| 実在の人物(一貫した ID) | [[profile_id]] を指定した phota/generate | すべてのショットで同一人物を維持できます。事前に Phota プロファイルのトレーニングが必要です(下記参照)。 |
| ブランドマスコット/ロゴキャラクター | google/gemini-3-pro-image-preview | ロゴとキャラクターシートを参照画像として渡します |
| イラスト/スタイライズ | google/gemini-3-pro-image-preview | スタイルの参照画像を入力画像として渡します |
Phota ID のトレーニング(人間の場合は任意ですが推奨):
複数のアングルやショットで同一人物を維持したい場合は、最初に Phota プロファイルをトレーニングします。
infsh app run phota/train --input '{
"images": ["url1.jpg", "url2.jpg", ...],
"wait": true
}' --save profile.json
- 対象者の顔画像が 30~50 枚必要です
wait: trueを指定すると、数分でトレーニングが完了しますprofile_idが返されます。これをphota/generateのプロンプトで[[profile_id]]として使用します- プロファイルは永久に再利用できます。一度トレーニングすれば、ショットを無制限に生成できます
ショット間の一貫性が不要な場合(例:話者が 1 人だけの動画、アングルが 1 つだけの場合)は、pruna/p-image のほうが簡単で低コストです。
ポッドキャストのフレームより先にキャラクターシートを作成:
- キャラクターごとに、キャラクターシート(無地の白背景、複数のアングル)を生成します
- 次に、シートを参照画像として使い、ポッドキャストスタジオの背景にキャラクターを配置します
ブランドキャラクター(衣服にロゴを配置)の場合:
- まず、無地の衣服を着たキャラクターを生成します
- ロゴを 2 枚目の参照画像として使い、
phota/editでロゴを追加します - 新しいアングルを生成する際は、必ずキャラクターの参照画像と一緒にロゴ画像も渡します
ステップ 2:別アングルの生成
見た目に変化をつけるため、キャラクターごとに少なくとも 2 つのアングルを生成します。
| アングル | 使用する場面 |
|---|---|
| 正面/ミディアム | 状況説明のショット、オープニング、クロージング |
| クローズアップ | リアクション、感情的な場面、印象的なセリフ |
クローズアップには、「tight framing, chest up, shallow depth of field」と指定します。「turned to the side」では、単に視線をそらしたように見えてしまいます。
人物の一貫性を保つルール:
- Phota プロファイルがある実在の人物には、新しいアングルの生成に
phota/generateまたはphota/editを使用します。Gemini は顔の同一性を維持できず、別人を生成します - Phota プロファイルがない実在の人物は、必要なすべてのアングルを
pruna/p-imageで一度に生成するようにします。多数のショットが必要な場合は、Phota プロファイルのトレーニングを検討してください - マスコットやイラストには Gemini 3 Pro を使用できます。確立したフレームを参照画像として渡します
**フレーミングのルール:**話者を個別に映す場合は、タイトなフレーミングを使います。複数の座席が映るワイドショットでは、画面に 1 人しかいないときに空席が目立ちます。
ステップ 3:フレームの品質確認
先に進む前に、すべてのフレームを目視で確認し、次の点をチェックします。
- 背景に余分な人物がいないこと
- マイクが複数ないこと(1 ショットにつきマイクは 1 本にします)
- ロゴが誤っていないこと、歪んでいないこと
- アングル間でキャラクターの一貫性が保たれていること
- 不自然なアーティファクトがないこと(余分な手足、融合した物体など)
動画を生成する前に問題を修正してください。動画の再レンダリングは、パイプラインの中で最もコストがかかる工程です。
ステップ 4:スクリプトを書く
自然な会話にするためのルール:
- 順番に広告文を読み上げているようではなく、実際の会話のように書きます
- 「ちょっと待って」「それはすごいね」といった反応や、会話への割り込み、追加の質問を入れます
- 発言の長さに変化をつけます。短い反応(1文)と長めの説明(2〜3文)を混ぜます
- ホストは、あからさまな話題の振り方ではなく、本当の質問をします
- 目標とする全体の長さを意識します。1.05倍速で自然に話す場合、約2.5語/秒です
長さの目安:
| 目標 | 語数 |
|---|---|
| 15秒 | 約38語 |
| 30秒 | 約75語 |
| 60秒 | 約150語 |
ステップ 5:TTS 音声を生成する
各発言に inworld/text-to-speech-2 を使用します。
infsh app run inworld/text-to-speech-2 --input '{
"text": "...",
"voice_id": "...",
"speaking_rate": 1.05,
"audio_encoding": "MP3"
}' --save output.json
音声の選択:
- 候補の音声を決める前に、同じセリフでサンプルを生成します
- ユーザーに試聴してもらい、音声を承認してもらいます
- ポッドキャストに適した音声:Tyler、Nate、Lauren、Kelsey、Naomi、Anjali(EN_US)
- 利用可能なすべての音声を一覧表示するには
inworld/text-to-speech-2:voicesを使用します
話速:
- 自然なポッドキャストのテンポにするには、デフォルトで 1.05 を使用します
- 短く歯切れのよい反応には 1.1 を使用します
- 1.0 未満には絶対にしないでください。遅く、聞き手の関心を損なう話し方になります
- 各登場人物の発言では、話速を一定に保ちます
すべての TTS 発言は並列で実行できます(安価で高速、1件あたり約2〜8秒)。
ステップ 6:動画クリップを生成する
各発言に pruna/p-video-avatar を使用します。
infsh app run pruna/p-video-avatar --input '{
"image": "<character_frame_url>",
"audio": "<tts_audio_url>",
"resolution": "720p",
"video_prompt": "..."
}' --save output.json
重要:クリップは並列ではなく、順番に実行してください。 並列で実行すると同じ GPU を使うため、CUDA OOM エラーが発生します。各クリップの所要時間は、音声の長さに応じて15〜90秒です。
アングルの割り当て方針: 見た目に変化をつけるため、各発言で正面ショットとクローズアップショットを交互に使います。6つの発言の場合の例:
T1: Speaker A — front
T2: Speaker B — front
T3: Speaker C — front (or close-up)
T4: Speaker A — close-up
T5: Speaker B — close-up
T6: Speaker A — front
ステップ 7:結合する
infsh/media-merger を使用して、すべてのクリップをつなぎ、最終動画を作成します。
# Build input JSON
{
"media_files": [
{"file": "<clip1_url>"},
{"file": "<clip2_url>"},
...
],
"fps": 24,
"output_format": "mp4"
}
infsh app run infsh/media-merger --input merger_input.json --save final.json
結合ツールは無料で、全体の長さに応じて2〜6分かかります。
ルール
-
Gemini は人間の顔の同一性を保持しません — Gemini で実在する人間の別アングルを生成すると、別人になります。同一人物の人間ショットを生成するには、学習済みの profile_id を設定した Phota を使うか、すべてのアングルを1回のバッチで生成します。これは、正面ショットと一致させるはずのクローズアップで、Gemini がまったく別の顔を生成したことで分かりました。
-
p-video-avatar のクリップを並列で実行してはいけません — GPU メモリを取り合い、CUDA OOM エラーが発生します。順番に実行してください。並列実行した3件のうち2件が失敗したことで分かりました。
-
speaking_rate を1.0未満に設定してはいけません — 不自然で、聞き手の関心を損なう話し方になります。デフォルトは1.05にしてください。0.9の話速は「違和感があり、聞いていて興味が失せる」というユーザーのフィードバックから分かりました。
-
動画を生成する前に、必ずフレームを QA してください — 動画生成はパイプラインで最もコストがかかる工程です。画像の段階でマイクが二重になっていたり、ロゴが間違っていたりすることに気付けば、簡単に修正できます。動画生成後に気付いた場合は、クリップ全体を再レンダリングする必要があります。
-
個々の話者ショットでは、必ずタイトなフレーミングを使ってください — ワイドショットや状況説明のショットでは、ほかの話者が座っているはずの席が空席として映ります。空席が見えないように、腰から上、または胸から上をフレームに収めます。
-
ブランドキャラクターを生成するときは、必ずロゴを参照画像として渡してください — ロゴをテキストで説明すると、正しく生成されません。実際のロゴファイルを2枚目の画像入力として渡してください。
-
本番制作の前に、必ず音声の承認を得てください — 同じセリフで5〜8種類の候補音声のサンプルを生成し、本番に進む前にユーザーに選んでもらいます。
-
スクリプトは広告ではなく、会話のように聞こえる必要があります — 順番に広告文を読み上げるような話し方は不自然です。反応、割り込み、発言の長さの変化、率直な質問を入れます。ホストには個性を持たせ、話題を振るだけの役割にしないでください。
アプリのリファレンス
| アプリ | 目的 |
|---|---|
pruna/p-image | テキストからポートレートを生成する |
phota/train | 30〜50 枚の顔画像からアイデンティティプロファイルをトレーニングする |
phota/generate | トレーニング済みのアイデンティティを使って画像を生成する([[profile_id]] 経由) |
phota/edit | 既知の人物のアイデンティティを保ちながら画像を編集する |
google/gemini-3-pro-image-preview | 画像の生成・編集、マスコット、スタイル変換 |
inworld/text-to-speech-2 | テキスト読み上げ、100 以上の言語、音声の調整 |
pruna/p-video-avatar | ポートレート + 音声 → トーキングヘッド動画 |
infsh/media-merger | 動画クリップを 1 つの動画に連結する |
belt task cost <task-id> を使用すると、個々のタスクのコストを確認できます。