Que fait video-craft ?
Transformez n'importe quel sujet en vidéo. On choisit d'abord le moteur de rendu selon la forme du contenu, puis on suit la chaîne de production commune.
Anciennement anything2explainer (uniquement des vidéos Remotion de vulgarisation). Cette refactorisation extrait les éléments indépendants du moteur dans
core/, isole ce qui est spécifique au rendu dans backends/, et ajoute routing/ pour la sélection du backend.
Quand l'utiliser
- L'utilisateur demande une vidéo d'explication, de dérivation, de didacticiel ou de promotion sur un sujet ; ou un article à transformer en vidéo.
- Ne convient pas : reproduire une vidéo existante, vidéo avec un vrai présentateur, contenu principalement filmé.
Quatre points de validation (doivent attendre la réponse de l'utilisateur)
- Durée, langue + recommandation du backend (demander en même temps que la phase 1 de recherche) : Donner à l'utilisateur le résultat de
routing/router.mdet le tableau des durées, une question pour deux réponses. Si l'utilisateur rejette la recommandation, suivre la sienne. - Approbation du script narratif (phase 2, avant le doublage) : Texte complet + division en chapitres + nombre de mots/durée estimée, demander « Ce script vous convient-il ? ». Les noms des chapitres et les titres des sections HUD doivent apparaître sur une ligne séparée. Pour les vidéos multi-chapitres, lister côte à côte les deux phrases de transition de chaque chapitre. Après approbation, les numéros d'image sont tous figés ; ne plus modifier les mots.
- Doublage (avant d'exécuter
tts_build.py) : Par défaut, chinois avec edge-tts Yunxi, anglais avec kokoroam_liam. Si l'utilisateur a une préférence, il peut fournir son propre fichier wav dansscript/audio.wavet remplir manuellement la timeline. - Échantillon des 30 premières secondes (phase 5a, avant d'envoyer les autres groupes) : Demander « Le style / la taille de police / le rythme de la voix / le tempo vous conviennent-ils ? ». Modifier à ce stade ne coûte qu'un groupe ; modifier après le rendu complet coûte tout.
Processus (8 phases)
Phase 0 Création du projet → Appeler new_project.sh du backend correspondant selon le routage
Phase 1 Recherche → core/research-brief.md (1 agent en parallèle) 【Point de validation 1】
Phase 2 Narration + timeline → core/narration-guidance.md + tts_build.py 【Points de validation 2, 3】
Phase 3 Storyboard → Écrire selon le format du backend, core/render_storyboard.py
Phase 4 Éléments graphiques → Compléter selon le backend (remotion: ui.tsx / manim: figures.py)
Phase 5a Échantillon → Faire d'abord le groupe 1, preview.sh sort les 30 premières secondes 【Point de validation 4】
Phase 5b Construction parallèle → Chaque groupe a 1 agent, utiliser le fichier agent-build-rules.md du backend
Phase 6 Rendu → render.sh du backend → mp4 + fin_frames/
Phase 7 QC et réparation → core/motion_check.py + frame_metrics.py + qc-rules du backend
Phase 8 Livraison → Livraison.md (enregistrer le backend utilisé et la raison du choix)
Routage : d'abord choisir le backend
Lire impérativement routing/router.md. Résumé :
| Forme du contenu | Backend | Statut |
|---|---|---|
| Dérivation de formules continues / preuve / manipulation de symboles | manim | ✅ V1 |
| Explication de concept vulgarisé (qu'est-ce que X / comment ça marche / pourquoi) | remotion | ✅ V1 |
| Didacticiel en terminal réel (installation / configuration / exécution de commandes) | terminal | ⏸ V2 |
| Promotion produit / vidéo courte pour réseaux sociaux / PR walkthrough | hyperframes | ⏸ V3 |
Le choix ne dépend pas du nom du sujet, mais du fait que la narration manipule en continu des symboles : « Que fait la transformée de Fourier ? » → remotion (intuition) ; « Dériver la transformée de Fourier à partir des séries de Fourier » → manim (dérivation continue).
Lorsqu'un backend non implémenté est sélectionné, l'utilisateur doit en être informé et une solution de repli doit être proposée ; ne pas changer silencieusement de backend.
Dépendances préalables (à lire sur une nouvelle machine)
Tous les backends
# Les scripts Python de core/ en ont besoin. Créer un venv avec Python 3.13 (3.14 manque de roues, risqué)
uv venv --python 3.13 ~/.venvs/video-craft
uv pip install --python ~/.venvs/video-craft/bin/python numpy pillow scipy edge-tts
⚠ Sans ce venv,
tts_build.py/motion_check.py/frame_metrics.pyne peuvent pas s'exécuter. C'est une leçon apprise de anything2explainer : une dépendance venv non documentée bloque tout le flux sur une nouvelle machine.
Backend remotion
brew install ffmpeg # Pour l'extraction d'images
# Node 22+ ; le projet fait automatiquement npm install via new_project.sh
Backend manim
brew install pkg-config cairo pango # Nécessaire pour compiler pycairo, sinon manim ne s'installe pas
brew install --cask basictex # Nécessaire pour le rendu de formules MathTex réelles ; sans cela, retour aux approximations ASCII
On peut exécuter sans basictex (automatiquement
MANIM_TEX=text), mais les formules seront simplifiées (ex:a/b). Pour les vidéos de dérivation, basictex est indispensable — la qualité du rendu des formules est vitale.
Structure des répertoires
video-craft/
├── SKILL.md ← Ce fichier
├── routing/
│ └── router.md Arbre de décision + mécanismes de couverture + cas limites
├── core/ Indépendant du moteur, partagé par tous les backends
│ ├── research-brief.md Processus de recherche et règles de factualité
│ ├── narration-guidance.md 13 principes d'écriture de narration
│ ├── narration-storyboard.md Format narration/storyboard et système de tokens
│ ├── tts_build.py Doublage + timeline.json
│ ├── render_storyboard.py Remplacement des tokens de storyboard
│ ├── motion_check.py QC de rythme (lecture d'images, multi-backend)
│ ├── frame_metrics.py QC de composition (lecture d'images, multi-backend)
│ ├── sheet.py Grille de vignettes (lecture d'images)
│ └── lessons.md Pièges et causes racines
└── backends/
├── remotion/ Vidéos de vulgarisation (ex-anything2explainer)
│ ├── template/ Projet 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/ Échantillons (étalon de qualité)
├── manim/ Vidéos de dérivation
│ ├── template/ Projet Python (common/ + scenes/)
│ ├── scripts/
│ ├── reference/
│ └── README.md Résultats des tests d'environnement (cairo/latex/pycairo)
├── hyperframes/ Réservé V3
│ └── README.md
└── terminal/ Réservé V2 (l'utilisateur a confirmé que c'est nécessaire)
└── README.md
Référence rapide des fichiers clés
| Objectif | Fichier |
|---|---|
| Déterminer le backend à utiliser | routing/router.md |
| Lancer l'agent de recherche | core/research-brief.md |
| Écrire la narration | Lire d'abord core/narration-guidance.md, format dans core/narration-storyboard.md |
| Générer le doublage + timeline | core/tts_build.py |
| Générer le storyboard | core/render_storyboard.py |
| QC de rythme | core/motion_check.py |
| QC de composition | core/frame_metrics.py |
| Parcourir la vidéo complète | core/sheet.py |
| Créer un projet | backends/<backend>/scripts/new_project.sh |
| Lancer l'agent de construction | backends/<backend>/reference/agent-build-rules.md |
| Lancer l'agent QC | backends/<backend>/reference/agent-qc-rules.md |
Format du storyboard par backend
| Backend | Unité de storyboard | Format |
|---|---|---|
| remotion | Un plan (une phrase de narration + une image) | Token {S12.from-8} dans backends/remotion/reference/narration-storyboard.md |
| manim | Une étape de dérivation | Format DP dans backends/manim/reference/storyboard.md |
Seuils QC ajustables par backend
Les seuils par défaut de core/motion_check.py sont conçus pour les vidéos Remotion de vulgarisation ; les autres backends doivent les ajuster :
# remotion (par défaut)
python3 core/motion_check.py --frames fin_frames
# manim (dérivation) : seuil d'immobilité élargi à 5s (laisser le temps de voir après une manipulation), désactiver le critère de "hold" (pas de concept de sortie)
python3 core/motion_check.py --frames fin_frames --shots DP01:1-170 --still-max 5.0 --no-hold
# terminal (V2) : pauses plus longues en attendant la sortie des commandes, prévoir 8-10s
Principes stricts (communs à tous les backends)
- Originalité : Toutes les images sont générées par code ou enregistrées réellement ; aucune image ou séquence d'une vidéo existante ne peut être utilisée.
- Faits sourcés : Chaque nombre, terme, année, nom de personne à l'écran doit avoir une URL source dans le document de recherche.
- Contexte unifié tout au long de la vidéo : La narration et les images utilisent le même exemple fil conducteur.
- Ne pas modifier les mots après approbation : Les numéros d'image sont codés en dur ; un seul mot changé nécessite un réalignement complet.
- Informer du backend : Le résultat du routage et la solution de repli doivent être communiqués à l'utilisateur ; ne pas décider silencieusement.
Échantillons et étalons de qualité
- Backend remotion :
backends/remotion/examples/rag/(4′35″, 44 phrases, 44 plans) — avant de commencer, regarderexamples/rag/frames/overview_*.jpgpour établir l'étalon. - Backend manim : Pas d'échantillon en V1, seul un cycle minimal a été validé. Un échantillon étalon complet est prévu pour V2.
- Contre-exemples :
backends/remotion/examples/contrast/
Projets migrés depuis anything2explainer
Les projets sous ~/Projects/ai-video/ (linear-function / transformer / a2e-fourier / py-course)
ont été créés avec l'ancien skill et utilisent encore l'ancienne structure (template/scripts/). Ils restent utilisables —
l'ancien skill est conservé en état déprécié, ne pas le supprimer.
Les nouveaux projets doivent utiliser la nouvelle structure de ce skill.