Communitygithub.com

LeAnhTuanIT/short-video

Crea videos verticales 9:16 (TikTok/Reels/Shorts) para cualquier tema, con locución en vietnamita (u otros idiomas) y subtítulos incrustados, a partir de un guion generado por Claude o proporcionado por el usuario.

¿Qué es short-video?

Esta habilidad (skill) permite a un agente AI (como Claude) crear videos cortos verticales estilo TikTok/Reels/Shorts de forma completamente automatizada. El pipeline toma un guion en texto plano, usa `edge-tts` para generar locución (o acepta un archivo de audio ya generado), sincroniza los subtítulos con la duración real del audio, y compone el video final con un fondo (de usuario o gradiente por defecto) y música opcional usando `ffmpeg`. Soporta múltiples estilos visuales: 'night' (phố đêm) con subtítulos karaoke y efectos neón, y 'ui' (tutorial tecnológico) con ventanas y pasos simulados. Está diseñado para macOS y Ubuntu/Debian (Windows via WSL), y utiliza recursos locales sin depender de APIs de nube para la generación de video, garantizando privacidad y bajo costo. La habilidad también guía al usuario en la creación de guiones efectivos para redes sociales, ajustando duración, ritmo y tono según el tema, y permite refinar el resultado mediante comandos de verificación y regeneración.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/LeAnhTuanIT/short-video-skill/tree/HEAD

Preguntar en tu IA favorita

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

Documentación

Video corto con locución + subtítulos

Pipeline: guion .txt → make_video.py (edge-tts lee cada oración → combina audio → subtítulos ASS según duración real → fondo + quemar subtítulos con ffmpeg) → MP4 1080x1920.

Modo confirmado: voz existente → video (usado por defecto cuando el usuario envía mp3)

El usuario genera la voz en EverAI (web, velocidad 0.85), envía mp3 + guion. No se llama a API, no se clona voz, no se ejecuta modelo de voz (VieNeu) en la máquina.

  1. Divide el guion en un archivo .txt con una frase corta por línea (en comas/puntos/"..."), sin líneas #, sin [icon].
  2. python3 make_video.py guion.txt ~/Downloads/<nombre>.mp4 --audio voz.mp3 --style night --no-wave --bg assets/pho-dem.mp4 --target <duración±5>
  3. Imprime marcas por línea: ejecuta el comando anterior añadiendo --print-timing (sin renderizar). Verifica: líneas anormalmente largas/cortas en comparación con el número de caracteres → combina/divide y renderiza de nuevo.
  4. Extrae 1–2 fotogramas para verificar subtítulos, informa la ruta + duración. Si no se oye sonido, normalmente es porque Mac está emitiendo por AirPods. Instrucciones para el usuario: HUONG-DAN.md.

Instalación en otra máquina

Copia toda la carpeta ~/.claude/skills/short-video/ a la nueva máquina (misma ruta), luego ejecuta bash ~/.claude/skills/short-video/setup.sh. Compatible con macOS y Ubuntu/Debian; Windows usar a través de WSL. El fondo de noche urbana está incluido: assets/pho-dem.mp4 (stock Mixkit, uso comercial permitido).

Requisitos (ya instalados en esta máquina)

  • ffmpeg-full (necesita filtro subtitles/libass): brew install ffmpeg-full
  • edge-tts: pipx install edge-tts (si falla la red, fallback automático a voz say -v Linh)

Paso 1 — Definir el brief

Obtener de la solicitud; si falta, usar valores predeterminados, solo preguntar cuando el tema no está claro en absoluto:

  • Tema / enfoque — si no hay un enfoque específico, elegir uno atractivo y concreto.
  • Duración — por defecto 45–60s.
  • Voz — por defecto femenina vi-VN-HoaiMyNeural; masculina vi-VN-NamMinhNeural. Otros idiomas: edge-tts --list-voices | grep <código> (ej. en-US-AriaNeural).
  • Fondo / música — imagen/video proporcionado por el usuario; si no, fondo degradado por defecto.

Paso 2 — Escribir el guion

Guardar archivo .txt, primera línea es título, cada línea siguiente es una oración a leer:

# Título corto que aparece al inicio de la pantalla (≤ 6 palabras)
Frase gancho que despierte curiosidad, ≤ 12 palabras.
Frase de contenido...
Frase final + llamada a la acción.

Reglas:

  • Duración en vietnamita: ~2.3 palabras/segundo (medición real: 155 palabras ≈ 65s). 45–60s → 110–140 palabras; 30s → ~65 palabras; 15s → ~30 palabras.
  • Cada línea una oración, 8–20 palabras. Los primeros 3 segundos son el gancho (pregunta / dato sorprendente). Medio: 3–5 ideas concretas y fáciles de recordar. Final: CTA (guardar, seguir, comentar).
  • Los datos deben ser precisos; temas de salud/finanzas/legal: no diagnosticar, no dar consejos específicos como experto, sugerir consultar a un especialista cuando sea necesario.
  • Escribir números/símbolos en letras cuando la lectura pueda ser incorrecta ("cuatro - siete - ocho" en lugar de "4-7-8", "por ciento" en lugar de "%"). Evitar emojis, caracteres {} \.

Dejar que el usuario revise el guion antes de renderizar, a menos que ya haya proporcionado el contenido o haya dicho que lo haga directamente.

Paso 3 — Renderizar

python3 ~/.claude/skills/short-video/make_video.py guion.txt salida.mp4 \
  [--voice vi-VN-HoaiMyNeural] [--rate -5%] [--target 45-60] \
  [--bg imagen_o_video_fondo] [--music musica_fondo.mp3] [--gap 0.35] \
  [--pitch -8Hz] [--style default|night]
  • Voz existente: --audio voz.mp3 omite TTS. El guion debe coincidir con la lectura, cada línea una frase corta (dividir en comas/puntos); las marcas de tiempo se alinean con las pausas. Imprimir marcas con --print-timing (normalmente ~12–16 caracteres/segundo); si alguna línea es anormalmente larga/corta, combinar/dividir líneas y renderizar de nuevo.
  • FPT.AI: --engine fpt --voice leminh (masculino norteño; también banmai, thuminh femenino norteño, lannhi, linhsan femenino sureño, myan femenino central, giahuy masculino central). Necesita export FPT_API_KEY=... (clave en console.fpt.ai, plan Free Tier 100.000 caracteres/mes). Sin marcas por palabra, por lo que el karaoke divide según la longitud de la palabra; --rate se aplica con atempo. No registrar nunca la clave en el archivo de skill.
  • Todos los motores tienen un ritmo de lectura natural (ligeras variaciones de velocidad/tono por oración, pausas más largas después de preguntas) + procesamiento de voz cálida, compresión, ligero eco. Escribir el guion como lenguaje hablado, usar "..." y puntos entre oraciones para crear pausas.
  • Voz masculina norteña grave y madura (edge): --voice vi-VN-NamMinhNeural --pitch=-8Hz --rate=-10% (NamMinh es la única voz masculina vi).
  • --style night --no-wave + guion sin líneas #, sin etiquetas [icon] → solo fondo + subtítulos.
  • --style night (estilo reel "noche urbana"): título en mayúsculas con espaciado, color teal + subrayado, íconos neón de trazo fino, subtítulos en mayúsculas karaoke palabra por palabra (marcas de tiempo reales de edge-tts), onda de sonido en barras. Colocar [icon] al inicio de la línea para cambiar el ícono desde esa línea: sun hourglass gift heart leaf book star eye. El fondo debe ser un video real de noche urbana: stock gratuito en Mixkit (https://mixkit.co/free-stock-video/night-city-street/, enlace assets.mixkit.co/videos/<id>/<id>-1080.mp4), combinar varios clips, recortar vertical, setpts=1.4*PTS para ralentizar.
  • --style ui (video tutorial tecnológico): fondo oscuro con cuadrícula, barra de serie (título #) + recuadros de paso 1..n, ventana de aplicación simulada, terminal tecleando, marco de subtítulo resaltado en naranja con *palabras clave*. Etiquetas al inicio de línea: [step:Nombre del paso] (cambiar al siguiente paso), [card:Título|elemento 1|elemento 2] (ventana, se mantiene hasta la siguiente escena), [term:comando]. Las combinaciones de teclas se escriben en letras ("Comando, Mayús, tres"), pero dentro de la tarjeta se escribe "Comando + Mayús + 3". Ejemplo: voz vi-VN-NamMinhNeural --pitch=-4Hz --rate=+15% --gap 0.25.
  • Sin --bg → fondo degradado azul-violeta oscuro con movimiento lento (adecuado para temas suaves; para temas dinámicos, pedir imagen/video de fondo). Imagen → efecto zoom lento. Video → se repite automáticamente.
  • --music se reduce al 12% de volumen, fundido al final.
  • El script imprime la duración y una advertencia si está fuera de --target → añadir/quitar oraciones o ajustar --rate y renderizar de nuevo.

Paso 4 — Verificar

Extraer 1 fotograma para comprobar si los subtítulos tienen signos rotos o desbordamiento: ffmpeg -v error -y -ss 5 -i salida.mp4 -frames:v 1 frame.jpg luego leer frame.jpg. Informar al usuario la ruta absoluta del video y la duración.

Ejemplo de guion: example-sleep.txt en la carpeta del skill.

Skills relacionados