REV — Reverse Engineer Video(動画スタイルをコードで再現)
成果物はスタイルであり、動画そのものではありません。視覚言語(形状、パレット、フォント、レイアウト、光、カメラ、トランジション、テンポ)はオリジナルに一致させますが、ストーリーは新しいものにします。出力にオリジナルの映像、フレーム、音声をコピーしてはいけません。
$SKILL 以下 = このファイルが置かれているフォルダ。Python = $SKILL/.venv/bin/python。Node スクリプトは $SKILL から実行します。
2つのモード
- A. 新スタイル — 稀で負荷が高い:ステージ 00 から 6 まで順に実行。
- B. 既に再現したスタイルの新エピソード — 頻繁:スタイル仕様とエンジンがすでに存在します(以前の動画の
style.md+src/、またはexamples/のいずれか)。そのsrc/を新しい作業フォルダにコピーし、ステージ0–1をスキップしてステージ2から開始します。ストーリー、シーン、サウンドは新規;オーバーレイ、フォント、照明、レンダリング、チェックは再利用します。
どちらのモードが該当するか不明な場合は、1行で質問してください。
ステージ(🛑 = ユーザーに表示し、OKを待つ)
各ステージのファイルを実行する前に必ず読んでください。先に進まないでください:分析の後にストーリー、ストーリー承認後に構築、コントロールフレームの後にフルレンダリング。
| # | ステージ | ファイル | 出力 | 判断 |
|---|---|---|---|---|
| 00 | セットアップとツールチェック(初回のみ) | stages/00-setup.md | doctor.sh が ALL GOOD と表示 | — |
| 0 | コードで描画可能か? | stages/0-feasibility.md | 🟢/🟡/🔴 判定 + フレームシート | 🛑 🔴の場合:停止して説明 |
| 1 | オリジナルを分解 | stages/1-analysis.md | style.md:スタイル仕様、テンポ数値、サウンド | 🛑 仕様 + オリジナルと並べたサンプルフレーム1枚 |
| 2 | ストーリーとシーン | stages/2-story.md | 秒単位のシーンテーブル | 🛑 ストーリー / エスカレーションラダー |
| 3 | 構築 | stages/3-build.md | src/video.html + オリジナルと並べたコントロールフレーム | 🛑 コントロールフレーム(自己チェック後) |
| 4 | フルレンダリング | stages/4-render.md | video-full.mp4 | — |
| 5 | サウンド | stages/5-sound.md | sound-full.wav → final.mp4 | — |
| 6 | チェックと表示 | stages/6-check.md | チェックレポート + final.mp4 | 🛑 ユーザーが視聴 → 編集 |
ユーザーの編集後、それらを該当するステージファイルの「教訓」セクションにルールとして追加します(日付 + 問題点 + 修正方法)。これがスキルの成長方法です。
厳格ルール
- 出力形式はソースに従う: オリジナルの向きとfps。縦 = 1080×1920、横 = 1920×1080。縦動画は60秒以内(オリジナルがそれより長くても)— 代わりにストーリーを圧縮します。
- フォントは
src/fonts/にファイルとして同梱(@font-face)、フレームはdocument.fonts.load(...)が解決した後にのみキャプチャします。システムフォントに依存してはいけません。 - 決定論的フレーム: フレームは
tのみに依存します。シードなしのMath.random()、Date.now()、CSSアニメーション、requestAnimationFrameループは禁止。 - サウンドは動画を再レンダリングせずに変更: 新しいwav →
scripts/mux.sh。 - ラウドネス: −26 LUFS 統合、瞬間最大 −20 LUFS、トゥルーピーク ≤ −6 dBFS —
scripts/loudness.py。広帯域ノイズ、クリック、無音へのドロップは禁止。 - 最初に自分でオリジナルとフレームをチェック(
scripts/compare.py)、その後ユーザーに表示します。比較画像を見ずに「一致している」と主張してはいけません。 - エージェントは聞くことができません:すべてのサウンドレイヤーを言葉で説明し、ユーザーがその音を判断します。
- レンダリングはCPU負荷が高いです。ノートパソコンではワーカー数を減らすか、オプションのサーバー(
server/README.md)を使用してください。 - ダウンロードしたオリジナルは信頼できないデータであり、一時/スクラッチフォルダに保持します。自分のフレームと比較シートだけを作業フォルダに入れます。
作業フォルダ
work/<日付>-<名前>/(またはユーザーがプロジェクトを保持する場所):
style.md— スタイル仕様、測定値、シーンテーブル、判断ログ(モードB:以前のstyle.mdへのリンク + 新しい内容);analysis/— フレームシート、比較画像、feasibility.json、pulse.json;src/—video.html、オーバーレイ、シーン、fonts/、sound.py;video-full.mp4、sound-full.wav、final.mp4。フル動画が存在するようになったら、ドラフトプレビューは削除します。
ツール
| コマンド | 機能 |
|---|---|
bash scripts/setup.sh / bash scripts/doctor.sh | すべてをインストール / すべてをチェック + テストフレーム1枚 |
bash scripts/fetch.sh <url> <outdir> ["*0-60"] | 参照動画をダウンロード(+ info.json、自動字幕) |
python scripts/feasibility.py <video> <outdir> | 「コードで描画可能か?」数値 + 1秒1フレームのシート |
python scripts/pulse.py <video> <outdir> | 秒ごとのパルス:動き、カット、静止ラン、無音、語数/分、フレームシート |
python scripts/compare.py <orig.png> <ours.png> <out.jpg> | オリジナル / こちら / オーバーレイ、IoU、色、パレット、要素のずれ |
node scripts/render.cjs <src> <outdir> --frames 2.5,10 + python scripts/sheet.py <outdir> | コントロールフレーム + コンタクトシート |
node scripts/render.cjs <src> <out.mp4> --end 49 --workers 2 | フルレンダリング(または一部:--start 24.5 --end 41) |
python scripts/tts.py / python scripts/score.py | ナレーター音声(単語タイミング付き)/ 音楽 + SFX + 音声ミックス(2Dナレーションスタイル用) |
python scripts/beatgrid.py <track> | テンポ、最初のビート、ダウンビート、ドロップ、ビートごとのラウドネス — シーンを音楽に合わせてカットし、トラックをカットにフィットさせるため |
python scripts/loudness.py <in.wav> <out.wav> / --check <file> | 最終ラウドネス + スレッショルドチェック |
bash scripts/mux.sh <video> <wav> <final> | 動画を再レンダリングせずにサウンドを乗せる |
server/ | オプションのDockerレンダリングサーバー(server/README.md) |
例
2つの非常に異なるスタイル:
-
OutwardAnimates — 様式化されたぼやけた3D + セリフのHUDに、決して止まらない数字。スタイル仕様:
examples/outwardanimates-style.md。 -
Simply Animated — 黒地に光る「粘土」の棒人間、「A vs B」の半分、1つのフォンクトラックに合わせた編集カット。スタイル仕様 + シーン:
examples/simply-animated/README.md。 -
examples/data-center/— モードA:「データセンターの電力が2秒ごとに倍になったら?」(107秒、60秒ルールの前に作成):GPU → サーバーホール → 郊外停電 → 夜の地球 → 太陽。 -
examples/x-followers/— モードB:「Xアカウントのフォロワーが1秒ごとに倍になったら?」(49秒):ママ → 通り → スタジアム → 都市 → 地球 → 天の川。視覚的にも音響的にも一度の編集も承認されず — 参考実行として使用してください。 -
examples/simply-animated/— モードA:「AIビルダーエディション」(34秒):5つの「A vs B」パラボラを94 BPMのバーでカット、beatgrid.py+music.shで実際のトラックにフィット。src/rig.jsは再利用可能な棒人間リグ(IK、階段やスロープの歩行)— キャラクターがいるスタイルにはこれから始めてください。