Communitygithub.com

video-flow:コードレンダリングによる汎用解説動画ワークフロー

PDFやPPT、ドキュメント、ウェブページ、動画、トピックなど任意の内容から、コードでレンダリングされた解説動画を生成します。教育構造の設計、ストーリーボードとナレーションの作成、Canvas/HTMLによる`render(t)`関数でのフレーム描画、ヘッドレスChromeでのフレームキャプチャ、FFmpegエンコード、オプションのTTSナレーション・BGM合成・ソフト字幕・品質レポートを提供します。

video-flow:コードレンダリングによる汎用解説動画ワークフロー とは?

video-flowは、AIエージェント(Claude Code、Cursor、Codexなど)が、任意のコンテンツからコードベースの解説動画を完全に自動生成するための包括的なワークフローです。PDF、PPT、ドキュメント、ウェブページ、動画、または単なるトピックを入力として、8段階のパイプライン(教育構造設計、スタイル選択、ストーリーボード作成、ナレーション生成、シーン実装、レンダリング、音声合成、QA・エンコード)を通じて、ピクセル単位で制御可能な動画を生成します。各フレームは`window.render(t)`という純粋関数によって一意に決定され、再現性と編集の容易さを保証します。縦横比(16:9、9:16、1:1、4:5)や5つのビジュアルスタイル(シリコン、ペーパー、ブループリント、ネオン、スイス)をサポートし、カスタムレンズやブランディングにも対応します。主に教育、製品紹介、チュートリアル、エクスプレーナー動画の作成に特化しており、テキストの正確性、データの忠実性、複数バージョンの効率的な生成が求められるシナリオで特に有効です。SoraやVeoなどのビデオ生成モデルとは異なり、コードで厳密に制御された出力を提供します。

対応~Claude Code~Codex CLI~Cursor
npx skills add lian4211/video-flow

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

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

ドキュメント

video-flow:コードレンダリングによる汎用解説動画ワークフロー は何をしますか?

一言で言えば:「何を教えるのか」を明確にし、それを計算可能なタイムラインに変換し、最終的にブラウザで1フレームずつ描画します。 完成品 = Canvas/HTML の render(t) + ヘッドレスChromeによるフレームキャプチャ + FFmpeg + オプションのTTS/BGM/字幕。

このSkillは、1本の動画を8つのチェック可能なフェーズに分割します。各フェーズには成果物と検収ポイントがあり、いずれかのステップで不合格となった場合は、次のステップに進まないでください。


0. いつ使用するか / 使用しないか

使用するケース:

  • PDF、PPT、DOCX、記事、ウェブページ、動画、またはトピックから、1~5分の解説動画を作成する場合。
  • 「テキストが明確で、データが正確で、1フレームを修正でき、再現可能な」動画が必要な場合(コードレンダリングによる構造的な優位性を活用)。
  • 縦型/正方形/横型のマルチバージョン、または多言語バージョンが必要な場合。
  • ナレーション、字幕、BGMが必要で、かつワークフロー全体が反復可能であることが望ましい場合。

使用しないケース:

  • 実写/リアルな映像が必要な場合 → ビデオ生成モデルまたは実写を使用。このSkillは「コードレイヤー」のみを担当します。
  • 既存の素材を編集するだけの場合 → 編集ツールまたはAgentを使用。
  • ストーリーボードや脚本を決めずにMP4を生成したいだけの場合 → テンプレート的な動画になる可能性が高いため、ステップ1~2を先に行うことを推奨します。

1. 厳格なルール(違反した場合はやり直し)

  1. 画面は時間の純粋関数である: ページは window.render(t) を公開する必要があります。与えられた t に対して、画面は一意に決定されなければなりません。
    • Date.now()、シードのない乱数、requestAnimationFrame による状態駆動、CSS transition/animation、フレーム間キャッシュは禁止。
    • 累積型アニメーション(パーティクル、水面など)は、固定ステップで0からtまで計算するか、解析式に変更すること。
  2. タイムラインが唯一の情報源である: ストーリーボード、ナレーション、BGM、効果音、字幕はすべて同一の timeline.json から派生すること。
  3. ストーリーボードの後にコードを書く: storyboard.md と script.json がない状態でシーンコードを書いてはいけません。
  4. 原文の事実を捏造しない: 数字、年号、人名、数式はソースマテリアルから取得すること。不明な点は [要確認] とマークし、納品時に別途リストアップすること。
  5. デフォルトではブランドや透かしを入れない: ユーザーからロゴやブランド名が提供された場合を除き、デフォルトのフッターにはコース/トピック情報のみを記載すること。
  6. エンコードは1回のみ: オーディオはWAV段階でミキシングとラウドネス処理を完了し、最終的にAACエンコードを1回だけ行うこと。トランスコードの繰り返しは避けること。
  7. 納品前にQAを通過すること: フレーム欠落、黒フレーム、ラウドネス、再生時間、字幕、音声と映像の同期を確認(ステップ8参照)。

2. 入力と成果物

入力(任意、組み合わせ可能)

種類処理方法
PDFscripts/ingest.py でテキスト抽出;スキャン文書や文字化けの場合は自動的にPNGにラスタライズし、モデルに「ページを見せる」
PPTXページごとにタイトル、本文、ノートを抽出;必要に応じてキーページを画像としてエクスポート
DOCX / Markdown / TXT直接 source/source.md に抽出
ウェブページURL本文を取得;ソースリンクを保持
動画ffprobe メタデータと定点フレーム抽出;ASRがない場合は人間が内容を補足
トピックのみユーザーが指定した一言/アウトライン;最初にユーザーに「必須の事実」を確認させる

各プロジェクトのディレクトリ構造

<project>/
  project.json          # メタ情報:タイトル/対象者/目標/アスペクト比/スタイル/声/音楽/ブランド
  source/               # ソースマテリアル(source.md、pages/*.png、meta.json)
  storyboard.md         # ストーリーボード:各シーンの内容、映像、時間、ナレーション、ポイント
  script.json           # 機械可読:scenes[](type/script/visual/vo/duration)
  build/                # index.html + lib.js + theme.js + scenes.js + timeline.js
  audio/                # vo/*.wav、bgm、mix.wav
  frames/               # フレームごとのJPEG
  out/                  # final.mp4 / final.srt / poster.png
  qa/                   # report.md + contact sheets + フレームサンプル

scripts/init_project.py を使用して一度にスケルトンを生成します。


3. ワークフロー(8ステップ)

ステップ0:環境チェック

python scripts/check_env.py

必須:Python 3.10+、FFmpeg/ffprobe、Chromiumベースのブラウザ、numpy/scipy。 推奨:edge-tts(オンライン音声合成)、pypdf、python-pptx、python-docx、Pillow。 不足しているものは出力に従ってインストール。インストールできない場合は、機能を縮退(ナレーションなし / システム音声 / 手動音声ファイル)。

ステップ1:ソースマテリアルを読み、「教育構造」を抽出する

まず以下の5つの質問に答える(project.json の brief に記述):

  1. 対象者は誰か?彼らはすでに何を知っているか?
  2. 視聴後に言える/できるようになることは何か?(1~3の検証可能な目標)
  3. 最も誤解されやすい/難しいポイントは何か?
  4. 必ず登場させるべき事実/数式/データは何か?それぞれのソースは何か?
  5. 再生時間とアスペクト比は?プラットフォームは(教室/スマートフォン/ソーシャルメディア)?

元のページ順にそのまま説明しないこと。 references/storytelling.md の4つの構造のいずれかを使用して再構成する:

  • 因果連鎖(理系・工学系におすすめ);
  • 問題→解決策→検証;
  • 誤解→修正→応用;
  • タイムライン/プロセス。

ステップ2:スタイルとアスペクト比を決定する

references/styles.md から1つ選択(silicon / paper / blueprint / neon / swiss)、references/formats.md に従ってアスペクト比を決定。 ルール:

  • 内容が「チップ/エンジニアリング/データ」寄り → silicon / blueprint;
  • 「人文/生物学/歴史」寄り → paper;
  • 「発表/マーケティング/若者向け」寄り → neon / swiss;
  • 1画面で1つのことだけを説明する;縦型の場合は必ずレイアウトを再構築し、横型を単に切り取らない。

ステップ3:ストーリーボードと脚本を書く

storyboard.md(人間用)と script.json(機械用)を出力。各シーンには以下を必ず記述:

  • type(title/concept/process/compare/formula/bars/quote/recap/custom)
  • kicker(サブタイトル)、headline(一言で結論)、points(≤3項目)
  • vo(ナレーション、1~2文;ナレーションがない場合は空欄)
  • visual(図/表/フロー/数式の具体的なデータ)
  • duration(空欄可、ナレーション時間から自動決定)

脚本作成の5つの厳格な制約:

  1. 画面のテキスト ≠ ナレーション原稿:画面にはキーワードと結論のみを残し、ナレーションで説明する。
  2. 1画面につき最大1つの結論+3つの補足ポイント;タイトルは18文字以内、本文は各行22文字以内。
  3. 2~4秒ごとに変化(要素/カメラ/強調)を入れるが、パーティクル爆発のような過剰な効果は避ける。
  4. 最初に「禁止リスト」を書く:グラデーション背景+中央の大きなテキスト、すべての要素のフェードイン、画面いっぱいの小さなテキスト、無意味なグロー効果。
  5. 事実文には個別にソースを明記;不明な点は [要確認] を追加。

ステップ4:ナレーションとタイムラインを生成する

# オプション:ナレーションがない場合はスキップし、各シーンに明示的に duration を記述
python scripts/tts.py --project . --voice zh-CN-XiaoxiaoNeural --rate +3%
python scripts/timeline.py --project .
  • tts.py は audio/vo/<id>.wav(48 kHz)を出力し、軽度のEQ/圧縮を自動適用;--from-dir で人間の録音を使用可能。
  • timeline.py は実際のナレーション時間を使用して build/timeline.js と timeline.json を生成: scene.duration = head + voDuration + tail、ナレーションのないシーンは明示的な duration を使用。
  • 以降は script.json のみを編集し、これらの2つのステップを再実行すること。タイムラインを手動で編集しないこと。

ステップ5:ページを構築し、シーンを実装する

テンプレートを使用:

python scripts/init_project.py --dir my-video --title "..." --format 16:9 --style silicon
# build/content は timeline.py が生成するように編集;汎用レンズはすでに実装済みなので、script.json を直接編集
  • 汎用レンズ(8種類)は build/scenes.js にあり、CONTENT を読み込んでレンダリング;ほとんどの解説動画で十分。
  • 専門的な図(チップ/回路/解剖図/地図/分子など)が必要な場合は、build/custom.js を作成:
    window.CUSTOM['s3'] = function(u, D, sc, ctx){ /* lib.js のヘルパーを使用して描画 */ };
    
    script.json で該当シーンの type を custom に設定。
  • 一度に1つのシーンだけを実装:最初に3つの静止フレームをレンダリング(scripts/render.py --still 1.2,2.4,3.6)、テキストのはみ出し/重なり/主体のサイズを確認してから続行。

ステップ6:レンダリング

python scripts/render.py --project . --fps 30
# 特定のセグメントのみレンダリング:--start 8 --duration 4
# 既存のChromeを再利用:--cdp http://127.0.0.1:9333
# スクリプトにChromeを起動させる:--launch-chrome

出力は frames/f00000.jpg...;途中再開可能(既存のフレームで2KB以上のものはスキップ)。

ヘッドレスChromeとサンドボックス:実行環境がChromeのIPC/パイプを禁止している場合は、許可された環境で実行するか、--cdp を使用して起動済みのChromeに接続すること。

ステップ7:BGM、効果音、ミキシング、字幕

python scripts/audio.py --project .            # BGM合成 + ナレーション配置 + ダッキング + マスタリング
python scripts/srt.py --project .              # out/final.srt を生成
  • ナレーションなしの場合:audio.py --no-bgm またはユーザー提供の音楽のみを使用。
  • ユーザーが音楽を提供する場合:audio/music.* に配置。audio.py が自動的にループ/トリミングおよびダッキングを行う。
  • 目標ラウドネスはデフォルトで −14.2 LUFS、トゥルーピーク ≤ −1.5 dBFS;オーディオのエンコードは1回のみ。

ステップ8:エンコード + QA + 納品

python scripts/encode.py --project .           # frames+mix+srt → out/final.mp4
python scripts/qa.py --project .               # qa/report.md + フレームサンプル画像

QAはすべてパスする必要があります(references/qa.md 参照):

  • 再生時間/アスペクト比/フレームレート/オーディオトラック/字幕ストリームが正しいこと;
  • 0.25秒以上の黒フレームがないこと;フレームサンプルに空白、テキスト重複、はみ出しがないこと;
  • ラウドネスが目標値±1 LU以内、トゥルーピーク ≤ −1.5 dBFSであること;
  • 最初のフレームが完全な黒でないこと;最後のシーンにまとまりがあること;
  • 事実リストがソースマテリアルと一致していること;[要確認] が別途リストアップされていること。

納品物:out/final.mp4、out/final.srt、poster.png、storyboard.md、script.json、qa/report.md、レンダリング所要時間と既知の不足点。


4. 汎用レンズタイプ(テンプレートで実装済み)

type用途キーフィールド
titleオープニング/チャプターtitle/subtitle/kicker
concept1つの概念+3つのポイントheadline/points/visual
processフロー/ステップ(3~5ステップ)steps[]
compare二者比較left/right
formula数式+説明formula/notes[]
barsデータ比較items[{label,value}]
quote名言/結論quote/author
recapまとめマップnodes[]/takeaway
custom専門図自分で custom.js を記述

新しいタイプが必要な場合:scenes.js に window.SCENES_IMPL['type'] を追加し、references/pipeline.md にデータ契約を記録。


5. アスペクト比とセーフゾーン

アスペクト比サイズセーフゾーンタイトルフォントサイズ本文フォントサイズ
16:91920×1080左右 96 / 上下 6472–12028–40
9:161080×1920左右 64 / 上下 16064–9632–44
1:11080×1080四方 7256–8828–40
4:51080×1350四方 8060–9230–42

縦型の場合はレイアウトを再構築:タイトルを上に、図を中央に、結論を下に;横方向に圧縮しないこと。テンプレートは layout() を使用してアスペクト比に応じて切り替え。references/formats.md を参照。


6. よくある失敗と修正方法

現象根本原因修正方法
黒画面/白画面JSエラー、render 未定義、canvasサイズ0render.py --still でコンソールを確認;明示的にcanvasの幅と高さを設定
フォントが違う/最初のフレームでフォールバックフォントフォントがロードされていないdocument.fonts.ready を待ってから READY=true を設定;CJKはシステムのフォールバック文字列を使用
同じ t で2回異なる結果/パラレルフラッシュrAF/タイマー/乱数/フレーム間状態を使用純粋関数に変更;hash(seed);クローズドフォームのスプリング
テキスト重複/はみ出しシーンごとに静止フレームをチェックしていない各シーン3枚の静止フレーム+縦型は360px幅でフレームサンプリング
音声と映像の同期ずれオーディオが0から始まる vs ビデオがstartから;TTSが文ごとに個別同一のタイムライン;TTSは一括;-ss を -i の前に配置
ラウドネスが不規則に変動複数回のloudnorm/トランスコードWAV段階で静的ゲインのみ;AACは1回のみ
レンダリングが遅すぎる4K/サブフレーム/ブラシ/WebGL最初は960×540の小規模サンプル;サブフレームは高速動作のみ;パラレルワーカー
Chromeが起動しないサンドボックスがIPC/パイプを制限許可された環境で実行するか、--cdp で起動済みのChromeに接続

7. 拡張ポイント

  • 新しいスタイル:templates/styles/*.json をコピーし、カラーパレット/フォント/背景タイプを変更;styles.md にエントリを追加。
  • 新しいレンズ:build/scenes.js に登録;または build/custom.js で専門図を記述。
  • 人間のナレーション:録音を <scene-id>.wav として audio/vo_human/ に配置;tts.py --from-dir でリサンプリングと軽度処理のみを実行。
  • 多言語:script.<lang>.json と対応するTTS音声;タイムラインは同じ画面を再利用可能(テキスト長の違いに注意)。
  • マルチアスペクト比:同じ script.json を使用し、異なる project.format で init/render を再実行;レイアウトは layout() で適応。
  • ブランディング:project.json.brand でロゴテキスト/色/フッターを提供;デフォルトではオフ。

8. 参考ドキュメント

  • references/pipeline.md:完全な技術パイプライン、render(t) 契約、CDPレンダリング、FFmpegパラメータ、タイムラインデータモデル。
  • references/inputs.md:PDF/PPT/DOCX/URL/動画の抽出とOCRフォールバック。
  • references/storytelling.md:4つの教育構造、テンポテーブル、脚本ルール。
  • references/styles.md:5つのスタイルのカラーパレット/フォント/アニメーション/適用トピック。
  • references/formats.md:アスペクト比、セーフゾーン、縦型レイアウトの再構築ルール。
  • references/audio.md:TTSオプション、人間の録音、BGM合成、ダッキング、ラウドネス、単一エンコード。
  • references/qa.md:検収リストと自動チェックコマンド。

関連スキル