Komplette Erstellung einer Erklärvideoserie
Aus einem „Thema“ wird eine „fertige Episode“: Planung → Seitenlayout (HTML-Animation) → Skript → Sprachaufnahme → Untertitel → 1080p MP4 → Douyin-Cover (Quer 16:9 + Hoch 9:16). Das Standard-Style-Archiv stammt aus der Praxis der Erklärvideoserie zum „Daodejing“ (neochinesische Tuschemalerei / männliche Stimme Yunjian / weiße Schrift mit schwarzem Leuchtrand). Die gesamte Vorlage ist wiederverwendbar und Punkt für Punkt überschreibbar.
Bildroute (Standard ab v2.0: HTML-Animation; v2.1: Text-Bild-Kooperation):
- Standard: HTML-Animationsseite – Generiert eine HTML-Präsentationsseite mit Eingangsanimationen und Seitenübergängen (Crossfade) basierend auf dem Sprechertext. Deterministisches Rendern Bild für Bild in ein Video. Die Animation ist zu 100% synchron mit dem fertigen Video (Details und Layoutregeln siehe
references/html-animation.md). - v2.1 Text-Bild-Kooperation: Integrierte SVG-Tuscheszenenbibliothek (Wasserwellen/Einsames Boot/Wellen/Berge/Tuschbambus/Mond betrachten/Koi) + Symbole für Aufzählungspunkte + Unterstützung für externe Bilder. Automatische Zuordnung basierend auf dem Sprechertext oder explizite Angabe. Grafikelemente werden zeitlich versetzt eingeblendet und zusammen mit Textanimationen einheitlich arrangiert.
- Rückfall: Statische PPT-Folien + xfade (wenn native PPT-Tabellen/komplexe Layouts benötigt werden oder der Benutzer explizit eine .pptx-Datei wünscht).
Ab v2.3 Standardmäßig Douyin-Cover pro Episode: Querformat 16:9 + Hochformat 9:16. KI-generiertes Set basierend auf dem Thema (Querformat-Ankerpunkt → Benutzerbestätigung → Hochformat abgeleitet). Es werden keine Videoframes verwendet. Der Ablauf ist in Phase ⑥ und in references/douyin-covers.md beschrieben.
Fünf Startfragen (Jede Episode vor Beginn stellen; wenn der Benutzer „wie letztes Mal“ oder „wie gehabt“ sagt, werden alle Standardwerte übernommen und direkt gestartet)
- Worum geht es in dieser Episode? (Thema / Kapitel des klassischen Textes)
- Inhaltstiefe: Detaillierte Erklärung / Zusammenfassung der Kernpunkte? (Standard: Detaillierte Erklärung)
- Zielvideolänge? (Standard: 6-7 Minuten)
- Soll der PPT-Stil der neochinesischen Tuschemalerei beibehalten werden? (Standard: Ja)
- Soll die Stimme Yunjian und die Untertitel (weiße Schrift mit schwarzem Leuchtrand) beibehalten werden? (Standard: Ja)
Style-Archiv (Wird direkt übernommen, wenn der Benutzer keine Angaben macht)
| Punkt | Standardwert |
|---|---|
| PPT-Stil | Neochinesische Tuschemalerei: Reispapier-Elfenbein + Tintenschwarz + Dunkelblaugrün + Zinnoberrot |
| Schriftart | Titel SimSun (Song-Schriftart), Fließtext Microsoft YaHei (SlideDSL verwendet ausschließlich englische font-family) |
| Bildelemente | SVG-Tuscheillustrationen (keine KI-Bildgenerierung, 100% Originaltreue, beliebig oft änderbar) |
| Animation | HTML-Animationsseite: Titel blur-in / Aufzählungspunkte zeitversetzt fade-up / Seitenübergang Crossfade / cue-Punkt-Hervorhebung (Der Hinweis „Elementanimation wurde abgelehnt“ bezog sich auf den ffmpeg-Überlagerungsansatz; die deterministische HTML-Renderroute ist seit v2.0 validiert und umgesetzt) |
| Stimme | zh-CN-YunjianNeural (Yunjian · Männlich · Volltönend) |
| Sprechgeschwindigkeit | +0% (Einheitlich für die gesamte Episode; nur auf expliziten Wunsch des Benutzers ändern, nicht nach Inhaltsdichte segmentieren) |
| Untertitel | Weiße Schrift + schwarzer Außenleuchteffekt (blur 0.8), transparenter Hintergrund, unten zentriert |
| Bildformat | 1920×1080 (16:9) |
| Aussprachekorrektur | „老子“ → TTS liest „老紫“ (lǎo zǐ, literarische Lesart im dritten Ton), Untertitel zeigen weiterhin „老子“ |
| Douyin-Cover | Querformat 16:9 + Hochformat 9:16; Episodenname in großen Vier-Zeichen-Schriftzügen; KI-generiertes Set (Ankerpunktkette), keine Videoframes |
Arbeitsverzeichnis-Konvention
Erstelle im Arbeitsbereich ein Video-Arbeitsverzeichnis/. Jede Episode erhält ein eigenes Unterverzeichnis (benannt nach dem Thema):
Video-Arbeitsverzeichnis/{Episodenname}/
├── {BASE} Skript.json # Einzige Datenquelle: Titel/Stimme/Aussprachekorrektur/Sprechertext pro Seite (+ Seiteninhalt)
├── {BASE} Skript_bearbeitbar.txt # Exportiert von export_txt.py, zur Überprüfung durch den Benutzer im Editor
├── 01_deck/ # deck.html (Animationspräsentationsseite, Vorschau möglich) + deck.json (Timeline-Liste)
├── 01_html_frames/ # f_XXXXX.png Einzelframes + frames_manifest.json (HTML-Route)
├── 01_frames/ # frame_01.png ... (Rückfallroute mit statischen PPT-Folien)
├── 02_audio/ # slide_01.mp3 ... slide_NN.mp3 (Sprachaufnahmen pro Seite)
├── Sprachproben/ # MP3-Sprachproben für verschiedene Stimmen + Sprachproben-Auswahlseite.html
└── 03_output/ # Fertiges Video {BASE}(mit Untertiteln).mp4
BASE = Episodenname (wenn der Name „Skript“ enthält, wird es automatisch entfernt). Das Skript-JSON wird programmatisch mit Python json.dump erstellt. Das manuelle Schreiben von JSON mit chinesischen Anführungszeichen ist verboten (führt zu Escape-Fehlern).
Die Coverleinwand {Episodenname}-Douyin-Cover.miora wird gemäß den Spezifikationen für generierte Medien im Stammverzeichnis des Arbeitsbereichs abgelegt, die PNGs in beiden Formaten im Verzeichnis _assets/.
Phasenweiser Ablauf (mit 4 Bestätigungstoren, jedes Tor erfordert die Antwort des Benutzers, bevor es weitergeht)
Vor Arbeitsbeginn (bei Erstnutzung oder Umgebungsproblemen) zuerst den Umgebungscheck durchführen:
python scripts/doctor.py. Fehlende Komponenten (MISSING) ergänzen, dann starten. Rhythmus-Grundlinien, Tore-Liste, BGM und Änderungsumfangs-Tabelle siehereferences/pacing-and-gates.md. (Integriert Methodik von liyupi/ai-promo-video-maker: Harte Rhythmusstandards / Datenvalidierung / Zwei-Tore-System / Änderungsdisziplin).
Phase ① Inhaltsplanung (Tor 1: Fünf Startfragen)
Nach der Bestimmung des Plans durch die fünf Fragen wird ein kurzes Planungspaket erstellt (Textstruktur / visuelles Konzept / Audiokonzept). Nach Zustimmung des Benutzers geht es weiter zu Phase ②.
Phase ② Seitenlayout (HTML-Animationsroute = Standard)
- Kein PPT mehr: Direktes programmatisches Erstellen von
{BASE} Skript.json. Pro Seite wird der Sprechertext untertextgeschrieben. Pro Seite optional:title(Seitentitel),points(Array der Bildschirmeinträge),layout(title/bullets/quote/end),cues(Punkte-Hervorhebung, siehe unten) – Fehlen diese, werden sie automatisch aus dem Sprechertext abgeleitet (Regeln siehe references/html-animation.md), aber für die Produktion wird empfohlen, sie explizit anzugeben, um eine stabilere Qualität zu gewährleisten. - Die Seitenanzahl richtet sich nach der Inhaltstiefe (detaillierte Erklärung ca. 8 Seiten); Tabellen/Daten sollten weiterhin über die statische PPT-Rückfallroute laufen.
Phase ②′ PPT-Erstellung (Statische Rückfallroute)
- Mit workbuddy-pptx (SlideDSL) die Folien erstellen. Die Seitenanzahl richtet sich nach der Inhaltstiefe (detaillierte Erklärung ca. 8 Seiten).
- Sprechernotizen (notes) = Sprechertext pro Seite: Einmalig schreiben, mehrfach verwenden (Video-Sprachaufnahme / DOCX-Zeitachse / CapCut-Import).
- Schriftartnamen auf Englisch verwenden (SimSun / Microsoft YaHei), chinesische Namen werden nicht gerendert.
- Farben und Elemente gemäß Style-Archiv; Tabellen/Daten-Seiten bevorzugt mit nativen PPT-Elementen.
Phase ③ Skript-Finalisierung (Tor 2: Skriptprüfung)
-
Sprechertext aus den PPT-Notizen extrahieren, programmatisch
{BASE} Skript.jsonerstellen (Struktur siehe unten). -
Bearbeitbaren Text zur Überprüfung exportieren:
python scripts/export_txt.py "{BASE} Skript.json" -
Den Benutzer ausdrücklich auffordern, die txt-Datei im Editor zu öffnen und Seite für Seite zu überprüfen. Nachdem der Benutzer die Änderungen zurückgegeben hat, zurück in JSON synchronisieren:
python scripts/import_txt.py "{BASE} Skript.json" "{BASE} Skript_bearbeitbar.txt"Wenn der Benutzer nur mit „Text ok“ antwortet und keine Änderungen vornimmt, wird die Synchronisation übersprungen.
Phase ④ Sprachaufnahme (Tor 3: Sprachprobe, hartes Tor: voice_confirmed)
-
Eine Hörproben-Seite generieren, damit der Benutzer die Stimme auswählen kann:
python scripts/preview_voices.py Sprachproben -
Nach Auswahl des Benutzers die Stimme in das JSON schreiben und
voice_confirmed=truesetzen (Fehlt dieser Eintrag, verweigern TTS und Synthese die Ausführung):python -c "import json;p='{BASE} Skript.json';d=json.load(open(p,encoding='utf-8'));d['voice']='zh-CN-YunjianNeural';d['rate']='+0%';d['voice_confirmed']=True;json.dump(d,open(p,'w',encoding='utf-8'),ensure_ascii=False,indent=2)"Die Sprechgeschwindigkeit bleibt standardmäßig bei
+0%; nur wenn der Benutzer explizit eine Änderung wünscht, wird sie angepasst, und zwar einheitlich für die gesamte Episode.
Phase ⑤ Video-Synthese (Tor 4: Vor der Synthese den Benutzer zur Freigabe auffordern)
Reihenfolge: Sprachsynthese → Animationsseite generieren → Frames rendern → Video synthetisieren (HTML-Route); oder Frames rendern → Sprachaufnahme → Video (statische Route).
HTML-Animationsroute (Standard):
-
Sprachaufnahme pro Seite synthetisieren (Muss zuerst erfolgen – die Seitenlänge wird aus der tatsächlichen Sprachdauer ermittelt):
python scripts/tts_synth.py --narration "{BASE} Skript.json" --out 02_audio -
Animationspräsentationsseite generieren (deck.html kann im Browser mit
#previewzur Vorschau der Animation geöffnet werden):python scripts/gen_html_deck.py --narration "{BASE} Skript.json" --audio 02_audio --out 01_deck -
Einzelbild-Rendering (Nur das Animationsfenster rendern, in wenigen Minuten abgeschlossen):
node scripts/render_html_frames.mjs --deck 01_deck --out 01_html_frames -
Video synthetisieren (concat der Bildsequenz + satzweise Untertitel, Standardstil weiße Schrift + schwarzer Leuchteffekt):
python scripts/compose_html_video.py --deck 01_deck --frames 01_html_frames --audio 02_audio --narration "{BASE} Skript.json" --out 03_outputStandardmäßig wird
{BASE}(mit Untertiteln).mp4erstellt;--also-plainerstellt zusätzlich eine Version ohne Untertitel;--bgm <Datei>fügt Hintergrundmusik hinzu (automatisches Ducking, die Musik wird leiser, wenn der Sprecher spricht; Musikbibliothek Mixkit, kostenlos und kommerziell nutzbar, muss vom Benutzer vorher gehört und genehmigt werden).
Statische PPT-Rückfallroute:
-
Bildframes rendern (Bevorzugt PowerPoint COM, erfordert lokal installiertes PowerPoint):
powershell -ExecutionPolicy Bypass -File scripts/export_frames.ps1 -Pptx "{BASE}.pptx" -OutDir 01_framesWenn bereits ein PDF vorhanden ist, kann der pymupdf-Pfad verwendet werden:
python scripts/pdf_to_frames.py "{BASE}.pdf" 01_frames 1920. Nach dem Rendern 3 Seiten stichprobenartig prüfen (Titelseite / eine seitenreiche Seite / eine Tabelle), um sicherzustellen, dass keine Schriftprobleme auftreten. -
Sprachaufnahme pro Seite synthetisieren: Wie oben tts_synth.py.
-
Video synthetisieren (statische Seiten + xfade + satzweise Untertitel):
python scripts/compose_video.py --frames 01_frames --audio 02_audio --narration "{BASE} Skript.json" --out 03_output -
Abnahme der Lieferung: Stichprobenartige Überprüfung der Ein-/Übergangsframes auf korrekte Animation und fehlende schwarze Blitze; Stichproben aus der Seitenmitte zur Überprüfung der Untertitel; Video-Tor ausführen:
python scripts/verify_output.py --video "03_output/{BASE}(mit Untertiteln).mp4" --deck 01_deck(Spezifikation/Dauer/Lautstärke/schwarze Frames/Stille müssen alle bestanden werden, bevor ausgeliefert wird); Auslieferung mitpresent_files.
Phase ⑥ Douyin-Cover (Standard pro Episode: Querformat 16:9 + Hochformat 9:16)
Das Cover wird zusammen mit dem fertigen Video ausgeliefert, um ein direktes Hochladen auf Douyin zu ermöglichen. Es werden keine Videoframes verwendet – KI-generiertes Set basierend auf dem Thema der aktuellen Episode. Auslieferung von .miora-Leinwand + PNGs in beiden Formaten;
Prompt-Vorlagen / Bedeutungsverzeichnis / Qualitätscheckliste siehe references/douyin-covers.md. Wird übersprungen, wenn der Benutzer explizit kein Cover wünscht.
- Text: Der Episodenname in vier Zeichen ist der einzige große Text auf dem Bild (z.B. „有无相生“); keine Untertitel in kleiner Schrift (wird unscharf); außer dem Haupttext keine weiteren Zeichen auf dem Bild.
- Ankerpunktkette (harte Regel): Querformat-Ankerpunkt (reine Text-zu-Bild 1920×1080) → Benutzerbestätigung → Hochformat wird vom Ankerpunkt als Referenzbild abgeleitet (1080×1920, vertikale Dreiteilung); der Stil-Token wird aus dem Original wiederverwendet, es ist verboten, zwei Bilder blind zu versenden.
- Visuelles: Gleicher Stil wie das fertige Video (Reispapier-Elfenbein + Tintenschwarz + Dunkelblaugrün + Zinnoberrot, Tuscheverlauf, klare Leerräume); Bildsprache aus dem Thema der aktuellen Episode (z.B. „有无相生“ → Vollmond + Spiegelung des Mondes im Wasser).
- Maße exakt angeben: Das Modell rundet möglicherweise auf 1920×1072 / 1072×1920 (8px Differenz); dies genau melden; wenn der Benutzer genaue Maße wünscht, werden die Ränder auf die Standardwerte ergänzt.
- Auslieferung:
{Episodenname}-Douyin-Cover.mioraim Stammverzeichnis des Arbeitsbereichs + Bildkarten in beiden Formaten; Cover-Text und Maße inAnforderungsbestätigung.mdfesthalten.
(Für 100% kontrollierten Text oder wiederverwendbare Vorlagen über mehrere Episoden hinweg, wechsle zu bearbeitbarem Design-Layout-Export; standardmäßig KI-generiert.)
Phase ⑦ Feintuning und Iteration
- Pro Episode Verzeichnis
Anforderungsbestätigung.mdführen: Antworten auf die fünf Fragen + Aufzeichnung jeder Änderungsrunde (Benutzeroriginaltext archivieren). Nach Erhalt von Feedback zuerst notieren, dann ändern, nur die notwendigen Schritte wiederholen (Änderungsumfang → Tabelle der wiederholten Schritte siehereferences/pacing-and-gates.md). - Anpassung des Untertitelstils/der Farbe → siehe
references/subtitle-style.md(ASS-Farben sind BBGGRR umgekehrt, Lesen erforderlich). - Ausspracheprobleme → Nur
tts_replacementsändern, TTS + Synthese erneut ausführen, Untertitel bleiben unverändert. - Untertitelsynchronisation → compose liest bevorzugt
02_audio/timing_XX.json(reale satzweise TTS-Timeline, automatisch von tts_synth erstellt). - Probleme mit Bild/Animation (HTML-Route) → Titel/points/visual/cues im Skript-JSON oder die Anordnung in
gen_html_deck.pyändern → Deck neu generieren → Rendern → Synthese (Audio wird wiederverwendet, es sei denn, der Sprechertext wurde ebenfalls geändert). - Bildprobleme (statische Route) → PPT ändern, Frames neu exportieren, Audio wiederverwenden.
- Cover-Änderungen → Wenn Text/Bildsprache nicht stimmen, nur das entsprechende Element neu erstellen; wenn der Gesamtstil nicht stimmt, neuen Ankerpunkt erstellen und davon ableiten (siehe
references/douyin-covers.md).
Phase ⑧ Abnahme und Auslieferung (Selbstcheckliste)
- Bild: Keine Anomalien bei Schriftart/Farbe; Tabellenseiten (falls vorhanden) korrekt gerendert
- Animation: Titel/Aufzählungspunkte natürlich eingeblendet, flüssige Seitenübergänge, cue-Hervorhebung synchron mit dem Sprechertext (HTML-Route)
- Sprachaufnahme: Gut hörbar, keine verschluckten Laute, einheitliche Sprechgeschwindigkeit im gesamten Video
- Aussprache: Literarische Lesarten korrekt (z.B. „老子“ = lǎo zǐ)
- Untertitel: Satzweise synchron mit der Sprachaufnahme, einheitlicher Stil, kein Überlauf/Beschnitt
- Übergänge: Crossfade flüssig, keine schwarzen Blitze, keine leeren Frames
- Dauer: ≈ Zieldauer (±10 Sekunden)
- Format: 1920×1080 / H.264 / AAC / .mp4
- Cover: Beide Formate, vier Zeichen vollständig, Stil einheitlich, Maße exakt angeben (Liste siehe
references/douyin-covers.md)
Struktur des Skript-JSON (Einzige Datenquelle)
{
"title": "Laozi Heutige Lesart-Das höchste Gut ist wie Wasser",
"voice": "zh-CN-YunjianNeural",
"rate": "+0%",
"voice_confirmed": true,
"tts_replacements": { "老子": "老紫" },
"slides": [
{ "idx": 1, "text": "Sprechertext erste Seite……" },
{ "idx": 2, "text": "Sprechertext zweite Seite……",
"title": "Drei Eigenschaften des Wassers", "points": ["Altruistisch, nährt alle Wesen", "Strebt nicht, nimmt gerne die untere Position ein"],
"cues": [ { "t": 4.5, "dur": 0.9, "target": 0 } ] }
]
}
idxfortlaufend nummeriert ab 1, streng korrespondierend mitframe_XX.png(statische Route) /slide_XX.mp3.- Optionale Felder pro Seite für die HTML-Animationsroute:
title(Seitentitel),points(Array der Bildschirmeinträge),layout(title/bullets/quote/end),cues(Punkte-Hervorhebung:t=relative Sekunde innerhalb der Seite,target=Index des Eintrags beginnend bei 0,dur=Dauer der Hervorhebung,action=pulse); Text-Bild-Kooperation (v2.1):visual(Tuscheszenen water/ripples/mountain/ bamboo/moon/fish, Standard automatische Zuordnung basierend auf Schlüsselwörtern im Sprechertext),icons(Eintragssymbole droplet/wave/mountain/moon/leaf),image(Pfad zu einem externen Bild, eingebettet in die rechte Spalte). Fehlen diese, werden sie automatisch aus dem Sprechertext abgeleitet; für die Produktion wird empfohlen, sie explizit anzugeben. tts_replacements: Tabelle für Aussprachekorrekturen, wirkt sich nur auf die TTS-Eingabe aus, Untertitel und bearbeitbarer Text behalten die ursprünglichen Zeichen. Allgemeine Serien lassen{}leer.voice_confirmedstandardmäßig false, wird in Tor ③ auf true gesetzt, andernfalls verweigern die Skripte die Synthese.
Schnelle Hilfe bei häufigen Fehlern
| Symptom | Ursache | Behandlung |
|---|---|---|
| Rahmenfarbe der Untertitel entspricht nicht den Erwartungen | ASS-Farben sind BBGGRR umgekehrt | Rot=&H000000FF Blau=&H00FF0000 Schwarz=&H00000000 |
| Literarische Lesart wird umgangssprachlich gelesen (z.B. 老子 lǎo zi) | TTS verwendet standardmäßig die umgangssprachliche Lesart | Zu tts_replacements hinzufügen und TTS erneut ausführen |
| PPT-Schriftart wird nicht gerendert | Chinesischer Name wird nicht erkannt | SimSun / Microsoft YaHei verwenden |
| Ein-Schritt-Synthese führt zu weißem Bildschirm/Filterketten-Absturz | xfade overlapped overlay | In zwei Schritten aufteilen: zuerst Basis, dann Overlay; Komma maskieren mit \, |
| Frame „erstellt“ aber nicht gefunden | pymupdf schlägt still fehl | Skript verwendet bereits abspath + Überprüfung nach dem Schreiben; oder export_frames.ps1 verwenden |
Fehler --rate -10% „expected one argument“ | argparse interpretiert die Option falsch | --rate=-10% verwenden oder nur das rate im JSON ändern |
| Synthese meldet „Sprache wurde noch nicht bestätigt“ | Tor ③ fehlt | voice_confirmed=true setzen und erneut ausführen |
| Fehler beim Schreiben von chinesischen Anführungszeichen in JSON | Manueller Escape-Fehler | Python json.dump programmatisch verwenden |
| Deck-Generierung meldet „Sprache fehlt“ | HTML-Route erfordert zuerst TTS | Zuerst tts_synth.py, dann gen_html_deck.py ausführen |
| Rendering meldet „Chromium nicht gefunden“ | Browser-Pfad hat sich geändert | Mit --browser den Pfad zu chrome.exe / msedge.exe angeben |
| Titelseite nicht zentriert | CSS-Klassenselektor-Schreibweise | .inner.layout-title verwenden (gleichartige Elemente), keine Nachkommen-Selektoren |
| Einträge werden aufgesplittert (nummerierte Kurzsätze als separate Einträge) | Nummerierte Kurzsätze nicht zusammengeführt | gen_html_deck.py führt sie bereits standardmäßig zusammen; benutzerdefinierte points können dies vollständig vermeiden |
| Dauer des letzten Frames im fertigen Video falsch | Eigenart von concat bei der letzten Datei | compose_html_video.py fügt die letzte Datei bereits standardmäßig wiederholt an, nicht löschen |
| cue-Hervorhebung erscheint nicht | cue überschreitet die Seitenlänge | Prüfen, ob t in slides[].cues kleiner ist als die Sprachdauer dieser Seite |
| Fehlende/falsche Zeichen in den großen Cover-Schriftzügen | KI rendert lange chinesische Sätze instabil | Text auf vier Zeichen reduzieren und neu erstellen; wenn der Ankerpunkt falsche Zeichen hat, zuerst den Ankerpunkt neu erstellen und dann ableiten |
| Kurze Seite des Covers ist 1072 ≠ 1080 | Modell rundet | Tatsächliche Maße liefern (das Seitenverhältnis ist immer noch ≈16:9 / 9:16); für genaue Maße Ränder auf 1920×1080 / 1080×1920 ergänzen |
| Zwei Cover sehen nicht wie ein Set aus | Zwei reine Text-zu-Bild-Bilder driften unabhängig voneinander ab | Ankerpunktkette ist zwingend: Hochformat wird vom Querformat-Ankerpunkt als Referenzbild abgeleitet |
Vollständige Liste der Fallstricke und Architekturerfahrungen siehe references/pitfalls.md; Details zur HTML-Animationsroute siehe references/html-animation.md.
Ressourcen
scripts/doctor.py— Umgebungscheck (vor jeder Episode ausführen, fehlende Komponenten ergänzen, dann starten)scripts/verify_output.py— Video-Tor (Spezifikation/Dauer/Lautstärke/schwarze Frames/Stille, nur bei Bestehen aller Prüfungen ausliefern)scripts/gen_html_deck.py— Skript → Text-Bild-Kooperations-Animations-HTML-Präsentationsseite + deck.json-Liste (Einstiegspunkt HTML-Route)scripts/render_html_frames.mjs— Deterministisches Einzelbild-Rendering mit Playwright (nur das Animationsfenster rendern, statische Abschnitte verwenden den letzten Frame wieder)scripts/compose_html_video.py— Synthese von Bildsequenz + Sprachaufnahme + Echtzeit-Untertiteln + BGM Ducking (HTML-Route)scripts/tts_synth.py— Batch-Synthese mit edge-tts (Aussprachekorrektur + reale satzweise Timeline + voice_confirmed-Tor)scripts/compose_video.py— Synthese von statischen Seiten + xfade + satzweisen Untertiteln (statische Rückfallroute)scripts/export_txt.py/scripts/import_txt.py— Bidirektionale Synchronisation von Skript und bearbeitbarer txtscripts/preview_voices.py— Vergleichsseite für fünf Sprachproben (offline abspielbar)scripts/export_frames.ps1— PowerPoint COM Export von 1920×1080 Bildframes (bevorzugte statische Route)scripts/pdf_to_frames.py— pymupdf Rendern von PDF-Frames (alternative statische Route)references/douyin-covers.md— Douyin-Cover-Komplettablauf: Textregeln / Prompt-Vorlagen / Ankerpunktkette / Qualitätscheckliste (Standard: beide Formate pro Episode)references/html-animation.md— HTML-Animationsroute: Machbarkeitsergebnis / Layoutregeln / Fallstricke (Lesen erforderlich)references/pacing-and-gates.md— Rhythmus-Grundlinien / Datenvalidierung / Zwei-Tore-System / BGM / Änderungsumfangs-Tabelle (Lesen erforderlich)references/playbook.md— Komplette Ablaufanleitung: Checkliste / Technologie-Stack / Optimierungsroutereferences/pitfalls.md— Fallstrickliste und Architekturerfahrungenreferences/subtitle-style.md— ASS-Untertitel-Stilhandbuch (Farbumkehrung / Leuchteffekt / Stilvorlagen)assets/narration-template.json— Skript-JSON-Vorlage
Abhängigkeiten: playwright-core (im Stammverzeichnis des Skills unter node_modules, bereits installiert); Chromium-Erkennungsreihenfolge
ms-playwright-Cache → System-Edge, falls beide fehlen, mit --browser angeben.