Video Podcast Maker Nano
個人用の7ステップパイプライン:リサーチ ∥ 素材 → スクリプト → TTS → 音声チェックポイント → 動画 → プレビューチェックポイント → 4Kレンダリング ∥ 公開キット。バンドルされたスクリプトも、ハードコードされたバックエンドも、テンプレートもありません。スキルはロジックを所有し、デフォルトで自律動作します。TTSバックエンドと動画ツールは動画ごとに選択されます(動画ごとのツール選択を参照)。
ツールの選択に関わらずこれを機能させる3つの不変条件:
- チェックポイントは決してスキップされないが、誰がチェックするかはポリシーで決まる。 3つのチェックポイントがあります:スクリプト(ステップ2後)、音声(ステップ3後)、プレビュー(レンダリング前)。デフォルトのチェッカーはエージェント自身(自己検証、チェックポイントごとに定義)。プロジェクトのAGENTS.md/CLAUDE.mdは任意のチェックポイントを人間のゲートにアップグレードできます — 監視ポリシーを参照。
- 音声がマスタークロックである。 最終動画の長さはナレーション音声と±0.5秒以内で一致する必要があります(両方を
ffprobeで確認)。ビジュアルは音声に合わせてカットされ、その逆はありません。 - スクリプトの変更は下流のすべてを無効化する。 スクリプトを編集 → スクリプトチェックポイントを再実行、その後TTS → 音声チェックポイント → ビジュアル → プレビューチェックポイント → レンダリング。タイミングを手動で修正してはいけません。
監視ポリシー
デフォルトモードは自律的:パイプラインは最初から最後まで実行され、エージェントがすべてのチェックポイントの自己検証を実行します。作業中のプロジェクトのAGENTS.md/CLAUDE.mdは、チェックポイントごとに1行でオーバーライドできます:
Checkpoint 1 (script): human— ユーザーがスクリプトを承認するまでステップ2後に停止。価値あり:後半でのスクリプト変更は全再実行のコストがかかります。Checkpoint 2 (audio): human— ユーザーがビジュアルの前に全音声を聞く。TTSの読み間違いを後で見つけるのがコスト高な場合に価値があります。Checkpoint 3 (preview): human— ユーザーがレンダリング前にドラフトをレビュー。スタイルに敏感なチャンネルに価値があります。
言及されていないチェックポイントはエージェント検証のままです。プロジェクトポリシーファイルはAGENTS.template.md(このSKILL.mdの隣)から始めます:それを動画プロジェクトのルートにAGENTS.mdとしてコピーし(Claude Code用にCLAUDE.mdのコピーも)、ツールバインディングを記入します。スキルはどこにもアップロードや公開を行いません — 公開キットはディスク上のファイルです。公開は常にこのパイプラインの外部で人間が行う行為です。
動画ごとのツール選択
TTSバックエンドと動画ツールは、ステップ3の前に1回だけ、以下の優先順位で決定します:
- プロジェクトバインディングが優先。 作業中のプロジェクトに記入済みの
AGENTS.md/CLAUDE.mdがある場合(監視ポリシー参照)、それがユーザーの恒久的な指定です — スキャンも再推測もせずにそれを使用します。ユーザーがセッション内でツールを指定した場合、それがファイルをオーバーライドします。ポリシーファイルがないか、まだテンプレートのプレースホルダー(/absolute/path/to/...)を含む場合、ルール2〜3を介してバインディングを解決し、解決した値をプロジェクトポリシーファイルに書き戻して、次回の実行がバインドされた状態で開始されるようにします。 - インストール済みスキルを自動検出。 セッションで利用可能なスキルをスキャンし、ジョブを実行できるものを探します — 動画:オーサリングツール(Remotion、HyperFrames、CapCutなど)をラップするスキル。TTS:TTSエンジンをラップするスキル。エンドツーエンドのパイプラインスキルは除外(例:他のvideo-podcast-makerのバリアントがインストールされている場合):これらはこのスキルと同様のパイプラインであり、バックエンドではありません — ここでそれらを呼び出すとワークフローがネストされ、チェックポイントが倍増します。1つ適合 → それを使用。複数適合 → プロジェクトの言語と出力ニーズに最も適したものを選びます。選択を
research.mdに記録し、最終サマリーで提示します。ツール確認を待ってブロックしてはいけません。 - 何も見つからない場合。 ユーザーが既に持っているプレーンなCLI(ffmpeg + 任意のTTS CLI)にフォールバックし、その旨を伝えます — 新しいツールを許可なくインストールしてはいけません。TTS CLIが字幕タイミングを出力できない場合、スクリプトを音声長全体に均等に分割してキューを導出し、チェックポイント2で近似であることをフラグします。ユーザー指定のツールがないか、最低能力を満たせない場合、その旨を伝え、即興ではなくルール2にフォールバックします。
最低能力(ルール1〜3に適用):TTSの選択はナレーション音声と字幕タイミングを生成できなければなりません。動画の選択はドラフト動画ファイル(チェックポイント3の検証用)と4Kをエクスポートできなければなりません。ライブプレビューはボーナスであり、ドラフトエクスポートの代用にはなりません。補助ジョブは選択不要:リサーチは組み込みのWeb検索を使用し、静止画/カバーは動画ツールの静止画エクスポートまたは任意の画像ツールを使用し、長さチェックはffprobeを使用します。ffmpeg/ffprobeがない場合は報告して停止 — ±0.5秒の不変条件は譲歩できず、実行を維持するためにスキップされません。
作業レイアウト
1つの動画のすべてのアーティファクトはvideos/{name}/({name} = 小文字英語、ハイフン区切り)に置かれます。音声/タイミングのファイル名は選択したバックエンドに適応します。重要なのはセットです:
videos/{name}/
├── research.md # ステップ1 — 事実とソース
├── podcast.txt # ステップ2 — ナレーションスクリプト
├── podcast_audio.wav # ステップ3 — ナレーション音声 (バックエンドごとに名前が変わる)
├── podcast_audio.srt # ステップ3 — 字幕タイミング (またはバックエンドの同等物)
├── assets/ # ステップ1 — 画像/BGM + sources.md (アセットごとにソース+ライセンス)
├── video-project/ # ステップ5 — 動画ツールが生成するもの
├── final_4k.mp4 # ステップ7 — 3840×2160 レンダリング
├── cover.png # ステップ7 — 動画カバー
└── publish_info.md # ステップ7 — タイトル / 説明 / タグ / チャプター
ワークフロー
エントリポイントチェック(ステップ1の前)。 プロジェクトルート(またはユーザーが指定したディレクトリ)にvideos/{name}/を探します。以前のセッションからのアーティファクトが既に含まれている場合、これは反復です — 影響を受ける最も早いステップから再開し(反復を参照)、ステップ1を再実行しないでください。アーティファクトが存在しない場合のみ、ステップ1から開始します。
ステップ1 — リサーチ ∥ 素材収集
1回の調査パスからの2つの並列出力(事実とアセットは同じソースから来ます):
リサーチ → research.md。トピックを調査します(Web検索、論文、ユーザーの指示)。research.mdに要約:事実、数字、およびそのソース。スクリプトが主張するすべての数字はここに遡れる必要があります — ソースのない正確な数字は捏造です。削除するか、出典を明記します。
素材 → assets/。ビジュアルとカバーが消費するすべてのものをvideos/{name}/assets/に収集します:セクションごとの画像/イラスト/スクリーンショット、ブランドロゴ、BGM。2つのソース、優先順位順:
- ユーザー提供 — ユーザーが渡すか指し示すファイル。
assets/にコピーし、元の場所を参照しないでください。 - 自動収集 — 最初に公式素材(製品バナー、仕様カード、スクリーンショット)、次にフリー/ライセンス済みセット(unDraw SVG、Pixabay/Pexels、OpenMoji / Microsoft Fluent Emoji / Google Noto Emoji、ブランドロゴ用
@lobehub/icons)。
各アセットのソースURL + ライセンスを収集時にassets/sources.mdに記録します(帰属が必要なセットは、ステップ7の動画説明でクレジットする必要があります)。セクションに適切なアセットが存在しない場合:スクリーンショットを偽造せず — そのセクションはテキストのみのレイアウト(または汎用フリーライセンスイラスト)にフォールバックし、決定をassets/sources.mdに記録して先に進みます。人間モードではユーザーに尋ねるのは任意です。不足しているアセットはステップ5の前ならいつでも追加できます。
ステップ2 — スクリプト → podcast.txt、その後 チェックポイント1
音声テキストのみ、マークダウンなし。スクリプトを[SECTION:xxx|表示ラベル]マーカー(小文字英語名、例:[SECTION:hero|intro])でセグメントに分割します — 動画セグメントごとに1セクション。このマーカー規則は、スクリプト、TTSチャンク、ビジュアルレイアウト間のポータブルな契約です。任意のTTS/動画ツールで消費できます。マーカーは構造メタデータ:決して発話されず、字幕テキストとして表示されません — TTSと字幕はマーカー間のテキストのみを消費します。
スタイルルール(言語非依存):スクリプトスタイル(言語非依存)を参照。
チェックポイント1 — スクリプト自己レビュー(必須)。 すべてのスクリプトスタイルルールに対してスクリプトを検証し、その後、セクションをassets/と照合します:一致するアセットがないセクションをリストアップし、上記のアセットなしルールに従って収集するかフォールバックし、何がアセットなしで進むかを記録します。人間モード(プロジェクトポリシー)では、代わりに停止し、スクリプトを引き渡します — ユーザーが明示的に承認するまでTTSを実行しないでください。音声、タイミング、ビジュアルの開始はすべてスクリプトから派生します。後半でのスクリプト変更は全再実行のコストがかかります。
ステップ3 — TTS
選択したTTSバックエンド(Azure、Edge、fish、minimaxなど — セッションで選ばれたもの)を実行します。生成物:
- ナレーション音声(WAV/MP3)
- 字幕タイミング(SRTまたは同等、キューテキスト = スクリプトそのまま)
合成前の発音衛生(任意のナレーション言語):機械的に導出できないブランド/用語の読み(Qwenは中国語のブランド名として読む、MoEは文字ごとに綴る)は、バックエンドのメカニズムに従ってエイリアス/音素リストに入れます — スクリプトテキストには決して入れないでください(字幕に漏れ出します)。
ステップ4 — 音声チェック — チェックポイント2
エージェント自己検証(自律モード):ffprobeで音声長をスクリプトからの大まかな推定値(言語ごとの話速を使用、サイレントファイルや切り詰められたファイルなどの重大なエラーのみをキャッチするため)と比較します。スクリプト内のすべてのブランド/用語トークンにエイリアス/音素エントリがあることを確認します(カバレッジチェック — 実際の発音はまさに人間モードのチェックポイント2のためです)。合成障害を示唆するサイレントまたはクリップされたセグメントをチェックします(silencedetect/volumedetect)。エイリアスリストのギャップを修正し、見つかった場合は再合成します。人間モードでは、ユーザーが代わりに全音声を聞きます。読み間違い → スクリプトではなくエイリアスリストを修正し、再合成、再チェックします。
ステップ5 — 動画を作成
選択したツール(Remotion、HyperFrames、CapCutなど)でビジュアルをナレーション音声に合わせてカットし、assets/を素材プールとして使用します。podcast.txtのセクションマーカーがレイアウトを駆動し、字幕キューがテキストの開始を駆動します。ドラフトファイルはvideos/{name}/に保持します。
ステップ6 — プレビューチェック — チェックポイント3
エージェント自己検証(自律モード):ドラフトエクスポートを検査します(シーク可能な動画ファイル — 最低能力が1つを保証)。セクションごとに1フレームを抽出し(ffmpeg -ss <mid-section-time> -i draft.mp4 -frames:v 1)、レイアウトのオーバーフロー、欠落した字幕、壊れたアセット参照がないか各フレームを表示します。ドラフト長がナレーション音声と±0.5秒以内であることを確認します。変更後は毎回修正して再検証します。人間モードでは、ユーザーが直接ドラフトをレビューします(ツールにライブプレビューがあればそれ、なければドラフトエクスポート)。明示的な確認("render")がある場合のみレンダリングし、変更のラウンドごとに新たな確認が必要です。
ステップ7 — 4Kレンダリング ∥ 公開キット
並行して実行します(レンダリングは長いブロッキングジョブであり、公開キットはそれに依存しません):
- レンダリング 3840×2160 →
final_4k.mp4。完了前に音声との長さの差が±0.5秒以内であることを確認します。 - 公開キット →
publish_info.md(タイトル / 説明 / タグ / チャプタータイムスタンプ — 各チャプターはそのセクションの最初のキューのSRT時刻から始まります)とcover.png(動画ツールの静止フレームから生成可能であればそれから、そうでなければ任意の画像ツール。assets/の素材を再利用してもよい)。publish_info.mdのアセットソースセクションはassets/sources.mdからコピーします。
スクリプトスタイル(言語非依存)
出典: フルスキルの
video-podcast-maker/references/natural-narration.md(AI風味を排除)+script-polish.md(深い編集)が正規のソースです。 これは言語非依存の要約です。編集ルールはまずそちらで行い、 ここにミラーします — ルールをフォークしてドリフトさせないでください。
ナレーション言語はユーザーのスクリプトの言語です — このパイプラインのデフォルトは中国語ですが、以下のルールは任意の言語の話し言葉のレジスタに適用されます。これらのルールはチェックポイント1で実施されます。各セクションを声に出して読んでみてください — つっかえたら、文を分割します。
- 日常的な話し言葉の散文、書き言葉の散文ではない。 文ごとに1つのアイデア、主語を最初に、ネストされた節なし、接続詞としての — や · なし。文の長さを変えます。軽い一人称でも構いません。
- 接続詞の置き換え。 硬い接続詞(さらに、しかしながら、したがって、要約すると)を日常的な同等のものに置き換えるか、削除します。列挙的な冒頭(第一に、第二に、最後に)を削除し、単に次のポイントに進みます。
- 禁止リスト。 決まりきったフィラーを削除:企業のバズワード、「注目に値する」、「誰もが知っている」、「革命的」、「ゲームチェンジャー」、「シームレス」、「様子を見よう」 — およびナレーション言語での同等のもの。
- 構造的な言い回し。 動詞-名詞の殻(「最適化を実行する」)→ 具体的なアクション+結果(「承認を3ステップから1ステップに削減する」)。「AではなくB」→ Bを述べる。3つの並列(「AとBとCの両方」)→ 最も情報量の多い項目だけを残す。2つは3つより良い。漠然とした強調語(「大幅に」)→ 数字または知覚可能な結果。漠然とした帰属(「専門家は言う」)→ 名前付きソース+日付、そうでなければ文を削除。スローガン的な結び(「未来は明るい」)→ 具体的な事実、数字、または次のアクションで終わる。
- 数字はアラビア数字(
86.1、1.5G、9B) — 字幕はスクリプトそのままなので、画面上に表示されるべきものを書きます。読み間違いを修正するために、TTSの話し言葉の形式をスクリプトに書かないでください。バックエンドのエイリアス/音素層を使用します。 - 数字は
research.mdに遡れる必要があります — ソースのない正確な数字は捏造です。削除するか、出典を明記します。
反復
- スクリプト変更 → チェックポイント1を再実行し(人間モードでは人間が)、その後ステップ3(TTS)からチェックポイント2と3を経てレンダリングまで。タイミングを手動で編集しないでください。
- 音声再合成(同じスクリプト、異なる声/速度) → チェックポイント2を再実行。タイミングが変わっていなければビジュアルはそのままにできます。レンダリング前にチェックポイント3を再実行します。
- ビジュアルのみ → 編集してチェックポイント3を再実行します。
- 同じ
videos/{name}/ディレクトリを再利用します。