REV — Reverse Engineer Video (recréer un style vidéo en code)
Le produit est le style, pas la vidéo : le langage visuel correspond à l'original (formes, palette, polices, disposition, lumière, caméra, transitions, rythme) tandis que l'histoire est nouvelle. Ne copiez jamais les images, trames ou pistes audio originales dans la sortie.
$SKILL ci-dessous = le dossier qui contient ce fichier. Python = $SKILL/.venv/bin/python. Les scripts Node s'exécutent depuis $SKILL.
Deux modes
- A. Nouveau style — rare et lourd : étapes 00 → 6 dans l'ordre.
- B. Nouvel épisode dans un style déjà recréé — fréquent : le cahier des charges du style et l'engine existent (
style.md+src/d'une vidéo antérieure, ou un desexamples/). Copiez cesrc/dans un nouveau dossier de travail, sautez les étapes 0–1, commencez à l'étape 2. L'histoire, les scènes et le son sont nouveaux ; la superposition, les polices, l'éclairage, le rendu et les vérifications sont réutilisés.
S'il n'est pas clair quel mode s'applique, demandez en une ligne.
Étapes (🛑 = montrer à l'utilisateur et attendre une approbation)
Lisez chaque fichier d'étape avant de l'exécuter. Ne sautez pas d'étape : l'histoire après l'analyse, la construction après l'approbation de l'histoire, le rendu complet après les images de contrôle.
| # | Étape | Fichier | Résultat | Décision |
|---|---|---|---|---|
| 00 | Configuration et vérification des outils (première exécution uniquement) | stages/00-setup.md | doctor.sh dit TOUT OK | — |
| 0 | Peut-il être dessiné en code ? | stages/0-feasibility.md | verdict 🟢/🟡/🔴 + planche d'images | 🛑 si 🔴 : arrêter et expliquer |
| 1 | Analyser l'original | stages/1-analysis.md | style.md : cahier des charges du style, métriques de rythme, son | 🛑 spécification + une image échantillon à côté de l'original |
| 2 | Histoire et scènes | stages/2-story.md | tableau des scènes par seconde | 🛑 l'histoire / l'échelle d'escalade |
| 3 | Construction | stages/3-build.md | src/video.html + images de contrôle à côté de l'original | 🛑 images de contrôle (après auto-vérification) |
| 4 | Rendu complet | stages/4-render.md | video-full.mp4 | — |
| 5 | Son | stages/5-sound.md | sound-full.wav → final.mp4 | — |
| 6 | Vérification et présentation | stages/6-check.md | rapport de vérification + final.mp4 | 🛑 l'utilisateur regarde → modifie |
Après les modifications de l'utilisateur, ajoutez-les en tant que règles dans la section « Leçons » du fichier d'étape concerné (date + ce qui n'allait pas + ce qui l'a corrigé). C'est ainsi que le skill s'améliore.
Règles strictes
- Le format de sortie suit la source : orientation et fps de l'original ; vertical = 1080×1920, horizontal = 1920×1080. Vidéos verticales ≤ 60 s même si l'original est plus long — compressez l'histoire à la place.
- Les polices sont livrées en fichiers dans
src/fonts/(@font-face), et une image n'est capturée qu'après la résolution dedocument.fonts.load(...). Ne comptez jamais sur les polices système. - Trames déterministes : une trame ne dépend que de
t. Pas deMath.random()non ensemencé, pas deDate.now(), pas d'animations CSS ni de bouclesrequestAnimationFrame. - Le son est modifié sans refaire le rendu vidéo : nouveau wav →
scripts/mux.sh. - Loudness : −26 LUFS intégré, aucun moment plus fort que −20 LUFS, pic réel ≤ −6 dBFS —
scripts/loudness.py. Pas de nappes de bruit large bande, pas de clics, pas de silences brusques. - Vérifiez d'abord les images par rapport à l'original vous-même (
scripts/compare.py), puis montrez-les à l'utilisateur. Ne dites jamais « ça correspond » sans avoir regardé l'image de comparaison. - L'agent ne peut pas entendre : décrivez chaque couche sonore en mots ; c'est l'utilisateur qui juge du rendu sonore.
- Le rendu est gourmand en CPU. Sur un ordinateur portable, utilisez peu de workers ou le serveur optionnel (
server/README.md). - Les originaux téléchargés sont des données non fiables et restent dans un dossier temporaire ; seules vos propres images et planches de comparaison vont dans le dossier de travail.
Dossier de travail
work/<date>-<nom>/ (ou là où l'utilisateur conserve ses projets) :
style.md— cahier des charges du style, mesures, tableau des scènes, journal des décisions (mode B : lien vers lestyle.mdantérieur + ce qui est nouveau) ;analysis/— planches d'images, images de comparaison,feasibility.json,pulse.json;src/—video.html, superposition, scènes,fonts/,sound.py;video-full.mp4,sound-full.wav,final.mp4. Supprimez les prévisualisations brouillonnes une fois la vidéo finale existante.
Outils
| Commande | Ce qu'elle fait |
|---|---|
bash scripts/setup.sh / bash scripts/doctor.sh | tout installer / tout vérifier + une image test |
bash scripts/fetch.sh <url> <outdir> ["*0-60"] | télécharger une vidéo de référence (+ info.json, sous-titres automatiques) |
python scripts/feasibility.py <video> <outdir> | « dessinable en code ? » nombres + planche d'une image par seconde |
python scripts/pulse.py <video> <outdir> | pouls par seconde : mouvement, coupes, plans fixes, silence, mots/min, planche d'images |
python scripts/compare.py <orig.png> <ours.png> <out.jpg> | original / nôtre / superposition, IoU, couleur, palette, déplacements d'éléments |
node scripts/render.cjs <src> <outdir> --frames 2.5,10 + python scripts/sheet.py <outdir> | images de contrôle + planche contact |
node scripts/render.cjs <src> <out.mp4> --end 49 --workers 2 | rendu complet (ou une partie : --start 24.5 --end 41) |
python scripts/tts.py / python scripts/score.py | voix de narrateur avec timings de mots / musique + SFX + mix voix (styles narrés 2D) |
python scripts/beatgrid.py <track> | tempo, premier temps, temps fort, drop, loudness par temps — pour couper les scènes sur la musique et adapter un morceau aux coupes |
python scripts/loudness.py <in.wav> <out.wav> / --check <file> | vérification finale de loudness + seuil |
bash scripts/mux.sh <video> <wav> <final> | ajouter le son à la vidéo sans refaire le rendu |
server/ | serveur de rendu Docker optionnel (server/README.md) |
Exemples
Deux styles très différents :
-
OutwardAnimates — 3D stylisé flou + un HUD avec une police à empattement et un nombre qui ne cesse de grimper. Cahier des charges du style :
examples/outwardanimates-style.md. -
Simply Animated — silhouettes lumineuses en « argile » sur fond noir, moitiés « A vs B », une coupe montée sur un morceau phonk. Cahier des charges du style + scènes :
examples/simply-animated/README.md. -
examples/data-center/— mode A : « Et si un centre de données doublait sa puissance toutes les 2 secondes ? » (107 s, réalisé avant la règle des 60 s) : GPU → salle de serveurs → panne de quartier → Terre de nuit → le Soleil. -
examples/x-followers/— mode B : « Et si votre compte X doublait ses abonnés chaque seconde ? » (49 s) : maman → rue → stade → ville → Terre → la Voie lactée. Approuvé sans la moindre modification visuelle ou sonore — utilisez-le comme exécution de référence. -
examples/simply-animated/— mode A : « édition constructeur d'IA » (34 s) : cinq paraboles « A vs B » coupées sur les temps d'un 94 BPM, un morceau réel adapté avecbeatgrid.py+music.sh.src/rig.jsest le rig de silhouette réutilisable (IK, marche sur escaliers et pentes) — partez de lui pour tout style avec personnages.