Communitygithub.com

xiaocong3/ecommerce-video-skills

Automatische Videoproduktion mit ffmpeg: Aus einem storyboard.json (Produktbilder/-videos + Sprachskript) wird ein 9:16 MP4 mit Sprachausgabe, Untertiteln, Übergängen, BGM-Ducking und Loudness-Normalisierung erstellt – alles lokal ausgeführt.

Was ist ecommerce-video-skills?

Dieses Skill automatisiert die Erstellung von Produktvideos für E-Commerce-Plattformen wie TikTok, Instagram oder Amazon. Es liest eine `storyboard.json`, die die gewünschte Abfolge von Bildern/Videos, Sprachtexten, Hintergrundmusik und Effekten beschreibt, und rendert daraus ein fertiges MP4-Video im Hochformat (9:16). Der Workflow umfasst: Sprachsynthese mit edge-tts, Ken-Burns-Effekte, xfade-Übergänge zwischen den Einstellungen, ASS-basierte Untertitel mit Hervorhebungen, automatisches BGM-Ducking (Absenken der Musik während Sprachpassagen) sowie eine zweistufige Loudness-Normalisierung auf -14 LUFS. Das Skript läuft vollständig lokal, benötigt nur Python und ffmpeg (mit libass) und unterstützt sowohl offline-Vorschauen (ohne TTS) als auch die Produktion in verschiedenen Seitenverhältnissen (1:1, 16:9). Für Benutzer ohne Editor ermöglicht es die schnelle, batch-fähige Erstellung von Produktvideos in gleichbleibender Qualität. Das Skill ist Teil des Repos ecommerce-video-skills und enthält weitere Hilfsskripte zur BGM-Erstellung und Erzeugung von Endkarten/Produktkarten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/xiaocong3/ecommerce-video-skills/tree/HEAD/skills/ffmpeg-auto-assemble

In Ihrer bevorzugten KI fragen

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

Dokumentation

ffmpeg automatische Videomontage · Auto-assemble with ffmpeg

storyboard.json → Sprachausgabe (edge-tts) → Ken Burns / Video-Zuschnitt pro Einstellung → xfade-Übergänge → ASS-Untertitel/Textoverlays → BGM-Ducking-Mixing → zweifaches loudnorm (-14 LUFS) → out/video.mp4 + .srt.

Teil von ecommerce-video-skills · Skripte befinden sich im Verzeichnis scripts/: assemble.py (Hauptprogramm) · tts_edge.py · make_subs.py · make_bgm.py (lizenzfreie BGM-Synthese) · make_cards.py (PIL-Produktkarten/Endkarten)

Eingaben Inputs

  • storyboard.json (kann von selling-point-storyboard generiert werden), Medienpfade relativ zu dieser Datei
  • Umgebung: Python 3.9+, pip install pillow numpy edge-tts, ffmpeg (mit libass), CJK-Schriftarten

Schnellstart Quick start

pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4       # Mitgeliefertes Beispiel, Rendering in ca. 30 Sekunden
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4              # Offline-Vorschau (ohne Sprachausgabe, Schätzung nach Zeichenzahl)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4      # Produktvideo 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3                           # Mit Ihrer lizenzierten Musik

storyboard-Felder Fields

FeldBeschreibung
Oberste Ebene voice / rate / pitchedge-tts Stimme, Sprechgeschwindigkeit (z.B. +10%), Tonhöhe
Oberste Ebene bgm"auto" (eingebaute Synthese, lizenzfrei) / Musikdateipfad / null
Oberste Ebene tagAufkleber oben links während des gesamten Videos (Marke/Modell/"Demo")
image oder video (+start)Medien; Video wird ab Sekunde start für die Dauer dieser Einstellung ausgeschnitten
lineSprachtext; Einstellungslänge = Sprachdauer + 0,15 s Vorlauf + pad
subUntertitel (standardmäßig gleich line); "" bedeutet keine Untertitel für diese Einstellung; **Hervorhebung**, `
title / ctaTextoverlay / Call-to-Action-Button
motionzoom_in zoom_out pan_left pan_right pan_up pan_down punch static
fitauto (bei ähnlichem Seitenverhältnis Zuschnitt, sonst unscharfe Füllung) / cover / blur
transitionxfade-Name für den Übergang zur nächsten Einstellung: fade slideleft slideup smoothleft circleopen wipeleft …
min / duration / padMindestdauer / feste Dauer / Nachlaufpause (Sekunden)

Schritte Steps

  1. Prüfen, ob alle Medien vorhanden sind und das Seitenverhältnis stimmt (Produktbilder ≥ 1000px); fehlt eine Endkarte, wird sie mit make_cards.py erstellt: python scripts/make_cards.py --image main.png --name "Produktname" --points "Vorteil1|Vorteil2|Vorteil3" -o assets/end-card.png
  2. Zuerst mit --tts none durchlaufen lassen, um den Bildrhythmus zu prüfen, dann endgültig rendern.
  3. Nach dem Rendern einen Frame zur Kontrolle extrahieren: ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png
  4. An platform-spec-export zur Ausgabe für verschiedene Plattformen übergeben; cover-title-ab für das Cover verwenden.

Pipeline-Details How it works

  • Ken Burns: Pro Frame scale(eval=frame)+crop, weniger ruckelig als zoompan; punch = 0,35 Sekunden schneller Zoom (für Hook-Effekte).
  • Übergänge: Jede Einstellung wird um eine halbe Übergangslänge länger gerendert, xfade zentriert auf dem Schnittpunkt, Sprachbeginn wird nicht vom Übergang abgeschnitten.
  • Mixing: Sprachausgabe wird an den Einstellungsanfängen platziert; BGM standardmäßig bei -20 dB, bei Sprachaktivität um weitere 10 dB reduziert (sanftes Ducking); zuerst Kompression/Limiting, dann zweifaches loudnorm auf ca. -14 LUFS, TP -1,5 dB.
  • Untertitel: Mit tatsächlicher Sprachdauer wird build/timing.json erstellt → make_subs.py → libass zum Einbrennen, gleichzeitig Export als .srt.

Checkliste Checklist

  • Endvideo-Länge, Auflösung, Bildrate korrekt (ffprobe out/video.mp4)
  • 3 Frames prüfen: Untertitel überdecken kein Produkt, dringen nicht in den unteren UI-Bereich ein
  • Anhören: Sprachausgabe klar, BGM nicht aufdringlich, kein Knacksen zu Beginn
  • BGM hat kommerzielle Lizenz (auto-Synthesemusik kann bedenkenlos verwendet werden)
  • Medien (Bilder/Videos/Schriftarten) haben Nutzungslizenz

Häufige Probleme und Fehlerbehebung Failure fixes

ProblemBehebung
ffmpeg failedLetzte Zeile des von Skript ausgegebenen stderr prüfen; meist Pfadfehler oder fehlendes libass/libx264 in ffmpeg
Bildränder unscharfMedienauflösung zu niedrig; Bild ≥1080px verwenden oder Bewegungsintensität verringern (auf static setzen)
Produkt wird abgeschnitten"fit": "blur" für diese Einstellung setzen
Ton am Übergang abgeschnittenTritt nicht auf (Sprachausgabe beginnt am Einstellungsanfang); falls eigene duration zu kurz, verlängern
Rendering langsamVoreinstellung verwendet bereits veryfast für Zwischendateien; Endcodierung kann -preset medium auf fast ändern
1:1 / 16:9 gewünscht--size 1080x1080 / --size 1920x1080, Schriftgröße wird automatisch angepasst

Referenzen und Danksagung: Inspiriert von der Pipeline MoneyPrinterTurbo (MIT) "Skript → Sprachausgabe → Untertitel → Montage", diese Implementierung ist eine eigenständige, reine ffmpeg-Version ohne Kopie seines Codes.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Verwandte Skills