Kinematografischer Film
Ein auf diese Weise erstellter Film ist eine einzige Kamerafahrt über eine einzige Welt. Jedes Foto, jede Karte, jeder Ausschnitt, jede Landkarte und jede Zahl lebt auf einer großen Tafel, und die Kamera bewegt sich zwischen ihnen entlang von Fäden, Routen und Pfeilen, während die Geschichte voranschreitet. Jeder visuelle Treffer ist auf das Wort des Erzählers abgestimmt. Alles ist Code (Skia in Python), sodass es jedes Mal gleich rendert, jedes Thema passt und eine neue Stimme den gesamten Film selbstständig neu timt.
Entstanden aus einer 5:22-minütigen Dokumentation über Al Capone, dann für jedes Thema geöffnet. Die hier festgelegten Regeln wurden aus dem geschrieben, was während der Erstellung kaputtging.
Werkzeuge
| Datei | Funktion |
|---|---|
scripts/check_setup.py | Prüft Python, skia-python, ffmpeg, Schriftarten und Arbeitsspeicher; sagt, was installiert werden muss |
scripts/get_fonts.py | Lädt frei lizenzierte Schriftarten (Bebas Neue, Homemade Apple) für jede Textrolle herunter, die dieser Maschine fehlt |
scripts/new_project.py | Startet ein Projekt aus assets/template/ (ein ausführbarer Erklärfilm) oder das Dokumentationsbeispiel mit --example |
scripts/make_beats.py | Schreibt beats.md, die Tabelle, die Sie genehmigen; prüft Chronologie, Zeilenlänge, Ziffern im gesprochenen Text |
scripts/tts_say.py | Kostenlose Rohstimme (macOS say, espeak-ng oder ein beliebiger TTS-Befehl), um den Film vor der endgültigen Stimme zu timen |
scripts/split_takes.py | Schneidet ganze Abschnitts-Takes in einen Clip pro Zeile und markiert verdächtige Schnitte |
scripts/build_narration.py | Fügt die Zeilen zu audio/narration.m4a und audio/timing.json zusammen, auf denen der Film aufbaut |
scripts/fetch_commons.py | Durchsucht Wikimedia Commons, lädt mit Lizenz und Quellenangabe herunter, lehnt nicht-freie Dateien ab, schreibt credits.md |
scripts/make_map.py | Projiziert gemeinfreie Grenzen (jedes Land oder jede Region) für die Karte |
scripts/prep_assets.py | Gleicht jedes Bild in ein einheitliches Aussehen an (Schwarz-Weiß, Sepia oder Naturfarbe); erzeugt die Tafeltexturen |
scripts/engine.py | Die Film-Engine: Kamera, Spotlight, Objekte, Karten, Looks, Film-Finish |
scripts/render.py | Standbilder, Kontaktabzüge, die Cueliste und das parallele MP4-Rendering |
scripts/build_sfx.py | Synthetisiert jedes Sound-Effekt aus der Cueliste (keine Samples, nichts zu lizenzieren) |
scripts/mix_soundtrack.py | Stimme, Effekte und optionale Musik, dynamisch abgesenkt und lautheitsnormalisiert |
scripts/burn_captions.py | Brennt einen von vier Untertitel-Stilen in den fertigen Film und schreibt eine SRT-Datei |
Benötigt Python 3.9+, pip install skia-python numpy pillow (scipy optional) und ffmpeg. Führen Sie zuerst scripts/check_setup.py aus; führen Sie unter Linux oder Windows auch scripts/get_fonts.py pro Projekt aus. Alle Befehle akzeptieren --project <ordner>.
Wählen Sie den Film
| Art | Look | Bilder | Typische Objekte |
|---|---|---|---|
| Geschichte, True Crime, Ermittlung | wall, slate | Archivfotos und -dokumente, abgestuft bw | Abzüge, zerrissene Ausschnitte, Stempel, roter Faden, Kartenrouten |
| Produkteinführung, Marken- oder Gründergeschichte | studio, charcoal | Ihre Produktbilder und Teamfotos, abgestuft natural | Karten, große Zahlen, Zähler, Pfeile |
| Wissenschaft, Technik, Funktionsweise | blueprint, paper | Diagramme, Archiv- oder KI-Standbilder | Karten, Zähler, Stiftmarkierungen, Karten |
| Technik, Weltraum, Trailer | night | Screenshots, Renderings, KI-Standbilder | Große Schrift, Zähler, Routen, Karten |
Mischen Sie frei: Die Looks sind eine Tafel und ein Finish, und jedes Objekt funktioniert auf jedem Look. references/story.md enthält eine Story-Struktur für jede Art.
Die Regeln
- Ein Held pro Zeile. Jede Erzählzeile hat genau eine Sache, auf die die Kamera gerichtet ist. Das Spotlight dimmt alles andere.
- Treffer landen auf dem gesprochenen Wort. Ein Stempel knallt auf "angeklagt", nicht am Zeilenanfang. Timen Sie alles mit
doc.W(line, "word"). - Zeigen Sie eine Phrase auf eine Weise. Entweder tippen Sie sie auf den Bildschirm oder zeigen sie auf einem echten Dokument, niemals beides. Fließtext auf Dokumenten ist graue Zeilen, niemals Füllwörter.
- Die Zeit bewegt sich nach der Eröffnung nur vorwärts. Ein kalter Einstieg darf nach vorne springen. Nach einer Überleitungszeile ("Vier Jahre zuvor…") bewegt sich die Erzählzeit nur noch vorwärts.
- Schrift, die man auf einem Telefon in einer Sekunde lesen kann. Große, komprimierte Versalien. Ein getipptes Etikett auf dem Bildschirm sollte etwa 3 % oder mehr der Bildhöhe einnehmen.
- Weniger ist mehr. Fäden verblassen nach ihrem Beat, und alte Objekte werden gedimmt. Der letzte Rückzug sollte komponiert aussehen, nicht überladen.
- Nichts erfunden, das echt aussieht. Echte Fotos und Dokumente erhalten Quellenangaben. Ein in Code gezeichnetes Dokument wird als Rekonstruktion gekennzeichnet und zitiert nur Wörter, die wirklich geschrieben wurden. KI-Bilder sind zur Illustration in Ordnung, aber niemals als Beweis für ein reales Ereignis oder eine reale Person.
Arbeitsablauf
Halten Sie für die vier Tore (markiert als Gate) für die Zustimmung des Benutzers an.
- Story. Recherchieren, dann
script.jsonschreiben: Takes (Abschnitte) von Zeilen, jede mittext,spoken(Zahlen als Wörter),heroundtyped. Notieren Sie Fakten daneben. 60 bis 90 Sekunden entsprechen etwa 150 bis 230 Wörtern. Details finden Sie inreferences/story.md. - Beat-Tabelle. Führen Sie
scripts/make_beats.pyaus und beheben Sie jede Lint-Warnung. Gate: Der Benutzer genehmigtbeats.md, einschließlich der Fakten. - Bilder. Listen Sie jedes Bild in
photos.jsonauf: seine ID, Art und woher es kommt.- Archivbilder:
fetch_commons.py search,categoryundget. - Eigene Dateien des Benutzers: Legen Sie sie in
<projekt>/assets/photos/ab. - KI-Standbilder: Generieren Sie sie in einem Stil (die
motion-assets-Fähigkeit plant und kalkuliert sie). references/archive.mdbehandelt andere Archive und die Rechte-Regeln.
- Archivbilder:
- Rohstimme. Führen Sie
tts_say.py, dannsplit_takes.py, dannbuild_narration.pyaus. Hören Sie sich jede Zeile an, diesplit_takes.pymarkiert. Jetzt sind die Timings real. - Assets. Führen Sie
make_map.pyaus, wenn die Geschichte Orte bereist, dannprep_assets.py. - Szene. Schreiben Sie
scene.py: Ordnen Sie die Tafel in Clustern pro Abschnitt an, fügen Sie Objekte zudoc.L/doc.W-Zeiten hinzu, dann Kamera- und Spotlight-Keyframes (film.shot). Lesen Siereferences/film.md. Beide ausgelieferten Projekte zeigen die Muster:assets/template/scene.py(Erklärfilm, Studio-Look) undassets/wright-flyer/scene.py(Dokumentation, alle Objekttypen). - Look-Test. Führen Sie
render.py --probefür ein Standbild pro Zeile bei 1280x720 aus und betrachten Sie alle, dann--stripfür jede große Kamerafahrt. Gate: Zeigen Sie dem Benutzer Standbilder der Eröffnung und des Looks. - Entwurf. Rendern Sie die ersten 30 Sekunden bei 1280x720 mit der Rohstimme. Gate: Der Benutzer schaut es sich an.
- Endgültige Stimme. Nehmen Sie es mit einer beliebigen TTS oder einer Person auf (
references/voice.md). Führen Sie Split, Build und erneute Probes durch; nichts an der Szene ändert sich. - Sound. Führen Sie
render.py --cues, dannbuild_sfx.py, dannmix_soundtrack.pyaus, fügen Sie bei Bedarf eine Musik hinzu. Lesen Siereferences/sound.md. - Fertigstellung. Führen Sie das vollständige Rendering durch, dann
burn_captions.pyund die SRT. Lesen Siereferences/performance.md, bevor Sie in 1440p oder 4K rendern. Übergeben Siecredits.mdzusammen mit dem Film.
Selbstüberprüfung, jedes Mal
Schauen Sie sich die Standbilder an, bevor Sie behaupten, dass etwas funktioniert. Dies sind die Fehler, die aufgetreten sind, alle in einem echten Rendering:
- Dunkle Tinte auf einer dunklen Tafel: unsichtbar. Verwenden Sie helle Schrift auf dunklen Looks oder
bar_h=0.92für einen vollflächigen Etikettenhintergrund hinter dunkler Schrift. - Die Kamera bewegte sich, aber das Spotlight blieb zurück, was zu einem dunklen Bild führte. Verwenden Sie
film.shot(), es sei denn, sie sollen sich trennen. - Kartenmaßstab zu klein: Eine ganze Küste kleiner als ein Foto. Wählen Sie
Kso, dass jeder Ort mit Abzügen seinen eigenen Raum bekommt (references/film.md). - Kartenbeschriftungen kollidieren. Setzen Sie die Beschriftung auf die Seite weg von ihrem Nachbarn.
- Ein Cluster überlappt den Kartenrand. Halten Sie Cluster entweder auf der Karte oder deutlich außerhalb.
- Hervorhebungen ein paar Pixel neben ihren Wörtern. Verwenden Sie
PaperDoc.phrase_spans, unddoc.on(print, fx, fy)mit Brüchen, die von einem Raster-Overlay des Bildes abgelesen werden.
Ausgelieferte Projekte
assets/template/: "From Cherry to Cup", ein 25-sekündiger Erklärfilm im Studio-Look, bestehend aus Karten, Pfeilen und einem Zähler, ohne Bilder.new_project.py my-filmkopiert es. Geben Sie ihm eine Rohstimme und es rendert.assets/wright-flyer/: "Twelve Seconds", eine 90-sekündige Dokumentation über den ersten Flug und den 50.000-Dollar-Rivalen, der zweimal abstürzte. Sie verwendet sieben gemeinfreie Fotos, die US-Karte, zwei gesetzte Dokumente und jeden Objekttyp.
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
Verwandte Fähigkeiten
Aus Open 3D Skills: motion-assets plant und kalkuliert KI-Standbilder, wenn ein Film Illustrationen benötigt, und frame-capture zeichnet Webseiten auf, anstatt codegezeichnete Filme zu verwenden.