video-craft
任意のトピックを動画にします。まずコンテンツの形態に応じてレンダリングバックエンドを選択し、共有の生産ラインを進みます。
前身は anything2explainer(Remotion 解説動画のみ)でした。今回の分割で、レンダラー非依存のアセットを core/ に、レンダリング関連を backends/ に分離し、新たに routing/ でバックエンド選択を行います。
使用タイミング
- ユーザーがトピックを指定し、解説・導出・教育・プロモーションのいずれかの動画を希望する場合。または記事を動画に変換したい場合。
- 適用外:既存の動画の再現、実際の人物によるナレーション、実写主体の動画。
4つの確認ポイント(必ずユーザーの返答を待つ)
- 尺・言語+バックエンド推奨(フェーズ1で調査と同時に確認):
routing/router.mdの判定結果と尺の表をユーザーに提示し、一問二答。ユーザーが推奨を拒否した場合は、その指示に従う。 - ナレーション原稿確定(フェーズ2、音声作成前):全文+章分割+文字数/推定尺を提示し、「この原稿で良いですか?」と確認。章名とHUD小節名は別途1行に並べる。複数章の動画では、各章の境界にある2文を並べて表示する。確定後はフレーム番号が全て変わるため、文言は変更しない。
- 音声作成(
tts_build.py実行前):デフォルトは中国語 edge-tts 雲希、英語 kokoroam_liam。好みがある場合はユーザーが自作のwavをscript/audio.wavに配置し、タイムラインを手入力する。 - 最初の30秒サンプル(フェーズ5a、他のグループを割り当てる前):「スタイル/フォントサイズ/ナレーション速度/リズムは適切ですか?」と確認。ここで修正する場合は1グループ分のコスト、全体レンダリング後に修正する場合は全グループ分のコストがかかる。
フロー(8フェーズ)
フェーズ0 プロジェクト作成 → ルーティング結果に応じて対応バックエンドの new_project.sh を呼び出す
フェーズ1 調査 → core/research-brief.md(並列1エージェント) 【確認ポイント1】
フェーズ2 ナレーション+タイムライン → core/narration-guidance.md + tts_build.py 【確認ポイント2、3】
フェーズ3 絵コンテ → バックエンドの形式に従って記述、core/render_storyboard.py
フェーズ4 図形要素 → バックエンドに応じて追加(remotion: ui.tsx / manim: figures.py)
フェーズ5a プレビュー → 最初の1グループを作成、preview.sh で最初の30秒を出力 【確認ポイント4】
フェーズ5b 並列ビルド → 各グループ1エージェント、バックエンドの agent-build-rules.md を使用
フェーズ6 レンダリング → バックエンドの render.sh → mp4 + fin_frames/
フェーズ7 QCと修正 → core/motion_check.py + frame_metrics.py + バックエンドの qc-rules
フェーズ8 納品 → 納品説明.md(使用バックエンドと判定理由を記録)
ルーティング:まずバックエンドを選択
routing/router.md を必読。 簡易版:
| コンテンツ形態 | バックエンド | ステータス |
|---|---|---|
| 連続的な数式導出/証明/記号変形 | manim | ✅ V1 |
| 概念解説(Xとは何か/仕組み/理由) | remotion | ✅ V1 |
| 実際のターミナル操作教育(インストール/設定/コマンド実行) | terminal | ⏸ V2 |
| 製品プロモーション/ソーシャル動画/PRウォークスルー | hyperframes | ⏸ V3 |
判定はトピック名ではなく、ナレーションが連続的に記号を操作しているかどうかで判断:「フーリエ変換が何をするか」→ remotion(直感的説明);「フーリエ級数からフーリエ変換を導出」→ manim(連続導出)。
未実装のバックエンドが選択された場合、必ずユーザーに通知し、代替案を説明する。 黙ってバックエンドを変更してはならない。
前提依存関係(新規マシンで必読)
全バックエンド共通
# core/ の Python スクリプトに必要。3.13 で venv を作成(3.14 は wheel 不足のリスクあり)
uv venv --python 3.13 ~/.venvs/video-craft
uv pip install --python ~/.venvs/video-craft/bin/python numpy pillow scipy edge-tts
⚠ この venv がないと、
tts_build.py/motion_check.py/frame_metrics.pyが全て動作しません。これは anything2explainer で踏んだ落とし穴です:文書化されていない venv 依存関係により、新規マシンで全フローが停止しました。
remotion バックエンド
brew install ffmpeg # フレーム抽出用
# Node 22+;プロジェクトは new_project.sh が自動的に npm install を実行
manim バックエンド
brew install pkg-config cairo pango # pycairo コンパイルに必須。不足すると manim がインストール不可
brew install --cask basictex # MathTex による本格的な数式組版に必須。不足すると ASCII 近似にフォールバック
basictex をインストールしなくても動作は可能(自動的に
MANIM_TEX=textになる)が、数式はa/bのような ASCII 近似のみとなります。導出動画では basictex を必ずインストールしてください——数式組版の品質は導出動画の生命線です。
ディレクトリ構成
video-craft/
├── SKILL.md ← 本ファイル
├── routing/
│ └── router.md バックエンド判定木+オーバーライド機構+境界ケース
├── core/ レンダラー非依存、全バックエンド共通
│ ├── research-brief.md 調査フローと事実に関するルール
│ ├── narration-guidance.md 13のナレーション原稿原則
│ ├── narration-storyboard.md ナレーション/絵コンテ形式とトークンシステム
│ ├── tts_build.py 音声+timeline.json
│ ├── render_storyboard.py 絵コンテトークン置換
│ ├── motion_check.py リズムQC(フレーム読み取り、バックエンド間共通)
│ ├── frame_metrics.py 構図QC(フレーム読み取り、バックエンド間共通)
│ ├── sheet.py サムネイルグリッド(フレーム読み取り)
│ └── lessons.md 失敗事例と根本原因
└── backends/
├── remotion/ 概念解説動画(旧 anything2explainer)
│ ├── template/ React プロジェクト
│ ├── scripts/ render/preview/still/test_render/new_project/selfcheck
│ ├── reference/ style-guide/motion-vocabulary/composition-and-light/
│ │ agent-build-rules/agent-qc-rules/prompts/math-physics
│ └── examples/rag/ サンプル動画(品質基準)
├── manim/ 導出動画
│ ├── template/ Python プロジェクト(common/ + scenes/)
│ ├── scripts/
│ ├── reference/
│ └── README.md 環境実測結果(cairo/latex/pycairo)
├── hyperframes/ V3 予約
│ └── README.md
└── terminal/ V2 予約(ユーザー確認済み、必須)
└── README.md
コアファイル早見表
| 目的 | 使用ファイル |
|---|---|
| 使用するバックエンドを判定 | routing/router.md |
| 調査エージェントの割り当て | core/research-brief.md |
| ナレーション原稿の作成 | 最初に core/narration-guidance.md を読み、形式は core/narration-storyboard.md を参照 |
| 音声+タイムラインの生成 | core/tts_build.py |
| 絵コンテ表の生成 | core/render_storyboard.py |
| リズムQC | core/motion_check.py |
| 構図QC | core/frame_metrics.py |
| 完成動画の通し確認 | core/sheet.py |
| プロジェクト作成 | backends/<バックエンド>/scripts/new_project.sh |
| ビルドエージェントの割り当て | backends/<バックエンド>/reference/agent-build-rules.md |
| QCエージェントの割り当て | backends/<バックエンド>/reference/agent-qc-rules.md |
バックエンド固有の絵コンテ形式
| バックエンド | 絵コンテ単位 | 形式 |
|---|---|---|
| remotion | 1カット(ナレーション1文につき1画面) | backends/remotion/reference/narration-storyboard.md の {S12.from-8} トークン |
| manim | 1つの導出ステップ | backends/manim/reference/storyboard.md のDP形式 |
QC閾値はバックエンドごとに調整
core/motion_check.py のデフォルト閾値は remotion 概念解説動画向けに設定されています。他のバックエンドでは調整が必要です:
# remotion(デフォルト)
python3 core/motion_check.py --frames fin_frames
# manim 導出動画:静止上限を5秒に緩和(操作後に確認する時間を確保)、hold判定をオフ(離脱概念なし)
python3 core/motion_check.py --frames fin_frames --shots DP01:1-170 --still-max 5.0 --no-hold
# terminal 教育動画(V2):コマンド出力待ちで静止時間が長くなるため、8-10秒程度を見込む
ハードルール(全バックエンド共通)
- オリジナル:画面は全てコードで描画または実際の録画によるもの。既存の動画のフレームやクリップを使用してはならない。
- 事実には出典を:画面上の全ての数字、用語、年号、人名は、調査ドキュメント内に出典URLが存在しなければならない。
- 動画全体で1つの一貫したサンプルコンテキスト:ナレーションと画面で同じサンプルを使い続ける。
- 確定後は文言を変更しない:フレーム番号がハードコードされるため、1文字変更すると動画全体の位置合わせがやり直しになる。
- バックエンドをユーザーに通知:ルーティング判定結果と代替案は、必ずユーザーに知らせる。黙って決定してはならない。
サンプル動画と品質基準
- remotion バックエンド:
backends/remotion/examples/rag/(4分35秒、44文、44カット) —— 作業開始前にexamples/rag/frames/overview_*.jpgを確認し、品質基準を設定する。 - manim バックエンド:V1にサンプル動画はなし、最小限の動作確認のみ。完全な品質基準サンプルはV2で追加予定。
- 悪い例:
backends/remotion/examples/contrast/
anything2explainer から移行したプロジェクト
~/Projects/ai-video/ 以下の linear-function / transformer / a2e-fourier / py-course は元のスキルで作成されたもので、旧レイアウト(template/scripts/)のままです。これらは引き続き使用可能です。元のスキルは非推奨状態として保持し、削除しないでください。
新しいプロジェクトは、必ず本スキルの新しいレイアウトを使用してください。