Filmische Wissenschaftskurzfilme · Einheitlicher Produktionsstandard v1
Quelle: „Eine kurze Geschichte der Menschheit · Selbstporträt des Universums“ (4K / 4'58" / 14 Szenen) und „Abwärts · DESCENT“ (2K / 1'30" / 90 Sekunden vertikales Profil). Die Spezifikationen, Workflows, Stilrichtungen und die gemachten Fehler beider Filme sind hier vollständig dokumentiert. Lies vor einem neuen Film zuerst die Abschnitte 0 und 1, dann die für das aktuelle Projekt relevanten Kapitel.
0. Eiserne Regeln (Verstoß gegen eine führt zu Nacharbeit)
- Zuerst den Ton, dann das Bild. Erzeuge den Sprechertext Satz für Satz → miss die Dauer → leite daraus die Bildanzahl pro Szene ab. Niemals zuerst das Bild arrangieren und dann die Sprachaufnahme machen.
- Sprechertext und Daten müssen übereinstimmen: Die im Film vorkommenden Zahlen, Einheiten und Größenordnungen müssen mit der Faktenliste abgeglichen werden. Wenn der Sprechertext 98 sagt, darf das Bild nicht 90 schreiben. Einheitenfehler (z. B. Druck atm ↔ t/m²) sind zehnmal schwerwiegender als Farbfehler.
- Eine Einstellung, eine Information: Jede Szene hat nur eine Hauptthese + maximal 3 Messwerte; zusätzliche Informationen gehören in den Sprechertext.
- Text muss immer lesbar sein: Unter jedem Text muss ein Hintergrund oder eine Abdunkelung sein. Titel ≥ 30px, Messwerte ≥ 13px. Die Deckkraft von kleinem Text mindestens 0,6.
- Keine harten Schnitte: Zwischen Szenen werden Überblendungen / schwarze Atempausen / kontinuierliche Bewegungen verwendet. Ein Film verwendet nur eine Übergangssprache.
- Stumm rendern:
<Audio>in Remotion grundsätzlich mit{false && ...}deaktivieren. Die Audiospur wird extern mit ffmpeg eingefügt (lange WAVs lassen das Rendern in der Audio-Vorverarbeitung hängen). - Vor dem Rendern muss
npx tsc --noEmitsauber sein, sonst rendert man eine Reihe fehlerhafter Bilder und muss von vorne beginnen. - Drei Prüfungen vor der Auslieferung: Gesamtlänge prüfen, erste und letzte Bilder prüfen, kritische Übergänge Bild für Bild prüfen (jeweils 3–6 Bilder).
1. Standard-Pipeline (Reihenfolge einhalten, keine Schritte überspringen)
script.json ──► VO-Erstellung ──► VO-Nachbearbeitung ──► Dauertabelle ──► Zeitachse
│
└──► Filmmusik (numpy) ──► Mix ──► master.m4a
Bild (Remotion) ──► Stumm rendern ──► ffmpeg mux ──► Auslieferung
1.1 Drehbuch
- Pro Film eine Datei:
script.json, Felderid / act / text / caption. - Chinesischer Sprechertext ≈ 4,2 Zeichen/Sekunde; 60-Sekunden-Film ≈ 200–230 Zeichen, 90 Sekunden ≈ 300–340 Zeichen.
- Zahlen in chinesischer Lesung schreiben („dreitausendsechshundertachtundachtzig“), sonst liest TTS sie falsch; im Bild werden dann arabische Ziffern verwendet.
1.2 Sprechertext (Qwen3-TTS VoiceDesign, männliche Erzählstimme)
INSTRUCT = ("Eine tiefe, ruhige, autoritative männliche Dokumentarstimme. Langsam, bedacht, filmisch. "
"Tiefe Lage, warm, intim, zurückhaltende Emotion, Nahbesprechung. Gleichmäßiges, gleichbleibendes Tempo. Mandarin-Chinesisch.")
generate_audio(text=..., model=model, lang_code="zh", instruct=INSTRUCT,
temperature=0.65, top_p=0.9, repetition_penalty=1.05,
output_path="vo_raw", file_prefix=id)
- Modell
mlx-community/Qwen3-TTS-12Hz-1.7B-VoiceDesign-bf16,mx.random.seed(11)fest. - Nach jeder Erstellung sofort die Dauer mit
ffprobeprüfen: Wenn eine Datei > 30 Sekunden ist oder sich ganze Abschnitte wiederholen, hat TTS nachgelassen – Datei löschen und neu erstellen (Seed ändern oderrepetition_penaltyauf 1,12 erhöhen). - ASR-Gegenkontrolle: Mit
mlx_whispertranskribieren und Zahlen/seltene Schriftzeichen prüfen (z. B. Wasserstoff → Qing, Silizium → Gui, Eisen → Ti).
1.3 Sprachnachbearbeitung (einheitliche Kette, keine Abweichungen pro Datei)
highpass=f=70,
asetrate=24000*0.912341, aresample=48000, atempo=1.096081, atempo=1.055,
equalizer=f=190:t=q:w=1.0:g=1.4, equalizer=f=3300:t=q:w=1.4:g=-1.8, equalizer=f=7200:t=q:w=1.8:g=-1.0,
acompressor=threshold=0.14:ratio=2.2:attack=10:release=200,
loudnorm=I=-20:TP=-3:LRA=7
Anschließend Stille am Anfang und Ende anhand der 20-ms-Energiehüllkurve abschneiden, Pausen über 0,34 s auf 0,34 s reduzieren und mit 12 ms / 50 ms Ein-/Ausblenden versehen.
1.4 Zeitachse
frames = round(seconds * 24); Sprechertext-Versatz = Szenenstart + Lead (normalerweise 18–24 Bilder).- Pro Szene:
lead + vo + tail, tail 16–90 Bilder (genügend Platz für das Ende). timeline.tsgenerieren (automatisch, nicht manuell bearbeiten), Felder{ id, from, dur, voAt, voDur }.
1.5 Filmmusik (rein codegeneriert, numpy)
- Soll Struktur haben, nicht durchgehend sein: Nach Zeitcode „Ereignisse“ schreiben, nicht eine durchgehende Pad-Spur.
- Harmonien: Alle 12–18 Sekunden wechseln, an den Übergängen überblenden. Nur kontinuierliche Töne über 55 Hz im Bass.
- Kein tieffrequentes Dröhnen: Zuschauer beschreiben es als „Wummeln“ oder „zu laut“. Bass bei 85–100 Hz abschneiden, lange Töne reine Sinuswelle ohne Oktav-Obertöne.
- Ruhe priorisieren: Musikpegel ≈ −20 ~ −27 dB relativ zum Sprechertext; wenn der Sprechertext einsetzt, die Musik um 40–70% absenken (Sidechain-Ducking).
- Endgültige Lautstärke: Dokumentation −18 ~ −24 LUFS (nicht −14, das ist für Streaming-Popmusik).
- Tutorial-artige „Soundeffekte“ (Eintauch-Geräusch, Sonar, metallisches Quietschen) nur auf ausdrücklichen Kundenwunsch hinzufügen; wurden bereits einmal abgelehnt, standardmäßig nicht verwenden.
1.6 Bild (Remotion)
Siehe Abschnitt 2.
1.7 Rendern und Zusammenführen
npx tsc --noEmit
npx remotion render Film4K out/silent.mp4 --codec=h264 --crf=18 --concurrency=7
ffmpeg -i out/silent.mp4 -i public/audio/master.m4a \
-map 0:v -map 1:a -c:v copy -c:a aac -b:a 320k -shortest -movflags +faststart out/final.mp4
- 4K = 1920×1080 Layout +
transform: scale(2); 2K =scale(2560/1920). Nur ein Layout schreiben. - Lokale Nacharbeit: Nur den betroffenen Bildbereich neu rendern →
ffmpegtrim/concatfür drei Segmente →-c:v copynur die Tonspur ersetzen; wenn das Bild geändert werden muss, die drei Segmente neu encodieren und zusammenfügen (ca. 5–10 Minuten).
2. Visuelles System
2.1 Hintergrund
- Leinwand 1920×1080, 24 fps;
AbsoluteFillmit nahezu schwarzem Hintergrund (#01050A/#010407), niemals reines Schwarz #000. - Dreischichtige Struktur: Hintergrund-Verlauf → Volumenlicht/Partikel → Informationsebene (Text, Tiefenmaßstab, Messwerte).
- Einheitlicher Abschluss:
Vignette+ statischesGrain(0.04, mussanimate={false}sein, dynamisches Korn lässt feine Linien flimmern).
2.2 Schriftarten
- Titel/Gedichte:
Songti SC(Serife), Zeichenabstand 0,4–0,6 em, große Schriftgröße (90–250 px). - Daten/Messwerte:
SF Mono, 8–14 px, Zeichenabstand 0,16–0,36 em. - Erläuterungen:
PingFang SC, 14–19 px, Deckkraft 0,55–0,7.
2.3 Farbabstimmung (die „Weltanschauungsfarben“ der beiden Filme)
| Filmtyp | Oben hell | Mitte | Unten | Akzentfarbe |
|---|---|---|---|---|
| Kosmos / Zeit | #050506 Hintergrund | Creme #F3E7D0 | — | Bernstein #E8B06A |
| Ozean / Tiefe | #1E7C93 Wasseroberfläche | #07232E | #01050A | Cyan #4FE0C0 |
Regel: Ein Film verwendet nur eine Akzentfarbe; Ausnahmen wie Biolumineszenz / Hydrothermale Quellen maximal zwei, jede an eine physikalische Größe gebunden.
2.4 Partikel-Engine (Canvas 2D)
- Deterministischer Zufall (Hash), gleicher Frame immer gleiches Ergebnis; Wolkentypen:
ball / filament / disk / globe-surface / sphere-shell / figure / city / helix / neuron / glyph / single / text / timeline. - Zweimal zeichnen: zuerst großer Radius, niedrige Deckkraft für Leuchten, dann kleiner Radius, hohe Deckkraft für den Kern;
globalCompositeOperation = 'lighter'. - Punktwolkengrenzen müssen außerhalb des Bildes liegen:
makeCloud('text', n)erzeugt eine 3×1,2-Box, die nach Projektion rechteckige Ränder zeigt (der häufigste von Zuschauern gemeldete Bug). Mitexpand(cloud, kx, ky, kz)um den Faktor 2,4–3,2 vergrößern.
2.5 Lebewesen und Gelände (SVG)
- Alle seitlich, Kopf in Bewegungsrichtung; Augen, Flossen, Maulinie, Kehlfalten, Seepocken usw. mindestens 4 anatomische Details, sonst sieht es aus wie eine Textur.
- Silhouette + Randlicht (0,2–0,35 Deckkraft); kein
feTurbulenceauf dem Körper verwenden (sieht sonst wie Granit aus). - Gelände: Mehrere Polylinien + Gesteinsschichten + Schutt + Sedimente, keine Dreiecke; Berg keine Basislinie zeichnen (sieht sonst wie ein Diagramm aus).
- Auftreten von Lebewesen an „Tiefe/Zeit“ binden, nicht mehr als drei Arten gleichzeitig zeigen.
2.6 Informationsebene (HUD)
- Schicht-Namensschild: Dunkler Farbverlaufshintergrund (0,72→0) + linker 2px Akzentfarbbalken + Chinesisch 30–35 px reines Weiß.
- Messwerte: Pro Schicht 2–3 Gruppen,
LABEL8,5 px /VALUE13–14,5 px. - Skalenbalken: Skalenstriche + aktueller Wert fett; aktueller Wert muss in Echtzeit berechnet werden, nicht hartcodiert (sonst Widerspruch zum Zeiger).
- Alle Zahlen mit Einheiten; Einheiten durch Leerzeichen getrennt („1.093 atm“).
2.7 Übergänge
- Erste Wahl: Durchgehende Bewegung (One-Shot): Tiefe/Zeit ist eine kontinuierliche Größe, der Inhalt bewegt sich mit ihr ins und aus dem Bild.
- Zweite Wahl: Kurze Überblendung (4–6 Bilder, nur die neue Einstellung blende ein, die alte bleibt deckend und wird überlagert) – Helligkeit bricht nicht ein, HUD überlappt nicht.
- Vermeiden: Diagonaler Lichtwischer, lange Kreuzblenden, vertikale Schübe (legen dunkle Kanten frei), harter Schnitt nach Schwarz (außer bei physisch motivierten Ereignissen wie „Eintauchen ins Wasser“).
3. Fakten und Daten
- Eine Datei
facts.mderstellen: Jeder Eintrag mitZahl / Einheit / Quellenbereich / Wie im Film verwendet. - Drei häufigste Fehlerquellen: ① Einheitenumrechnung (1 atm ≈ 10,3 t/m² ≈ 1,03 kgf/cm²); ② Verwechslung von „Durchschnitt“ und „Extremwert“ (durchschnittlich 3.688 m vs. tiefster Punkt 10.935 m); ③ Vereinfachte Darstellung (90 vs. 98 Elemente).
- Im gesamten Film eine einheitliche, präzise Version verwenden; Sprechertext und Bild müssen aus derselben Quelle stammen.
4. Auslieferungspaketliste
deliverables/
Filmname-4K-Sprecher.mp4 # Hauptversion
Filmname-4K-Reine-Musik.mp4 # Bei Bedarf
Poster-4K.png / Vorschau-4K.png # Keyframe-Composition
Cover/ # 1920 PNG + 4K PNG + 1146×717 JPG
Regieanmerkungen.md # Struktur, Ton, Änderungsprotokoll
Veröffentlichungstext-Bilibili.md # Titel/Beschreibung/Tags/Pinnkommentar/Cover-Vorschlag
Fakten.md
Veröffentlichungspaket muss enthalten: KI-Erstellungs-Hinweis, Aufteilung der Arbeit (was das Modell gemacht hat, was der Mensch), eine Version der „leicht zu übersehenden Zahlen“ als Pinnkommentar.
5. Fehlerprotokoll (nach Häufigkeit sortiert)
| Phänomen | Grundursache | Reparaturmethode |
|---|---|---|
| Rendern bleibt in Audio-Vorverarbeitung hängen | Lange WAV + <Audio> | Stumm rendern, extern muxen |
| Text auf Partikeln verschwommen | Kein Hintergrund + Deckkraft 0,4–0,5 | Hintergrund + reines Weiß + Schriftgröße erhöhen |
| Regelmäßige Rechtecke im Bild (Zuschauer fragen am häufigsten) | Punktwolken-Box-Grenze im Bild | expand() um Faktor 2,4–3,2 vergrößern |
| Feine Linien / Berge flimmern | Dynamisches Filmkorn | Grain animate={false} |
| Wal / Fisch „schwimmt rückwärts“ | Kopf und Schwanz vertauscht, Auge am Schwanz | Seitenansicht neu erstellen: Kopf in +x-Richtung |
| Berge sehen aus wie Diagramm | Pfad mit L ... Z horizontale Basislinie abgeschlossen | Unterkante aus dem Bild ragen lassen |
| Übergang unterbricht Blick | Lichtwischer / lange Blende | Kurze Überblendung oder durchgehende Bewegung |
| Filmmusik „dröhnt“ | Dauerhafter Bass 27–80 Hz | Hochpass 85–100 Hz, Sub-Drone entfernen |
| Audio-Desynchronisation | Bild-takt nicht auf Sprechertext-Inhalt abgestimmt | Tiefen-/Zeitkurve nach Sprechertext-Inhalt neu anordnen |
| TTS-Einzeldatei 600 s | Modelldegenerationsschleife | Löschen und neu erstellen, repetition_penalty 1,12 |
| 4K-Nacharbeit zu langsam | Kompletter Film neu rendern | Nur geänderte Bildbereiche rendern + concat |
6. Position der beiden Referenzfilme
- „Eine kurze Geschichte der Menschheit · Selbstporträt des Universums“:
~/dsh-video-remotion/film/src/scenes/*, 14 Szenen, 4K, 4'58". - „Abwärts · DESCENT“:
~/dsh-video-remotion/film/src/ocean/*, 6 Schichten, 2K, 1'30"; Sprechertext und Filmmusik in~/dsh-video-remotion/ocean/. - Beide teilen
src/engine/particles.tsx(Partikel),src/engine/atmos.tsx(Vignette/Grain),src/theme.ts(Schriftarten/Farbabstimmung/Animation).