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.
- Divide el guion en un archivo
.txtcon una frase corta por línea (en comas/puntos/"..."), sin líneas#, sin[icon]. 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>- 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. - 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 filtrosubtitles/libass):brew install ffmpeg-fulledge-tts:pipx install edge-tts(si falla la red, fallback automático a vozsay -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; masculinavi-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.mp3omite 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énbanmai,thuminhfemenino norteño,lannhi,linhsanfemenino sureño,myanfemenino central,giahuymasculino central). Necesitaexport 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;--ratese 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/, enlaceassets.mixkit.co/videos/<id>/<id>-1080.mp4), combinar varios clips, recortar vertical,setpts=1.4*PTSpara 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: vozvi-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. --musicse 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--ratey 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.