Communitygithub.com

xiaocong3/ecommerce-video-skills

Assemblage automatique de vidéos avec ffmpeg : une seule commande pour transformer un `storyboard.json` (images/clips produits + script voix-off) en MP4 9:16 avec doublage, sous-titres stylisés, transitions, fondu BGM automatique et normalisation du volume, le tout en local.

Qu'est-ce que ecommerce-video-skills ?

Ce skill permet de générer automatiquement des vidéos produits pour le e-commerce à partir d'un fichier `storyboard.json` décrivant chaque plan. Il orchestre une pipeline complète : synthèse vocale (edge-tts), animation Ken Burns sur les images, transitions xfade entre les plans, incrustation de sous-titres stylisés (ASS), mixage audio avec ducking automatique de la musique de fond, et double normalisation loudness (-14 LUFS). Le résultat est un fichier MP4 9:16 prêt à être exporté pour différentes plateformes. Ce skill est conçu pour fonctionner exclusivement en local, sans dépendance à un service cloud, et s'appuie sur ffmpeg, Python et des bibliothèques open source. Il fait partie du dépôt `xiaocong3/ecommerce-video-skills` et propose des scripts modulaires pour la synthèse vocale, la génération de sous-titres, la création de BGM libre de droits et la fabrication de cartes produits.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

ffmpeg 自动拼接成片 · Auto-assemble with ffmpeg

storyboard.json → 配音(edge-tts)→ 每镜 Ken Burns / 裁切 vidéo → xfade 转场 → ASS 字幕花字 → BGM 闪避混音 → 两遍 loudnorm(-14 LUFS)→ out/video.mp4 + .srt。

Fait partie de ecommerce-video-skills · Les scripts sont tous dans le répertoire scripts/ : assemble.py (programme principal) · tts_edge.py · make_subs.py · make_bgm.py (synthèse BGM libre de droits) · make_cards.py (cartes produits/cartes de fin avec PIL)

Entrées Inputs

  • storyboard.json (peut être généré par selling-point-storyboard), les chemins des médias sont relatifs à ce fichier
  • Environnement : Python 3.9+, pip install pillow numpy edge-tts, ffmpeg (avec libass), police CJK

Démarrage rapide Quick start

pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4       # Exemple fourni, environ 30s de rendu
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4             # Aperçu hors ligne (sans voix-off, durée estimée par nombre de caractères)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4      # Vidéo produit 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3                           # Utilise une musique dont vous avez les droits

Champs du storyboard Fields

ChampDescription
voice / rate / pitch (racine)Timbre edge-tts, débit (ex. +10%), hauteur tonale
bgm (racine)"auto" (synthèse intégrée, libre de droits) / chemin du fichier audio / null
tag (racine)Autocollant en haut à gauche pendant toute la vidéo (marque/modèle/« Démo »)
image ou video (+start)Média ; pour une vidéo, extrait à partir de start seconde sur la durée du plan
lineTexte de la voix-off ; durée du plan = voix-off + 0.15s de préfixe + pad
subSous-titres (par défaut identique à line) ; "" signifie pas de sous-titres pour ce plan ; **mise en gras**, `
title / ctaTexte stylisé / bouton d'appel à l'action
motionzoom_in zoom_out pan_left pan_right pan_up pan_down punch static
fitauto (ajuste selon le ratio : rogne si proche, remplissage flou sinon) / cover / blur
transitionNom du xfade pour la transition vers le plan suivant : fade slideleft slideup smoothleft circleopen wipeleft …
min / duration / padDurée minimale / durée fixe / silence après la phrase (secondes)

Étapes Steps

  1. Vérifier que tous les médias existent, que leurs dimensions sont appropriées (image produit ≥ 1000px) ; si la carte de fin manque, la générer avec make_cards.py : python scripts/make_cards.py --image main.png --name "NomProduit" --points "Point1|Point2|Point3" -o assets/end-card.png
  2. Lancer d'abord un aperçu avec --tts none pour vérifier le rythme visuel, puis lancer le rendu final.
  3. Après le rendu, extraire une image pour vérification : ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png
  4. Utiliser platform-spec-export pour exporter les versions pour chaque plateforme ; utiliser cover-title-ab pour la vignette.

Détails du pipeline How it works

  • Ken Burns : Animation image par image avec scale(eval=frame)+crop, moins de tremblements qu'avec zoompan ; punch = zoom avant rapide en 0,35 seconde (pour accrocher).
  • Transitions : Chaque plan est rendu avec une demi-durée supplémentaire pour la transition ; xfade centré sur la frontière entre les plans, le point de départ de la voix-off n'est pas coupé par la transition.
  • Mixage : La voix-off est placée au début de chaque plan ; la musique de fond est à -20 dB par défaut, compressée de 10 dB supplémentaires en présence de voix (ducking lissé) ; compression/limitation puis double loudnorm pour atteindre environ -14 LUFS, TP -1,5 dB.
  • Sous-titres : Génération d'un build/timing.json basé sur la durée réelle de la voix-off → make_subs.py → incrustation avec libass, export simultané du fichier .srt.

Liste de vérification Checklist

  • Durée, résolution et fréquence d'images de la vidéo finale correctes (ffprobe out/video.mp4)
  • Extraire 3 images : les sous-titres ne cachent pas le produit, ne dépassent pas dans la zone UI du bas
  • Écouter : voix-off claire, BGM non envahissant, pas de craquement au début
  • La musique de fond possède une licence commerciale (la musique synthétisée auto peut être utilisée sans crainte)
  • Les médias (images/vidéos/polices) sont sous licence d'utilisation

Problèmes courants et correctifs Failure fixes

ProblèmeCorrectif
ffmpeg failedVoir la fin du stderr imprimé par le script ; cause fréquente : chemin erroné ou ffmpeg sans libass/libx264
Bords flousRésolution trop faible ; utiliser une image d'au moins 1080px ou réduire l'amplitude du mouvement (passer à static)
Produit rognéDéfinir "fit": "blur" pour ce plan
Son coupé au niveau de la transitionCela n'arrive pas (la voix-off est alignée sur le début du plan) ; si une duration personnalisée est trop courte, l'allonger
Rendu lentLe preset utilise déjà des fichiers intermédiaires veryfast ; pour l'encodage final, remplacer -preset medium par fast
Besoin de 1:1 / 16:9Utiliser --size 1080x1080 / --size 1920x1080, la taille des sous-titres s'ajuste automatiquement

Références et remerciements : L'idée s'inspire du pipeline « script→voix-off→sous-titres→assemblage » de MoneyPrinterTurbo (MIT), mais cette implémentation est une version indépendante en pur ffmpeg, sans copie de son code.

Individual skills in this repo

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

Skills associés