Programmatisches Erklärvideo
Umgebung
- Manim installieren:
uv tool install manim. Falls pycairo „pkg-config“ nicht findet, zuerstbrew install pkgconfausführen. - Sprachausgabe und Transkription mittels MiniMax-Befehlszeilentool
mmx. Installation:npm install -g mmx-cli, dann mitmmx auth login --api-key <Ihr MiniMax API-Key>anmelden. Fallsmmx„nicht angemeldet“ oder „Kontoguthaben unzureichend“ meldet, den Benutzer benachrichtigen und anhalten. contact_sheet.pybenötigt Pillow aus dem System-Python sowieffmpegundffprobe(brew install ffmpeg).- macOS verwendet standardmäßig PingFang SC. Unter Linux zuerst eine chinesische Schriftart installieren, z. B.
fonts-noto-cjk(Debian/Ubuntu). Die Basisklasse prüft die Verfügbarkeit der Schriftart und bricht bei Fehlen ab. Benutzerdefinierte Schriftarten werden überEXPLAINER_CN_FONTundEXPLAINER_EN_FONTfestgelegt; die Schriftart muss alle im Text vorkommenden Zeichen unterstützen. Für andere Systeme Manim, Pillow und FFmpeg mit dem entsprechenden Paketmanager installieren. - Die meisten 3Blue1Brown-Beispiele im Netz nutzen
manimlib; deren API unterscheidet sich von Manim Community – nicht direkt übernehmen. scripts/dieses Skills:gen_audio.py: Erzeugt Sprachausgabe und wortgenaue Zeitstempel.explainer_base.py: Szenenbasisklasse, Untertitelaufteilung, Timing, Layout und Bereinigung.contact_sheet.py: Erstellt Kontaktabzüge aus Animationsknoten und längsten Untertiteln pro Segment, priorisiert zweizeilige Untertitel.verify_video.py: Prüft Schriftzeichen, Audiospur-Zeiten und Dekodierung des fertigen Videos.test_subtitles.py: Reproduziert alte Fehler mit echtem Manim-Rendering und verifiziert Untertitel-Regressionen.
Ablauf
Das Projektverzeichnis liegt unter ~/video-studio/explainers/<Thema>/.
- Gliederung schreiben. Nach dem Schema „Problemstellung → konkretes Beispiel → wie sich das Beispiel verändert → allgemeine Regel → neues Beispiel zur Überprüfung → Beantwortung der Eingangsfrage“ in 5 bis 10 Abschnitte unterteilen, jeder Abschnitt behandelt nur einen Punkt. Falls die Gesamtlänge 3 Minuten überschreitet, die Gliederung zuerst vom Benutzer bestätigen lassen.
narration.jsonerstellen. Schlüssel sind die Abschnittsnamen (s1,s2, …), Werte der Sprechertext. Den Sprechertext in gesprochener Sprache, kurzen Sätzen und einem Gedanken pro Satz verfassen. Falls das Skillchinese-writing-styleinstalliert ist, danach richten; 3 bis 6 Sätze pro Abschnitt. Wenn TTS ein bestimmtes englisches Wort oder eine Abkürzung falsch aussprechen könnte, den Wert als{"text": "Text für Bildschirm und Ausrichtung", "tts": "Aussprache für TTS"}angeben.python3 <skill>/scripts/gen_audio.py <Projektverzeichnis>ausführen. Standardstimme für Erklärtexte istChinese (Mandarin)_Warm_Girl. Jahreszahlen, Daten und andere Zahlen inttsin chinesischer Lesart angeben;textbehält arabische Ziffern auf dem Bildschirm. Nur bestimmte Abschnitte neu erstellen mit--only s3,s5. Falls die Ausgabe „Transkript und Sprechertext stimmen nicht überein“ lautet, prüfen, ob TTS ein Schlüsselwort falsch gelesen hat. Falls ja,ttsdes betreffenden Abschnitts korrigieren und mit--onlywiederholen. Fehlende Wortzeitstempel vorher durch Transkription ergänzen; Untertitel dürfen nicht nach Zeichenanzahl pro Abschnitt geschätzt und dann ausgeliefert werden.- Gemeinsame
scripts/explainer_base.pyper symbolischem Link einbinden, dannscene.pyschreiben. Bei bestehenden Projekten zuerst lokale Untertitel-Implementierungen sowiestart/finish-Überschreibungen entfernen, die Bildlogik beibehalten, dann alte Basisklasse sichern und durch den Link ersetzen. Das Projekt enthält nur die erklärenden Szenen; die Untertitel werden von der Basisklasse einheitlich generiert. - Im Projektverzeichnis
manim -ql --disable_caching scene.py <Klassenname>ausführen. Bei Fehler „Bild hinkt hinterher“ dierun_timeder entsprechenden Animation verkürzen oder die Animation entfernen und neu rendern. python3 <skill>/scripts/contact_sheet.py <Vorschauvideodatei> <Projektverzeichnis>ausführen und jede Zusammenstellung prüfen. Auf Untertitellayout, Überlappungen und Pfeilrichtungen achten. Zeitlich geschätzte Animationsphrasen anhand der vorherigen und nächsten Zeichenzeit inaudio/<Abschnittsname>.words.jsonüberprüfen.manim --resolution 1920,1080 --frame_rate 30 --disable_caching scene.py <Klassenname>ausführen.-qherzeugt 60 fps – nicht verwenden. Mit dem Python-Interpreter, in dem Manim installiert ist,<skill>/scripts/verify_video.py <Fertiges Video> <Projektverzeichnis>ausführen. Der zuuv tool install manimgehörende Interpreter ist$(uv tool dir)/manim/bin/python.- Der Prüfbefehl muss mit Exit-Code 0 beenden und
qa/video-check.jsonmuss"passed": trueenthalten. Bei Fehlern in Zeichen, Audiospur-Zeiten oder Untertitelpositionierung den Bericht, Screenshots und die zugehörigewords.jsonprüfen, korrigieren und neu rendern/validieren. Geschätzte Untertitel dürfen nicht allein auf Basis von Screenshots freigegeben werden. - Nach bestandener Prüfung die Datei als
<Thema>-Erklaerung.mp4kopieren, den Pfad dem Benutzer mitteilen und, falls die Umgebung Dateien versenden kann, direkt senden. Die Low-Res-Vorschau untermedia/löschen.
Szenen-Code
from explainer_base import *
class Thema(ExplainerScene):
def s1(self):
self.start("s1") # Sprachausgabe abspielen und synchron Untertitel anzeigen
titel = cn("Lernrate", 60, HI)
self.play(Write(titel))
self.until("Lernrate zu klein") # Warten, bis der Sprecher diese Phrase erreicht
self.play(titel.animate.to_edge(UP))
self.finish() # Warten, bis Sprachausgabe beendet, Untertitel löschen und Szene ausblenden
- Jeder Abschnitt erhält eine Methode mit dem gleichen Namen wie der Abschnitt.
start,finishoder den Untertitel-Updater nicht im Projekt überschreiben. Falls der Benutzer explizit keine Untertitel wünscht, die KlassenattributSUBTITLES = Falsesetzen.- Szenenwechsel innerhalb eines Abschnitts: nur die selbst erstellten Objekte ausblenden oder entfernen, die Basisklassen-Untertitel erhalten. Nicht
self.mobjectskomplett leeren oderself.clear()aufrufen. - Die Phrase in
untilmuss exakt imtextdes zugehörigen Abschnitts vorkommen und zwar genau einmal. - Chinesisch mit
cn(), Englisch miten(). Schriftgröße nicht kleiner als 22. - Nur die 4 Farben der Basisklasse verwenden:
MAINHauptfarbe,HIHervorhebung,OKrichtig,BADfalsch. Eine Farbe behält ihre Bedeutung im gesamten Video bei. - Maximal 3 Elementgruppen pro Bildschirm. Vor neuen Inhalten zuerst die nicht mehr besprochenen Inhalte ausblenden.
- Die unteren 20 % des Bildschirms sind für Untertitel reserviert; Diagramme und Erklärungstext oberhalb dieses Bereichs platzieren.
- Das gerade besprochene Objekt erscheint, ändert seine Farbe oder bewegt sich.
Häufige Fallstricke
- Nach Änderungen am gemeinsamen Untertitel-Code
test_subtitles.pymit dem Python-Interpreter ausführen, in dem Manim installiert ist. Es muss Tests für echte Wartezeiten, Abschnittswechsel, zweizeilige Untertitel, wiederholte Kurzphrasen, Seitenumbrüche bei langen Sätzen und unterschiedliche Aussprache bestehen. Das manuelle Setzen vonrenderer.timeund Aufrufen des Updaters allein kann das statische Warteverhalten von Manim nicht validieren. Textführt keinen automatischen Zeilenumbruch durch; bei langen Sätzen\nfür Zeilenumbrüche verwenden.- Text, der in einen Rahmen gesetzt wird, mit
fit(Text, Rahmenbreite * 0.8)begrenzen. - Beim Durchstreichen von Optionen mit
Crossnur den Text kreuzen, nicht den Pfeil; den Pfeil stattdessen aufBAD-Farbe setzen. - Um einzelne Wörter in einem Satz einzufärben,
Text(..., t2c={"Wort": Farbe})verwenden.