Court métrage 3D réaliste (Blender + Python)
Chaque image est un rendu Blender réel d'une scène construite par Claude en Python. Aucun modèle IA d'image ou de vidéo.
Résultat final : 1080×1920, 30 i/s, H.264 limité à 30 Mb/s. Chemins : <skill> = ce dossier. Les épisodes sont
stockés dans <projet>/blender-shorts/<slug>/, les ressources téléchargées dans <projet>/blender-shorts/assets/,
les choix de chaîne dans <projet>/blender-shorts/brand.json. Exécutez les scripts avec python <skill>/scripts/<nom>.py.
À lire en premier : references/style.md (les règles), references/traps.md (avant d'inventer une correction).
Installation (une fois par PC)
- Blender 5.x (trouvé automatiquement dans Program Files ; sinon définir
BLENDER=<chemin_vers_blender.exe>). python -m pip install numpy opencv-python-headless pillow; ffmpeg dans le PATH.- Vérifier que le pipeline fonctionne : copier
examples/test-cell/versblender-shorts/test-cell/, puis build, still, frames, finish. Sur un RTX 3080 Laptop, EEVEE rend rapidement ses 90 images en 1080×1920 en environ 2 minutes.
Étape 0 : questions préliminaires (toujours, avant tout travail)
Demander avec l'outil AskUserQuestion, en deux séries de quatre questions maximum, puis une troisième série qui dépend de la réponse vocale. Si blender-shorts/brand.json existe, poser d'abord une question : « Mêmes réglages que la dernière fois ? » (les afficher en une ligne) avec « Oui » / « Modifier certains ». En cas de « Oui », passer à la partie thématique de la série 3. Option recommandée en premier. Enregistrer chaque réponse dans brand.json (pour la chaîne) et dans le fichier episode.json de l'épisode.
Série 1 : quoi et comment ça parle
- Sujet : « Suggérez-moi 3 sujets » / « J'en ai un » (ils le tapent sous Autre). Suggestions : questions sur le corps ou le fonctionnement des choses qui sont des images, vérifiées sur YouTube pour l'originalité de l'angle.
- Voix :
- Voix ElevenLabs (recommandée) : une voix standard, générée à partir du script avec les timings exacts des mots.
- Cloner ma voix (ElevenLabs) : ils téléversent 1 à 3 min de parole propre une fois ; chaque épisode parle ensuite avec leur voix. Uniquement leur propre voix, ou une voix pour laquelle ils ont un consentement écrit.
- Je l'enregistrerai moi-même : ils enregistrent le script ; Claude le nettoie, trouve les timings des mots et construit l'image en conséquence.
- Pas de voix, uniquement des sous-titres : le script est chronométré à 2,8 mots/s constants, les sous-titres sont incrustés et un fichier
captions.srtleur permet d'enregistrer ou d'ajouter une voix plus tard dans leur éditeur avec exactement ce timing.
- Durée : 30 s (recommandée pour une première) / 45 s / 60 s. À 2,8 mots/s, cela donne ~80 / 120 / 165 mots.
- Vidéos de référence : « Non, utiliser les règles de style intégrées » (recommandé) / « Oui, je vais donner des fichiers ou des liens » (mesuré avec
measure.py, étude privée uniquement).
Série 2 : l'apparence
- Apparence : Fond de studio (recommandé : une couleur signature derrière tout, le look du genre) / Fond photo réel (stade, rue, ciel derrière la 3D) / Mix (fond, avec des lieux réels pour les moments « où »).
- Couleur de fond (sauter si pas de fond) : Pêche
#F2D7C9(la nôtre jusqu'à présent) / Menthe#CFE8DF/ Bleu marine foncé#1F2A44/ Personnalisée (hex). Ne jamais utiliser la couleur de la chaîne de référence. - Personnage principal : « Y a-t-il un personnage principal ? » (
references/characters.md)- Je fournirai un personnage riggé : leur fichier .blend / .fbx / .glb (Mixamo, Character Creator, un magasin).
- Créez-en un pour moi (recommandé s'ils n'en ont pas) : construit dans Blender avec MPFB, pas de compte, notre logo sur le t-shirt.
- Télécharger un personnage riggé gratuit : Claude propose 2-3 candidats (source, licence, aspect) ; sur les sites nécessitant un compte (Mixamo, Renderpeople, Sketchfab), l'utilisateur le télécharge et donne le chemin.
- Pas de personnage : uniquement des objets, des parties du corps et des lieux.
Une fois qu'un personnage principal existe (
assets/host/host.blend), cette question devient « Utiliser à nouveau ? ».
- Moteur de rendu :
- Auto (recommandé) : EEVEE rapide partout, Cycles rapide uniquement pour les plans qui échouent au jugement sur les gros plans de peau, les nuages, le verre ou les cheveux.
- EEVEE rapide uniquement : le plus rapide, ~1 s par image.
- Cycles rapide uniquement : environ 2× plus lent, lumière plus douce et naturelle.
- Haute qualité : les préréglages
high, environ 2-3× plus lents que rapide.
Série 3 : dépend de la réponse vocale
- ElevenLabs ou clonage : le point clé. Vérifier la présence de
ELEVENLABS_API_KEY=dans un fichier.envdu projet ou au-dessus (ne jamais l'afficher). Si elle existe, dire « J'ai trouvé votre clé ElevenLabs » et ne pas demander. Sinon, demander : « Ajoutez votre clé : collez-la ici et je l'enregistrerai dans.env, ou ajoutez vous-même la ligneELEVENLABS_API_KEY=...dans.env(elle reste hors du chat) ». Enregistrer une clé collée dans<projet>/.envuniquement, ne jamais la répéter, ne jamais la mettre dans un autre fichier, commit ou journal. - ElevenLabs : Voix : Narrateur calme (id par défaut dans
sound.py) / « Choisir dans ma bibliothèque ElevenLabs » (lister avecGET /v1/voices, afficher uniquement les noms) / ID de voix (ils le tapent). Modèle vocal : eleven_multilingual_v2 (recommandé : stable, meilleurs timings de mots) / eleven_v3 (plus expressif, moins prévisible). - Clonage : demander les fichiers d'échantillon (chemins), puis
sound.py <ep> clone <fichiers> --name "<nom> voix"; l'ID de la voix est sauvegardé et réutilisé pour chaque épisode suivant. - Propre enregistrement : leur dire d'attendre que le script soit approuvé, puis de l'enregistrer en une prise, téléphone à bout de bras, pièce calme, et de donner le chemin du fichier. (L'enregistrement sur le script approuvé est ce qui synchronise l'image et la voix.)
- Personnage principal, selon la réponse de la série 2 :
- Fournir : demander le chemin du fichier (et le dossier de textures si séparé).
- Créer : demander la tranche d'âge, la morphologie, le style de coiffure et de vêtements (mots simples) ; puis demander d'installer MPFB.
- Télécharger : montrer les 2-3 candidats comme options (nom, aspect, licence, compte nécessaire) et les laisser choisir.
- Chaque option vocale : Sous-titres incrustés ? Oui / Non (pas de voix = toujours des sous-titres).
- Chaque option : Musique : Aucune, uniquement effets et bruit ambiant (recommandé pour une première) / Ma propre piste (chemin du fichier, ils confirment avoir les droits) / Piste de la bibliothèque audio YouTube (ils la téléchargent et donnent le chemin).
Ne pas demander autre chose ; tout ce qui suit a une valeur par défaut. Questions « modèle spécifique » : il n'y a pas de modèle IA d'image ou de vidéo dans ce pipeline. Les choix qui en tiennent lieu sont le moteur de rendu (série 2), le modèle vocal ElevenLabs (série 3) et le modèle Claude exécutant la compétence : Opus à effort élevé donne les meilleurs résultats.
Préréglages du moteur (les réglages choisis par l'utilisateur, les conserver)
- EEVEE rapide (par défaut,
b3d.EEVEE_PRESETS['fast']) : 16 échantillons, ray tracing et GI à demi-résolution, 1 rayon d'ombre. ~0,9-1,2 s par image en 1080p sur la 3080, 99-99,9 % de similarité avechigh. - Cycles rapide (
b3d.CYCLES_PRESETS['fast']) : 32 échantillons, limite de temps 1 s, débruitage OptiX, 2-3 rebonds, approximation GI rapide, Persistent Data. ~1,7 s par image. Si le débruitage bave sur un gros plan, donner à ce plan une limite de 2 s. --quality draft | fast | highau moment du rendu, pas de reconstruction. Moteur par scène :setup_render(engine=...), ouB3D_ENGINE=CYCLES python render.py <ep> buildpour A/B sans édition. Des moteurs mixtes dans un même court métrage conviennent (rendre la plage d'images de chaque plan depuis son propre .blend) si le fond et le grading correspondent.
Pipeline (enregistrer après chaque étape ; montrer à l'utilisateur des images, pas des murs de texte)
- Sujet et faits. Travailler chaque nombre et l'écrire avec sa source dans
episode.jsonsousscience. Les nombres célèbres incertains sont précédés de « Les scientifiques estiment ». Le même sujet qu'une grande chaîne convient ; leurs mots ne sont pas les nôtres. - Mesurer la référence (uniquement si la série 1 a répondu oui) :
measure.py <dossier> --out <ep>/reference.json. Sinon, utiliser les valeurs par défaut dans style.md. - Script dans
episode.json(examples/episode.template.json) : deuxième personne, ~2,8 mots/s, durée choisie, structure des beats dans style.md. Le montrer et attendre une validation. Après validation, « exécutez-le » jusqu'aux stills. - Voix et timing, selon la réponse de la série 1 :
- ElevenLabs / clone :
sound.py <ep> voice→audio/voice.wav,words.json,captions.srt. - Propre enregistrement : attendre leur fichier, puis
sound.py <ep> own <fichier>(timings des mots : faster-whisper si installé, sinon ElevenLabs speech-to-text s'il y a une clé, sinon estimés à partir des silences ; proposerpip install faster-whispersi l'estimation est erronée). - Pas de voix :
sound.py <ep> captions→words.json+captions.srtà"wps"(2,8). Puis écrireshots.md: par beat, la plage d'images (d'après les timings des mots), le mouvement de caméra (dolly avant / maintien + dérive / dolly arrière / survol) et ce qui reste en mouvement pendant chaque maintien. Maximum un cut franc pour ~7 transitions.
- ElevenLabs / clone :
- Le test des 9 secondes d'abord. Un beat avec le pipeline complet avant le court métrage entier :
scene.pyavec les helpersb3d. Rendu, finish,measure.py, etcompare.py reference.json ours.jsons'il y a une référence. La différence est la liste des tâches. Corriger la caméra jusqu'à ce que les saccades et le mouvement latéral correspondent (un axe, clés adoucies). - Monde et personnage. Personnage en premier, selon son chemin dans
references/characters.md, toujours viab3d.import_character(chemin, height=1.75): il le met à l'échelle réelle avec les pieds au sol, supprime les caméras et lumières parasites, lie les parties pondérées au rig et imprime un rapport (type de rig, parties ne suivant pas le rig, formes du visage x/52, textures manquantes). Corriger chaque élément du rapport, puis une image de rotation, puis enregistrerassets/host/host.blend. Monde depuisreferences/assets.md(liste des téléchargements, source + licence + taille, demander une fois). Règle : si un vrai existe, le télécharger, ne jamais le modéliser. - Stills et le juge.
render.py <ep> still <images...> --pct 50pour chaque beat. Puis lancer un agent séparé (outil Agent) avec les stills etreferences/realism.md; il note sur 10 et nomme les trois pires signes de non-réalisme. Corriger, relancer le rendu, rejuger. Ne rendre qu'à 8,5+. Montrer à l'utilisateur les stills et la note. En moteur « Auto », un plan qui échoue sur un raccourci EEVEE passe ici en Cycles rapide. - Rendu. Exécuter
render.py <ep> framesdans le terminal de l'utilisateur (run_in_terminal) pour qu'il voie la barre en direct (images faites, s par image, ETA) ; lire<ep>/progress.jsonpour répondre à « Où en est-on ? ». Reprise possible. Ensuiterender.py <ep> times; si trop lent, travailler surreferences/render-speed.mdsur les images les plus lentes. - Son.
beds(un bruit ambiant par monde) etsfx(chacun sur son mot : « coup d'os » sur « os ») dansepisode.json, puissound.py <ep> sfx(nécessite une clé ; sans, sauter les effets ou utiliser des fichiers fournis par l'utilisateur dansaudio/sfx/<nom>.mp3) etsound.py <ep> mix. Règle du mix : musique +3 dB, effets à moitié, voix inchangée. - Finish.
finish.py <ep> --audio <ep>/audio/mix.wav [--captions]→out/<slug>-final.mp4. Le regarder en taille téléphone. Épisodes sans voix : fournir égalementcaptions.srtet dire que la voix se place à ces moments. - Rapport : le chemin final, la dernière note du juge, les minutes de rendu, les crédits ElevenLabs (
costs.json) et le texte de crédits pour la description (licences assets.md). Ne jamais prétendre que la chaîne de référence utilise un outil quelconque.
Scripts
| Script | S'exécute dans | Fait |
|---|---|---|
b3d.py | Blender | configuration du rendu + préréglages (EEVEE/Cycles, GPU, look), fond + HDRI, capture d'ombre (réel sur Cycles, simulé sur EEVEE), lumières, caméra dolly un axe adouci, matériaux, import_character (tout .blend/.fbx/.glb riggé, mis à l'échelle, lié, rapporté), parent_to_bone, clés de forme, compositeur, chronomètre |
render.py | shell | build, still, frames (barre de progression live, progress.json, reprise possible), times ; --quality |
sound.py | shell | voice (ElevenLabs), clone, own (enregistrement utilisateur), captions (pas de voix), sfx, mix ; chaque mode vocal écrit captions.srt |
finish.py | shell | images + mix → mp4 1080×1920, couche caméra réelle, incrustation --captions |
measure.py / compare.py | shell | métriques image par image de toute vidéo ; référence vs nôtre avec une liste de tâches |
scene.py est appelé comme blender -b --factory-startup --python scene.py -- <skill>/scripts <ep>/scene.blend ;
commencer à partir de examples/test-cell/scene.py (appeler shadow_catcher après les lumières).