Film cinématographique
Un film réalisé de cette façon est un seul mouvement de caméra sur un seul monde. Chaque photo, carte, découpage, carte géographique et nombre vit sur un grand plateau, et la caméra se déplace entre eux le long de ficelles, d'itinéraires et de flèches au fur et à mesure que l'histoire avance. Chaque point visuel est chronométré sur le mot que le narrateur prononce. Tout est du code (Skia en Python), donc le rendu est identique à chaque fois, n'importe quel sujet convient, et une nouvelle voix retime l'ensemble du film automatiquement.
Construit à partir d'un documentaire de 5:22 sur Al Capone, puis ouvert à n'importe quel sujet. Les règles ici ont été écrites à partir de ce qui a cassé pendant sa fabrication.
Outils
| Fichier | Rôle |
|---|---|
scripts/check_setup.py | Vérifie Python, skia-python, ffmpeg, polices et mémoire ; indique quoi installer |
scripts/get_fonts.py | Télécharge des polices libres (Bebas Neue, Homemade Apple) pour tout rôle textuel manquant sur cette machine |
scripts/new_project.py | Démarre un projet à partir de assets/template/ (un explicatif exécutable), ou de l'exemple documentaire avec --example |
scripts/make_beats.py | Écrit beats.md, le tableau que vous approuvez ; vérifie la chronologie, la longueur des lignes, les chiffres dans le texte parlé |
scripts/tts_say.py | Voix de brouillon gratuite (macOS say, espeak-ng, ou toute commande TTS) pour chronométrer le film avant la voix finale |
scripts/split_takes.py | Découpe les prises de section entière en un clip par ligne et signale les coupes suspectes |
scripts/build_narration.py | Assemble les lignes en audio/narration.m4a et audio/timing.json, sur lesquels le film est construit |
scripts/fetch_commons.py | Recherche sur Wikimedia Commons, télécharge avec licence et crédit, refuse les fichiers non libres, écrit credits.md |
scripts/make_map.py | Projette les frontières du domaine public (n'importe quel pays ou région) pour la carte |
scripts/prep_assets.py | Uniformise chaque image en un seul look (noir et blanc, sépia ou couleur naturelle) ; génère les textures du plateau |
scripts/engine.py | Le moteur du film : caméra, projecteur, éléments, cartes, looks, finition du film |
scripts/render.py | Images fixes, bandes contact, la liste de repères, et le rendu MP4 parallélisé |
scripts/build_sfx.py | Synthétise chaque effet sonore à partir de la liste de repères (pas d'échantillons, rien à licencier) |
scripts/mix_soundtrack.py | Voix, effets et musique optionnelle, avec ducking et normalisation du volume |
scripts/burn_captions.py | Incruste un des quatre styles de sous-titres dans le film terminé et écrit un fichier SRT |
Nécessite Python 3.9+, pip install skia-python numpy pillow (scipy optionnel) et ffmpeg. Exécutez scripts/check_setup.py en premier ; sur Linux ou Windows, exécutez aussi scripts/get_fonts.py par projet. Toutes les commandes prennent --project <dossier>.
Choisir le film
| Genre | Look | Images | Éléments typiques |
|---|---|---|---|
| Histoire, true crime, enquête | wall, slate | Photos d'archives et documents, gradés bw | Tirages, découpages déchirés, tampons, ficelle rouge, itinéraires cartographiques |
| Lancement de produit, histoire de marque ou de fondateur | studio, charcoal | Vos photos de produit et d'équipe, gradés natural | Cartes, grands nombres, compteurs, flèches |
| Science, ingénierie, comment ça marche | blueprint, paper | Diagrammes, images d'archives ou d'IA | Cartes, compteurs, marques de stylo, cartes géographiques |
| Tech, espace, bandes-annonces | night | Captures d'écran, rendus, images d'IA | Grands caractères, compteurs, itinéraires, cartes |
Mélangez librement : les looks sont un plateau et une finition, et chaque élément fonctionne sur chaque look. references/story.md contient une structure narrative pour chaque genre.
Les règles
- Un héros par ligne. Chaque ligne de narration a exactement une chose sur laquelle la caméra se concentre. Le projecteur assombrit tout le reste.
- Les impacts tombent sur le mot parlé. Un tampon claque sur « inculpé », pas au début de la ligne. Chronométrez tout avec
doc.W(line, "word"). - Montrez une phrase d'une seule manière. Soit tapez-la à l'écran, soit montrez-la sur un vrai document, jamais les deux. Le corps du texte sur les documents est constitué de lignes grises, jamais de mots de remplissage.
- Le temps n'avance qu'après l'ouverture. Un début à froid peut sauter en avant. Après une ligne de transition (« Quatre ans plus tôt... »), le temps de l'histoire n'avance que.
- Du texte lisible sur un téléphone en une seconde. Grandes capitales condensées. Une étiquette tapée à l'écran doit représenter environ 3% ou plus de la hauteur du cadre.
- Moins, c'est plus. Les ficelles s'estompent après leur temps fort, et les anciens éléments s'assombrissent. Le plan de recul final doit sembler composé, pas encombré.
- Rien d'inventé qui semble réel. Les vraies photos et documents reçoivent des crédits. Un document dessiné en code est étiqueté comme une reconstitution et ne cite que des mots qui ont réellement été écrits. Les images d'IA sont acceptables pour l'illustration, mais jamais comme preuve d'un événement réel ou d'une personne réelle.
Flux de travail
Faites une pause pour l'approbation de l'utilisateur aux quatre portes (marquées Porte).
- Histoire. Recherchez, puis écrivez
script.json: prises (sections) de lignes, chacune avectext,spoken(nombres en toutes lettres),heroettyped. Gardez les notes factuelles à côté. 60 à 90 secondes correspondent à environ 150 à 230 mots. Les détails sont dansreferences/story.md. - Tableau des temps. Exécutez
scripts/make_beats.pyet corrigez chaque avertissement. Porte : l'utilisateur approuvebeats.md, y compris les faits. - Images. Listez chaque image dans
photos.json: son identifiant, son type et sa provenance.- Images d'archives :
fetch_commons.py search,categoryetget. - Fichiers propres à l'utilisateur : déposez-les dans
<projet>/assets/photos/. - Images d'IA : générez-les dans un seul style (le skill
motion-assetsles planifie et les estime). references/archive.mdcouvre les autres archives et les règles de droits.
- Images d'archives :
- Voix de brouillon. Exécutez
tts_say.py, puissplit_takes.py, puisbuild_narration.py. Écoutez chaque ligne quesplit_takes.pysignale. Maintenant les timings sont réels. - Ressources. Exécutez
make_map.pysi l'histoire voyage, puisprep_assets.py. - Scène. Écrivez
scene.py: disposez le plateau en clusters par section, ajoutez des éléments sur les tempsdoc.L/doc.W, puis les clés caméra et projecteur (film.shot). Lisezreferences/film.md. Les deux projets livrés montrent les motifs :assets/template/scene.py(explicatif, look studio) etassets/wright-flyer/scene.py(documentaire, tous les types d'éléments). - Test du look. Exécutez
render.py --probesur une image fixe par ligne en 1280x720 et regardez-les toutes, puis--stripsur chaque grand mouvement de caméra. Porte : montrez à l'utilisateur les images fixes de l'ouverture et du look. - Brouillon. Rendez les 30 premières secondes en 1280x720 avec la voix de brouillon. Porte : l'utilisateur le regarde.
- Voix finale. Enregistrez-la avec n'importe quel TTS ou une personne (
references/voice.md). Exécutez split, build et probes à nouveau ; rien dans la scène ne change. - Son. Exécutez
render.py --cues, puisbuild_sfx.py, puismix_soundtrack.py, en ajoutant une musique si souhaité. Lisezreferences/sound.md. - Finition. Effectuez le rendu complet, puis
burn_captions.pyet le SRT. Lisezreferences/performance.mdavant de rendre en 1440p ou 4K. Remettezcredits.mdavec le film.
Auto-évaluation, à chaque fois
Regardez les images fixes avant de prétendre que quoi que ce soit fonctionne. Voici les erreurs qui sont apparues, chacune dans un rendu réel :
- Encre foncée sur un plateau foncé : invisible. Utilisez des caractères clairs sur les looks sombres, ou
bar_h=0.92pour un bloc d'étiquette complet derrière des caractères sombres. - La caméra s'est déplacée mais le projecteur est resté, laissant un cadre sombre. Utilisez
film.shot()sauf s'ils doivent se séparer. - Échelle de carte trop petite : une côte entière plus petite qu'une photo. Choisissez
Kpour que chaque lieu avec des tirages ait sa propre pièce (references/film.md). - Étiquettes de carte qui se chevauchent. Placez l'étiquette du côté opposé à son voisin.
- Un cluster à cheval sur le bord de la carte. Gardez les clusters soit sur la carte, soit clairement en dehors.
- Surlignages décalés de quelques pixels par rapport à leurs mots. Utilisez
PaperDoc.phrase_spans, etdoc.on(print, fx, fy)avec des fractions lues sur une grille superposée à l'image.
Projets livrés
assets/template/: « From Cherry to Cup », un explicatif de 25 secondes en look studio, composé de cartes, flèches et un compteur, sans images.new_project.py mon-filmle copie. Donnez-lui une voix de brouillon et il se rend.assets/wright-flyer/: « Twelve Seconds », un documentaire de 90 secondes sur le premier vol et le rival à 50 000 $ qui s'est écrasé deux fois. Il utilise sept photos du domaine public, la carte des États-Unis, deux documents typographiés et tous les types d'éléments.
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a
Skills associés
De Open 3D Skills : motion-assets planifie et estime les images d'IA lorsqu'un film a besoin d'illustrations, et frame-capture enregistre des pages web au lieu de films dessinés en code.