TikTok / Douyin Kurzvideo-Generator
Sie (der Agent) übernehmen die kreative Arbeit – Skripterstellung, Szenenaufteilung, Suchbegriffe, Stilauswahl und Qualitätsprüfung. Die Skripte in scripts/ erledigen die mechanische Arbeit – TTS mit Wort-Zeitstempeln, Asset-Suche und -Download, Untertitel-Rendering, ffmpeg-Komposition, Lautstärkenormalisierung.
Alles läuft mit reinem ffmpeg (kein libass/drawtext nötig) plus einer Python-Venv. Funktioniert ohne API-Schlüssel; mit den Umgebungsvariablen PEXELS_API_KEY / PIXABAY_API_KEY werden echte Stock-Videoclips freigeschaltet (besser), sofern vorhanden.
Arbeitsablauf
0. Einmalige Einrichtung (überspringen, wenn .venv/ und assets/fonts/ existieren)
bash scripts/setup.sh
1. ZUERST FAKTEN PRÜFEN, dann Skript + Storyboard schreiben
Ihr internes Wissen kann veraltet oder falsch sein – setzen Sie niemals eine unbelegte Behauptung in ein Video. Bevor Sie Szenentext schreiben, prüfen Sie mit Ihrem Websuchwerkzeug jede konkrete Behauptung: Zahlen, Statistiken, Rekorde, Preise, Daten, Ranglisten und jede „erste / größte / einzige / schnellste“ Aussage – sowie alles Zeitkritische (Nachrichten, Produkte, Versionen, „今年/neueste“), unabhängig davon, wie sicher Sie sich fühlen. Regeln:
- Eine Behauptung kommt nur so ins Skript, wie eine Quelle sie angibt – passen Sie Ihre Formulierung an die Quelle an, nicht umgekehrt.
- Können Sie es nicht überprüfen? Ersetzen Sie es durch eine überprüfbare Behauptung oder streichen Sie es. Eine falsche Zahl in einem veröffentlichten Video ist schlimmer als ein schwächerer Aufhänger.
- Notieren Sie die von Ihnen verwendeten URLs im Storyboard als
"sources": [...]– sie werden inreview/report.txtausgegeben, damit der Benutzer das Video prüfen kann. - Wenn Sie wirklich keinen Webzugriff haben, halten Sie sich an langlebige Lehrbuchfakten, vermeiden Sie konkrete Zahlen und teilen Sie dem Benutzer mit, dass das Video ungeprüft ist.
Lesen Sie references/writing-guide.md für die Skript-Formeln (Hook-Typen, Tempo, Szenenstruktur). Erstellen Sie dann projects/<slug>/storyboard.json:
{
"title": "深海里最诡异的5种生物",
"lang": "zh",
"aspect": "9:16",
"voice": "zh-CN-YunjianNeural",
"rate": "+10%",
"caption_style": "karaoke",
"bgm": {"mood": "mystery", "gain_db": -16},
"hook": {"text": "深海禁区", "seconds": 2.3},
"scenes": [
{
"text": "你知道吗?在阳光永远照不到的深海,藏着比科幻电影更诡异的生物。",
"keywords": ["deep sea NOAA ocean exploration", "submarine dark ocean"],
"providers": ["openverse", "wikimedia"],
"badge": null,
"effect": "kb_in"
},
{
"text": "第一名,鮟鱇鱼……",
"keywords": ["humpback anglerfish", "anglerfish museum"],
"badge": "第1名"
}
]
}
Feldreferenz:
| Feld | Werte | Hinweise |
|---|---|---|
lang | zh | en | Legt die Untertitel-Gruppierung + Standardstimme fest |
aspect | 9:16 (Standard) | 16:9 | 1:1 | |
voice | beliebige edge-tts-Stimme | zh: zh-CN-YunjianNeural (männlich, magnetisch) zh-CN-XiaoxiaoNeural (weiblich) zh-CN-YunxiNeural (männlich, sonnig); en: en-US-ChristopherNeural en-US-AriaNeural en-US-GuyNeural |
rate | z.B. +10% | Marketing-Kanal-Tempo: zh +8%+15%, en +5%+10% |
caption_style | karaoke | pop | none | karaoke = Wort-für-Wort-Hervorhebung (empfohlen) |
bgm | {"mood": ...} | {"query": "Stilwörter"} | {"file": "pfad.mp3"} | {"mood":"none"} | Standardmäßig einen mood verwenden: Die kuratierte Tabelle (upbeat, funny, inspiring, chill, tech, mystery, epic, sad, horror) enthält die MacLeod-Standardtitel, die unzählige Marketing-Kanäle verwenden – bewährt, sicher, abwechslungsreich pro Projekt. Greifen Sie nur dann auf query zurück, wenn kein Mood zum Stil des Inhalts passt (oder der Benutzer ein Genre nennt): Es durchsucht echte CC-Beats (ccMixter-Stil-Tags + Openverse/Jamendo; ND/NC ausgeschlossen), und jeder Kandidat wird vom Beat-Tracker geprüft – kein sicherer 75–175 BPM Groove, keine Auswahl. Stilwörter, die auf Tags abgebildet werden: Trap/Phonk, Hip Hop, Lofi/Chill, Edm/Dance, Epic/Cinematic, Quirky. Sie können beide setzen – query wird zuerst versucht, mood ist der Fallback. file = eigener Track des Benutzers |
bgm.vibe | "spedup" | "slowed" | nicht gesetzt | Der typische Douyin-Sound: spedup ≈ 1,25× mit erhöhter Tonhöhe (卡点/盘点 Video Standardverarbeitung), slowed = verlangsamt + Hall (情感/氛围 Stil). Wird auf jede BGM-Quelle angewendet, inkl. file; das Beat-Raster wird nach der Verarbeitung neu analysiert, sodass 卡点 genau bleibt |
beat_sync | true (Standard) | false | Der BGM wird auf Beats analysiert, und jeder Szenen-/Shot-Schnitt wird auf das Beat-Raster ausgerichtet (卡点), wenn das Raster sicher ist; VO wird nie abgeschnitten, nur die Atempausen werden angepasst |
hook | {"text","seconds"} | Große obere Titel-Karte, die am Anfang gezeigt wird, ≤ 8 Zeichen/Wörter |
sticky_title | {"text": ...} | Optionaler dauerhafter Themenbalken oben; standardmäßig deaktiviert – nur hinzufügen, wenn der Benutzer danach fragt |
sfx | true (Standard) | false | Whoosh-Sound bei Szenenübergängen |
Szenen-keywords | Liste von englischen, konkreten Nomen-Suchbegriffen | Jeder Eintrag = ein Shot (visuell); das Video wechselt alle ~3s zu einem neuen Bild, also geben Sie 2–3 Suchbegriffe für Szenen länger als ~4s (zusätzliche Shots werden automatisch durch Rotation Ihrer Suchbegriffe hinzugefügt, wenn Sie weniger angeben) |
Szenen-badge | z.B. "第1名" / "TOP 1" | Großer gestempelter Titel, der am Szenenanfang gezeigt wird – für Listen |
Szenen-providers | Liste | Bilder ohne Schlüssel: openverse wikimedia nasa; echte Videos ohne Schlüssel: wikimedia_video (Commons-Clips, Server-Transcodes) nasa_video (PD Weltraum/Wissenschaft) archive_video (Prelinger Public-Domain-Archivfilme); mit Schlüsseln: pexels_video pexels_photo pixabay_video |
Szenen-effect | auto kb_in kb_out pan_left pan_right static | Ken-Burns-Bewegung des ersten Shots; spätere Shots rotieren automatisch |
Szenen-emphasis | Liste von Teilzeichenfolgen | Dauerhaft hervorgehobene Wörter (Pop-Stil) |
Szenen-media | Dateipfad | Suche überspringen, eigene Datei verwenden (z.B. eine, die Sie selbst heruntergeladen haben) |
Faustregeln (Veröffentlichungsstandard): Gesamt 45–75s, 6–9 Szenen, eine Idee pro Szene, 2–3 Shots pro Szene. Szenentext 20–45 chinesische Zeichen / 14–30 englische Wörter. Alles unter ~40s oder mit durchgängig Ein-Shot-Szenen wirkt dünn – liefern Sie es nicht aus.
2. Pipeline ausführen
.venv/bin/python scripts/pipeline.py projects/<slug>
Oder Schritt für Schritt: tts.py → assets.py → bgm.py → compose.py → check.py.
3. PRÜFEN – das macht den Unterschied (obligatorisch)
Die Suche nach freien Bildern ist nicht perfekt. Betrachten Sie diese beiden Dateien immer mit Ihrem Bildwerkzeug und beurteilen Sie sie wie ein menschlicher Redakteur:
-
projects/<slug>/media/assets_sheet.jpg– nach dem Asset-Schritt. Shots sind beschriftet (01a 01b 02a …). Für jeden Shot, der nicht klar zur Erzählung passt, holen Sie ihn erneut:.venv/bin/python scripts/assets.py projects/<slug> --scene 3 --shot 2 --keywords "bessere englische Nomen"(Erneutes Holen blacklistet das abgelehnte Asset automatisch. Wiederholen Sie dies, bis alle Szenen passen. Sie können auch selbst ein Bild mit Ihren eigenen Werkzeugen herunterladen und im Szenen-
media-Feld angeben.)Die Pipeline prüft auch automatisch den Quellentitel jedes Shots gegen seine Suchanfrage und gibt
[!] OFF-TOPIC-Flags aus. Wenn Sie visuell bestätigt haben, dass ein markierter Shot tatsächlich richtig ist (z.B. ein unbetiteltes, aber perfektes Foto), setzen Sie"approved": truefür diesen Shot inmedia/manifest.json, um ihn freizugeben – Ihre Augen sind besser als die Textprüfung. Niemals blind freigeben. -
projects/<slug>/review/contact_sheet.jpg– nach Komposition + Prüfung. Überprüfen: Untertitel lesbar & synchron, keine falschen/hässlichen Einzelbilder, Hook sichtbar. Probleme beheben (Storyboard bearbeiten → Komposition erneut ausführen, das geht schnell), bis es aussieht wie ein Video, das ein Marketing-Kanal-Redakteur tatsächlich veröffentlichen würde.
review/report.txt enthält Dauer-/Lautstärkeprüfungen und einen direkt einfügbaren Quellenangaben-Block (CC-BY-Quellen + Musik-Credit) – geben Sie ihn dem Benutzer immer zusammen mit final.mp4.
Tipps zur Asset-Suche (größter Qualitätshebel)
- Suchbegriffe müssen englisch sein, 1–4 Wörter, konkrete sichtbare Nomen („humpback anglerfish“, „scuba diver silhouette“), nie abstrakte Konzepte („mystery“, „success“).
wikimediaist am besten für Tiere/Wissenschaft/Geschichte/Orte;openverse(Flickr etc.) für Lifestyle/Szenen/Stimmung;nasafür Weltraum; Schlüssel entsperrenpexels_video/pixabay_videoechte Aufnahmen – bevorzugen Sie diese, wenn verfügbar.- Fügen Sie ein Kontextwort zur Disambiguierung hinzu: „NOAA“, „museum“, „aquarium“, „macro“.
- Wenn eine Szene immer wieder fehlschlägt, ändern Sie das visuelle Konzept, nicht nur die Wörter (z.B. für „5% erforscht“ zeigen Sie eine Taucher-Silhouette, nicht „Statistiken“).
wikimedia_video-Suchen unterstützen negative Begriffe – Commons-Wetter/Weltraum-Abfragen ertrinken in Satellitenschleifen, schreiben Sie also z.B."lightning storm -CIRA -satellite -JPSS". Nicht-englische Wörter entsperren zusätzliches Filmmaterial („Blitz Gewitter“, „tormenta rayos“). Bevorzugen Sie benannte Subjekte („Fagradalsfjall lava drone“) vor generischen Nomen und überprüfen Sie immer die Video-Thumbnails im Blatt: Achten Sie auf eingebrannte Untertitel, Wasserzeichen, Tutorials und CGI-Werbung.
Fehlerbehebung
edge-tts-Netzwerkfehler: Es wiederholt 4×; führen Sietts.pyerneut aus, falls es immer noch fehlschlägt.- BGM-Download fehlgeschlagen: Führen Sie
bgm.pyerneut aus (Wiederholungen + Cache), oder--mood none, oder legen Sie eine mp3 inassets/bgm/ab und setzen Siebgm.file. - BGM-Stil passt nicht: Verfeinern Sie die Suchanfrage (
bgm.py <dir> --query "..."dann Komposition mit--skip-tts --skip-assetswiederholen). Für einen 真正の当下热门 Sound liefern Sie mitmood: none(oder niedriger Verstärkung) aus und sagen Sie dem Benutzer, er solle den Trend-Track aus der integrierten lizenzierten Musikbibliothek von TikTok/抖音 zum Zeitpunkt des Hochladens hinzufügen – das ist sowohl legal als auch algorithmusfreundlich. Der Schnitt-Takt bleibt sauber, da das Szenentempo unverändert ist. check.pygibt eine Zeile „Schnitte landen auf dem Beat“ aus – wenn der Beat-Sync übersprungen wurde (geringe Raster-Sicherheit, z.B. bei beatloser Ambient-Musik), wählen Sie einen gleichmäßigeren Track (--query "trap beat"etc.) und wiederholen Sie die Komposition.- Ein Anbieter, der einen Fehler ausgibt oder leer ist, ist in Ordnung – andere decken es ab; überprüfen Sie die szenenspezifischen Logs.
- Erneutes Komponieren nach einer Storyboard-Änderung ist günstig (
--skip-tts --skip-assetsüber pipeline.py, oder compose.py direkt ausführen). Das Ändern von Szenen-Text erfordert ein erneutes Ausführen vontts.py. - Emojis in Untertiteln werden auf macOS (Apple Color Emoji) gerendert; auf Linux werden sie weggelassen, wenn NotoColorEmoji nicht installiert ist. Verlassen Sie sich niemals auf Emojis für die Bedeutung.
Ausliefern
Geben Sie dem Benutzer: final.mp4, den Quellenangaben-Block aus review/report.txt und (falls gewünscht) review/cover.jpg als Titelbild.