Subtitular un video
El usuario proporciona un video de una persona hablando. Elige del catálogo de estilos de subtítulos, que se previsualizan en su propio metraje, y tú entregas el MP4 subtitulado. Todo se ejecuta localmente con HyperFrames. After Effects nunca es necesario.
Kit: .claude/skills/caption-video/kit/ dentro del repositorio del estudio. Los proyectos se crean en videos/captions/<nombre>/ y los videos terminados van a out/captions/<nombre>.mp4 (ambos relativos a la raíz del estudio).
Desde la raíz del estudio, establece K="$PWD/.claude/skills/caption-video/kit" y ejecuta python3 "$K/caption.py" … (pon las rutas entre comillas; las carpetas pueden contener espacios). Usa el python del venv del estudio (.venv/bin/python) si faltan numpy/scipy en el python del sistema — setup/setup.sh lo crea.
Flujo
1. Obtener el video
Si no se proporcionó una ruta de video, pide una. Verifica que exista y que tenga una persona hablando. Ejecuta:
python3 "$K/caption.py" new "<ruta del video>" <nombre-corto>
Esto copia el video, lo recodifica a H.264 y lo transcribe palabra por palabra con WhisperX. La primera ejecución después de un tiempo puede tomar un minuto. Los videos largos tardan aproximadamente el tiempo real ÷ 4.
2. Mostrar la transcripción
Imprime la transcripción de la salida del comando en un bloque legible. Señala cualquier error probable, especialmente nombres de marca y jerga (nombres de productos, "HyperFrames", siglas), y pide al usuario que confirme o los corrija. Las correcciones van en --fix "mal=bien,…" al momento de la construcción. Si la transcripción parece sinsentido, o el audio no tiene voz, detente y dilo. No subtitules palabras inventadas.
3. Mostrar cada estilo en su metraje
Ejecuta python3 "$K/caption.py" styles para la lista y python3 "$K/caption.py" preview <nombre> para la hoja visual. La hoja está en videos/captions/<nombre>/previews/styles.png. Mírala tú mismo, luego envíala con SendUserFile (muestra render). Junto a ella, da la lista numerada con la línea "mejor para" de cada estilo:
- Lime Hook: el aspecto de plantilla (Anton mayúsculas, palabra hablada en lima)
- Karaoke Pop: ráfagas grandes de 2 palabras, palabra hablada en amarillo
- One Word: una palabra gigante a la vez
- Clean Box: texto oscuro sobre una tarjeta blanca, resaltador en la palabra hablada
- Editorial: mayúscula y minúscula calmada, palabras clave en cursiva serif
- Subtitle: subtítulos pequeños de oraciones completas
- Neon: resplandor cian en la palabra hablada
Recomienda uno en una sola línea basado en el contenido: hype o social → 1 o 2, explicativo o anuncio → 4, historia de fundador o premium → 5, entrevista o podcast → 6, tecnología o IA → 7. Luego pídeles que elijan un número. Si el catálogo en caption.py ha cambiado, lista lo que imprima styles en lugar de esta copia.
4. Gancho (opcional)
Sugiere 3 ganchos tomados de lo que el hablante realmente dice. Lidera con el número, resultado o contradicción más sorprendente, usa de 4 a 8 palabras y mantén el remate en una palabra grande. Dale formato a cada uno en sintaxis de gancho, luego pregunta con AskUserQuestion: tres opciones de gancho más "Sin gancho" (el usuario también puede escribir el suyo propio).
La sintaxis de gancho usa una línea por |, cada una comenzando con su estilo:
s:introducción en cursiva serif ("Cómo", "Por qué")c:configuración en condensada mayúscula blancab:la palabra o número grande con aro (1–2 palabras)l:giro en lima mayúscular:etiqueta pequeña en cursiva
Ejemplo: s:Cómo|c:Llegué|b:300k+|l:sin anuncios|r:vistas. El gancho debe coincidir con lo que el video entrega en sus primeros 10 segundos.
4b. Pulido (ofrécelo; ejecútalo cuando pidan corrección de color, audio más limpio, recorte o música)
python3 "$K/polish.py" <nombre> [--grade clean|cinematic|none] [--music calm|none] [--music-level 1.0] [--denoise 100]
- Recortar: corta el silencio antes de la primera palabra y después de la última (mantiene 0.3 s y 0.9 s), y ajusta la transcripción en consecuencia.
- Corrección de color:
clean(predeterminado) da piel cálida y saludable, contraste suave y una viñeta suave.cinematices más profundo y frío. Antes de elegir, compara un fotograma de cada uno contra el original y míralo. - Voz: eliminación de ruido DeepFilterNet3 (
~/.venvs/dfn, creado por setup.sh; nunca lo instales globalmente, necesita numpy<2), luego un filtro paso alto, realce de presencia, de-esser y compresión suave. - Música: una base sintetizada de piano y pad calmados. En nivel 1 se sitúa unos 20 dB por debajo de la voz en las pausas y unos 25 dB por debajo mientras hablan. Usa
--music-level 0.6para más silencioso o1.5para más presente. - Los originales se guardan como
source_orig.mp4/transcript_orig.json, por lo que el pulido se puede volver a ejecutar con cualquier configuración. Después de pulir, ejecutabuildyrendernuevamente. - Menciona cualquier tropiezo o falso comienzo en la apertura ("en el presente, en el momento…"). Cortarlos hace un pequeño corte abrupto, así que pregunta antes de hacerlo.
5. Construir, verificar, renderizar
python3 "$K/caption.py" build <nombre> --style <clave> [--hook "…"] [--hot "palabra,palabra"] [--fix "a=b"]
cd "videos/captions/<nombre>" && npx --yes [email protected] check
python3 "$K/caption.py" render <nombre>
--hotlista las palabras que permanecen en el color de acento. Elige 2–5 palabras de remate; los números se marcan como hot automáticamente.checklas advertencias de contraste en el momento de desvanecimiento del gancho son esperadas. Corrige cualquier error real antes de renderizar.- Antes de renderizar un gancho, haz una captura instantánea (
npx --yes [email protected] snapshot . --at 1.6 --no-end --describe false) y verifica que no cubra la cara. Cuando la cara esté alta en el encuadre (persona sentada o plano medio), mueve el gancho al pecho con--hook-y 0.43; el sombreado lo sigue automáticamente. - Antes de enviar, extrae 3–4 fotogramas de
out/captions/<nombre>.mp4y míralos. Los subtítulos no deben cubrir la boca ni los ojos. Si lo hacen, reconstruye con--cap-y(número más alto = más abajo en la pantalla). - El metraje filmado de lado (una cámara girada de lado, sin metadatos de rotación) muestra a la persona acostada de lado en la hoja de contactos. Gíralo primero (
ffmpeg -vf transpose=2= 90° antihorario, otranspose=1= horario; verifica un fotograma) dentro devideos/_caption-inputs/, luego ejecutanewen ese archivo. - Envía el MP4 con
SendUserFiley da su ruta como enlace.
6. Revisiones
La configuración persiste en videos/captions/<nombre>/caption.json, por lo que una revisión es solo build <nombre> --<opción> … seguido de render <nombre>. Solicitudes comunes:
- Estilo diferente:
--style. - Más grande o más pequeño:
--size 1.2. - Más arriba o más abajo:
--cap-y 0.7. - Menos palabras por subtítulo:
--words 2. - Color diferente:
--accent "#FF4D3D". - Cambiar el gancho:
--hook;--hook ""lo elimina. - Longitud del gancho:
--hook-dur 3.5.
También pueden abrirlo en HyperFrames Studio ellos mismos con cd videos/captions/<nombre> && npm run dev.
Datos de configuración (si algo falla)
- La transcripción llama a
~/.claude/skills/embedded-captions/scripts/transcribe.cjsconHYPERFRAMES_ROOT=~/.hyperframes-root, una instalación de HyperFrames CLI 0.8.147 con un enlace simbólicopackages/cli/dist/cli.js. Si falta alguno, reinstala:npx hyperframes skills update embedded-captions, luego reconstruye~/.hyperframes-root(npm install[email protected]y enlaza simbólicamentenode_modules/hyperframes/dist/cli.jsapackages/cli/dist/cli.js). - Las fuentes están en
kit/fonts/(todas SIL OFL) y se copian en cada proyecto. setup/doctor.shverifica cada componente debajo;setup/setup.shlos repara.- Los subtítulos que van detrás de la persona son posibles con el flujo de trabajo
/embedded-captions, pero es mucho más lento (aproximadamente 4 minutos por cada 10 segundos) y necesitaHYPERFRAMES_ROOTconfigurado. Ofrécelo solo si te lo piden.