Communitygithub.com

xiaocong3/ecommerce-video-skills

ffmpeg 自动拼接成片:一条命令把 storyboard.json(商品图/视频片段 + 口播稿)渲染成带配音、字幕花字、转场、BGM 自动闪避、响度标准化的 9:16 MP4,纯本地运行。

¿Qué es ecommerce-video-skills?

Este skill permite a un agente de IA (como Claude Code, Cursor o Codex) ensamblar y renderizar automáticamente videos de productos cortos (9:16) a partir de un archivo `storyboard.json`. Convierte una secuencia de imágenes, videoclips y un guion de voz en off en un video MP4 completo con locución generada por IA (edge-tts), subtítulos estilizados (ASS), transiciones suaves (xfade), música de fondo con ducking automático y normalización de sonido profesional (-14 LUFS). Está diseñado para ejecutarse completamente en local, utilizando solo Python, ffmpeg y dependencias ligeras. Es ideal para la producción en masa de videos promocionales para comercio electrónico, eliminando la necesidad de editores de video humanos o servicios en la nube. El skill incluye scripts auxiliares para generar voces en off, subtítulos, tarjetas de producto y música de fondo libre de derechos, y se integra con otros skills del repositorio para generar storyboards y exportar a diferentes plataformas.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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

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

Parte de ecommerce-video-skills · Los scripts están en el directorio scripts/: assemble.py (programa principal) · tts_edge.py · make_subs.py · make_bgm.py (síntesis de BGM libre de derechos) · make_cards.py (tarjetas de producto/final con PIL)

Entradas Inputs

  • storyboard.json (puede ser generado por selling-point-storyboard), las rutas de los recursos son relativas a este archivo
  • Entorno: Python 3.9+, pip install pillow numpy edge-tts, ffmpeg (con libass), fuente CJK

Inicio rápido Quick start

pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4       # Ejemplo incluido en el repositorio, renderiza en ~30 segundos
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4             # Vista previa sin conexión (sin locución, estima duración por número de caracteres)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4      # Video de imagen principal 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3                           # Usar música con derechos de autor

Campos de storyboard Fields

CampoDescripción
voice / rate / pitch (nivel superior)Voz edge-tts, velocidad (ej. +10%), tono
bgm (nivel superior)"auto" (síntesis integrada, libre de derechos) / ruta de archivo de música / null
tag (nivel superior)Etiqueta en la esquina superior izquierda durante todo el video (marca/modelo/"demostración")
image o video (+start)Recurso; el video se recorta desde el segundo start hasta la duración del plano
lineTexto de la locución; la duración del plano = locución + 0.15s de introducción + pad
subSubtítulo (por defecto igual que line); "" significa que no se muestra subtítulo en este plano; **resaltado**, `
title / ctaTexto estilizado / Botón de llamada a la acción
motionzoom_in zoom_out pan_left pan_right pan_up pan_down punch static
fitauto (si la relación de aspecto es similar, recorta; de lo contrario, relleno borroso) / cover / blur
transitionNombre del xfade para la transición al siguiente plano: fade slideleft slideup smoothleft circleopen wipeleft …
min / duration / padDuración mínima / Duración fija / Pausa después de la frase (segundos)

Pasos Steps

  1. Verificar que todos los recursos existan y tengan una resolución adecuada (imagen del producto ≥ 1000px); si falta la tarjeta final, generarla con make_cards.py: python scripts/make_cards.py --image main.png --name "Nombre del producto" --points "Punto de venta 1|Punto de venta 2|Punto de venta 3" -o assets/end-card.png
  2. Ejecutar primero con --tts none para revisar el ritmo visual, luego renderizar la versión final.
  3. Después del renderizado, extraer un fotograma para verificar: ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png
  4. Entregar a platform-spec-export para exportar versiones para cada plataforma; usar cover-title-ab para la miniatura.

Detalles del pipeline How it works

  • Ken Burns: scale(eval=frame)+crop cuadro por cuadro, menos tembloroso que zoompan; punch = acercamiento rápido de 0.35 segundos (para enganche).
  • Transiciones: Cada plano renderiza media longitud de transición extra, xfade centrado en el límite del plano, el punto de inicio de la locución no se pierde en la transición.
  • Mezcla de audio: La locución se coloca en el inicio de cada plano; el BGM por defecto a -20 dB, se reduce 10 dB adicionales cuando hay voz (ducking suave); se comprime/limita y luego se normaliza con loudnorm dos veces hasta aproximadamente -14 LUFS, TP -1.5 dB.
  • Subtítulos: Se genera build/timing.json con la duración real de la locución → make_subs.py → libass para quemar subtítulos, exportando también .srt.

Lista de verificación Checklist

  • La duración, resolución y tasa de fotogramas del video final son correctas (ffprobe out/video.mp4)
  • Revisar 3 fotogramas: los subtítulos no tapan el producto ni invaden la zona inferior de la interfaz
  • Escuchar una vez: la locución es clara, el BGM no la opaca, no hay estallidos al inicio
  • El BGM tiene licencia comercial (la música sintetizada con auto se puede usar con confianza)
  • Los recursos (imágenes/videos/fuentes) tienen licencia de uso

Problemas comunes y soluciones Failure fixes

ProblemaSolución
ffmpeg failedMirar el final del stderr impreso por el script; comúnmente es un error de ruta o que ffmpeg carece de libass/libx264
Los bordes del video se ven borrososLa resolución del recurso es demasiado baja; usar imágenes de ≥1080px o reducir la amplitud del movimiento (motion a static)
El producto se cortaEn ese plano, establecer "fit": "blur"
El sonido se corta en la transiciónNo ocurre (la locución se alinea con el inicio del plano); si se personalizó duration y es demasiado corta, alargarla
Renderizado lentoLa configuración por defecto ya usa archivos intermedios veryfast; en la codificación final se puede cambiar -preset medium a fast
Se desea 1:1 / 16:9--size 1080x1080 / --size 1920x1080, el tamaño de la fuente se ajusta automáticamente según la proporción

Referencias y agradecimientos: La idea se inspira en el pipeline "guion → locución → subtítulos → ensamblaje" de MoneyPrinterTurbo (MIT), esta implementación es una versión independiente y pura de ffmpeg, sin copiar su código.

Individual skills in this repo

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

Skills relacionados