Communitygithub.com

Video Make – Code-basiertes Erklärvideo erstellen

Erstelle erklärende Tutorials, Produktpromo-Videos oder Kurzclips (B站横屏, 抖音/小红书/视频号竖屏) vollständig aus Code – mit TTS, Untertiteln, HTML-Animationen, MP4-Rendering, Cover und Veröffentlichungstext.

Was ist Video Make – Code-basiertes Erklärvideo erstellen?

Dieses Skill ermöglicht es, komplette erklärende Videos (Tutorials, Produktpromos, Kurzclips) aus Code zu generieren – ohne manuelle Videobearbeitung. Der Workflow ist streng zeitachsenbasiert: Zuerst wird der endgültige Text erstellt, dann wird jede Zeile per TTS vertont, mit ASR geprüft, die Zeitachse aus dem Audio berechnet, dann werden HTML-Animationen mit diesen Zeitpunkten verknüpft und Frame für Frame gerendert, und schließlich mit ffmpeg zum MP4 zusammengesetzt. Das Skill unterstützt chinesische Plattformen (Bilibili, Douyin, Xiaohongshu, WeChat Channels) mit entsprechenden Cover-Formaten und Veröffentlichungstexten. Besonders wichtig ist die strikte Trennung von Untertiteln (für den Zuschauer) und TTS-Sprechtext (für die Sprachausgabe), um korrekte Aussprache und Lesbarkeit zu gewährleisten. Das Skill erfordert Python, Node.js, ffmpeg, Google Chrome und stellt umfangreiche Hilfsskripte für TTS (MiMo), ASR (Whisper), Rendering und Cover-Generierung bereit.

Funktioniert mit~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/Qsnh/video-make-skill/tree/HEAD/skills/video-make

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Video per Code erstellen (mit Sprachausgabe)

Übersicht

Ein Video = Endgültiger Text → Zeilenweise TTS → Zeilenweise ASR-Prüfung → Zeitachse → HTML-Animation → Einzelbild-Screenshots → ffmpeg-Komposition.

Kernprinzip: Die Zeitachse kommt vom Audio. Zuerst jede Zeile vertonen und prüfen, die tatsächlichen Start-/Endzeiten jedes Untertitelabschnitts messen, dann alle Bild-Animationen an diese Zeitpunkte anhängen. Bilder haben keine festen Sekunden, wenn die Sprachausgabe geändert wird, wird die Zeitachse einfach neu berechnet. Das Rendering erstellt für jede Seite einen __seek(t)-Screenshot, das Ergebnis ist deterministisch und reproduzierbar.

Geeignet für: Erklärvideos/Tutorials (2–5 Min.), Produktpromo-Clips (20–40 Sek.), Wissensvideos mit Untertiteln und Kapitelleisten. Nicht geeignet für: Videos mit echten Personen, Videos mit realem Filmmaterial, reine Musik-MVs.

Ablauf

Jeder Schritt hat ein Qualitäts-Tor. Überspringe keinen Schritt, bevor das vorherige Tor nicht erfolgreich passiert wurde.

#SchrittErgebnisTorReferenz
0InitialisierungArbeitsverzeichnisbash scripts/init.sh <dir> erfolgreichsiehe unten
1Themenauswahl, Faktencheck, Textscript.md, audio/make_script.pyFakten geprüft (Experimente zuerst ausführen); Benutzer stimmt Text explizit zu, bevor TTS gestartet wirdreferences/script.md
2Sprachaufnahme (TTS)audio/raw/NN.wav → audio/clips/NN.wav (1,3x)Jede Zeile per ASR prüfen, fehlerhafte Zeilen neu aufnehmenreferences/voice.md
3Zeitachsebuild/narration.wav, build/timeline.jsonUntertitelabschnitte passen zur Sprachereferences/timeline.md
4MaterialEchte Bildschirmfotos, echte TerminalausgabenStimmen mit dem gesprochenen Text überein, Beispiel-Domains verwenden example.comreferences/capture.md
5Kompositioncomp/index.htmlEinzelbild-Screenshots und Collagen einzeln durchgesehenreferences/composition.md
6Renderingdist/video.mp4Dauer = Zeitachse, Lautstärke -14 LUFSreferences/render.md
7Cover, Veröffentlichungstextdist/cover-bili.png, dist/cover-douyin.png, dist/copy.txtCover liegen im jeweiligen Plattform-Beschnittsicherheitsbereichreferences/publish.md
8Übergabe, BereinigungVideo an Benutzer senden; Quelldateien archivierenBenutzer bestätigt Speicherung, dann Bereinigungsiehe unten

Initialisierung

bash scripts/init.sh ~/work/<Projekt>/video-<Folgenname> kopiert template/ in das Arbeitsverzeichnis, scripts/ nach tools/ und installiert playwright-core. Die Vorlage ist eine sofort lauffähige 30-Sekunden-Demo. Ersetze vor Arbeitsbeginn diese Beispielinhalte:

  • script.md, audio/make_script.py: Text dieser Folge; Kapitel werden nur einmal in CHAPTERS von make_script.py definiert, Pausen zwischen Kapiteln, Kapitelleisten und Kapitelzeitstempel werden daraus abgeleitet.
  • audio/direction.txt: TTS-Regieanweisungen [Szene].
  • asr-prompt.txt: Fachbegriffe dieser Folge (korrekte Schreibweise, ggf. mit Aussprachehinweis).
  • Szenen und Animationen in comp/index.html, Cover-Inhalte in comp/cover-*.html.

Häufige Befehle

Ausführung im Arbeitsverzeichnis:

BefehlFunktion
python3 audio/make_script.pyErzeugt audio/script.json und audio/lines.json
python3 tools/tts.py audio/lines.json audio/rawZeilenweise Sprachausgabe; verwendet vorhandene Audiodateien bei gleichem Text, nach Textänderung einfach neu ausführen
bash tools/speed.sh audio/raw audio/clips 1.3Geschwindigkeit ändern ohne Tonhöhenänderung
python3 tools/asr.py audio/clips --enZeilenweise Erkennung: plain / Fachbegriffe / Englisch-Modus
python3 tools/takes.py 3,7 3Zeilen 3 und 7 jeweils 3 Takes aufnehmen und bewerten
python3 tools/takes.py audio/var.json 2Verschiedene Umschreibungen derselben Zeile jeweils 2 Takes
python3 tools/tts.py audio/lines.json audio/raw --adopt 3 audio/takes/03-0-1.raw.wavEinen bestimmten Take übernehmen
python3 tools/build_audio.py audio/clips build audio/script.jsonSprachdateien zusammenfügen, Zeitachse erzeugen
python3 tools/align_chunks.py audio/clips build/timeline.json audio/script.jsonUntertitelabschnitte an tatsächliche Aussprache anpassen
node tools/render.mjs --timeline=build/timeline.json --stills=2,8.5,20Einzelbilder extrahieren nach build/stills (vorher immer leeren)
bash tools/contact.sh build/stills build/sheets2x2 Collage erstellen, mit Read betrachten
bash tools/render-par.sh build/timeline.json build/narration.wav dist/video.mp4 8Paralleles Rendern des gesamten Videos mit 8 Prozessen und Audiomischung
node tools/render.mjs --html=comp/cover-4x3.html --width=1440 --height=1080 --png=dist/cover-bili.pngCover erstellen
python3 tools/bili_kw.py "nginx ssl Zertifikat konfigurieren" "Baota https"Themenfindung: Top 6 Bilibili-Keywords nach Aufrufen

Abhängigkeiten: ffmpeg, Node 18+, lokaler Google Chrome, Python 3 + requests + openai-whisper (small-Modell). TTS verwendet MiMo von Xiaomi, API-Key aus Umgebungsvariable MIMO_API_KEY oder Datei, auf die MIMO_ENV_FILE verweist, sonst beim Benutzer erfragen; Austausch gegen anderen TTS ist möglich, solange jede Zeile eine einzelne WAV-Datei bleibt.

Häufigste Fehlerquellen

  • TTS ohne Genehmigung starten. Text zuerst an Benutzer senden; "Weiter"/"Start"/"OK" gilt als Zustimmung. Wurde der Text für die Aussprache geändert, bei Übergabe jede Änderung einzeln auflisten.
  • Untertitel und Sprachausgabe in einer Datei. Untertitel sind für den Zuschauer (Nginx, 443, 1.3), Sprachausgabe für TTS (Engine X, vier vier drei, eins Komma drei). In make_script.py mit P(Untertitel, Aussprache) getrennt schreiben, die Ausspracheabschnitte müssen zusammengesetzt den gesamten TTS-Text ergeben.
  • Nur die gesamte Mischung anhören. Die Erkennung des gesamten Audios verwechselt englische Fachbegriffe; daher muss jede Zeile einzeln erkannt werden. Bei der Auswahl eines Takes nur den plain-Score und das --en-Ergebnis betrachten; ein mit Fachbegriffen gepimptes priming „korrigiert“ auch falsch ausgesprochene Wörter – Bewertungsregeln siehe voice.md.
  • Sekundenzahlen fest in Animationen codieren. Animationen nach dem Start der ersten Zeile immer mit T(Zeile, Abschnitt) schreiben; nach Geschwindigkeitsänderung oder Neuaufnahme ändern sich die Zeiten.
  • Seitenanfang bleibt leer. Wenn die erste Karte 2–3 Sekunden lang noch nicht erscheint, wirkt das Video wie eingefroren; Inhalt muss im ersten Untertitelabschnitt des Kapitels sichtbar sein.
  • Mehrere fill: both-Animationen auf demselben Element, doppelte IDs. WAAPI gibt keinen Fehler aus, das Element kann vollständig verschwinden oder im falschen Zustand bleiben – siehe composition.md.
  • Seite mit file:// öffnen. CSS-Mask etc. funktionieren nicht; render.mjs enthält einen lokalen HTTP-Server.
  • Cover wird von der Plattform beschnitten. Bilibili schneidet ein Bild gleichzeitig auf 4:3 und 16:9 zu, Douyin 9:16 wird auf 3:4 beschnitten – Inhalt nur im Sicherheitsbereich platzieren.
  • Verstoß gegen Weiterleitungsregeln. Keine echten Website-URLs, QR-Codes, Kontaktdaten in Bildern, Cover oder Text platzieren; keine Aufforderungen wie „schau mal nach“ / „suche mal“; example.com und ähnliche reservierte Beispieldomains sind in Demos und Terminalausgaben erlaubt. Plattformübergreifende Videos verwenden keine bestimmte Content-Plattform als Beispiel; Werbevideos erwähnen keine Preise.
  • Erfolg melden, bevor das Ergebnis angesehen wird. Fortschrittsmeldungen erst senden, nachdem der Befehl vollständig ausgeführt wurde und die Ausgabe sichtbar ist.

Übergabe und Bereinigung

  1. Übergabe: Fertiges Video, Bilibili 4:3-Cover, Douyin 9:16-Cover, dist/copy.txt (Titel, Tags, Beschreibung, Kapitelzeitstempel). Das Bilibili-Video wird standardmäßig auch auf Douyin etc. veröffentlicht, daher werden das Hochkant-Cover und der Douyin-Text zusammen ausgegeben; wenn der Benutzer nur eine Plattform angibt, nur diese eine Ausgabe. Liste aller aus Aussprachegründen geänderten Textstellen sowie aller unsicheren Zeitpunkte, um die der Benutzer gebeten wird, sie anzuhören.
  2. Wenn die Datei die Chat-Größenbeschränkung überschreitet (häufig 30 MB), zuerst eine Preview mit crf 22 senden und den Speicherort der HD-Version angeben. Bei Zeitüberschreitung beim Senden großer Dateien nach erneutem Senden darauf hinweisen, dass der Benutzer möglicherweise zwei Kopien erhält.
  3. Nachdem der Benutzer bestätigt hat, dass die Materialien gespeichert wurden: Wiederverwendbare Quelldateien (comp/ und verwendete Materialien, audio/make_script.py, Varianten-Spezifikation, script.md, copy.txt, direction.txt, asr-prompt.txt, Screenshot-Skripte, lab/) in die Benutzer-Vorlagenbibliothek archivieren (falls nicht vereinbart, beim Benutzer nachfragen, z.B. ~/work/<Projekt>/video-template/<Folgenname>/), mit diff -r einzeln auf Übereinstimmung prüfen, dann Arbeitsverzeichnis, temporäres Browser-Profil, Container, Entwicklungsserver (per PID töten, vorher Befehl prüfen) und nur für Screenshots installierte Frontend-Abhängigkeiten löschen. Whisper-Modell-Cache und Docker-Images bleiben erhalten.

Verwandte Skills