Editar vídeos con Claude Code: la skill que corta, subtitula y renderiza sola
Cómo funciona una skill de edición de vídeo para Claude Code: transcripción por palabras, cortes en el borde del habla, karaoke, overlays en Skia y render HEVC con ffmpeg.

Fundador de Aducti. Software e IA.
Lo que hago para editar un reel es pasarle los archivos a Claude Code y decirle que los edite con la skill. Nada más. En diez o quince minutos, contando los cambios que le pido por el camino, tengo el MP4 listo para subir con los cortes hechos, los subtítulos sincronizados palabra a palabra, las animaciones y los zooms.
No es magia ni un modelo que "entiende vídeo". Es una tubería bastante concreta, y la parte interesante es que casi todo el trabajo lo hace ffmpeg y un canvas; el modelo solo decide dónde va cada cosa.
Por qué una skill y no un prompt largo
Una skill en Claude Code es una carpeta con un SKILL.md y documentos de apoyo que el agente carga cuando la invocas. La diferencia con pegar instrucciones en el chat es que la skill fija el criterio: dónde se corta, a qué altura va el subtítulo, cuántos zooms como máximo, qué está prohibido.
Sin eso, cada vídeo sale distinto. Con eso, los cincuenta vídeos siguientes salen iguales sin que tengas que repetir nada.
En mi caso el SKILL.md es corto y manda a documentos separados según la tarea: montaje y karaoke, overlays, recetas de animación, zoom Ken Burns, b-roll. El agente abre solo el que necesita.
Paso 1: transcripción por palabras, no por frases
Todo lo demás depende de esto. Se transcribe con faster-whisper pidiendo marcas de tiempo por palabra:
segmentos, info = modelo.transcribe(
archivo,
language="es",
beam_size=5,
vad_filter=True,
condition_on_previous_text=False,
word_timestamps=True,
)Con los tiempos por palabra puedes hacer karaoke de verdad (que la palabra se encienda cuando se dice) y, más importante, puedes cortar por contenido en vez de por energía de audio.
Paso 2: cortar en el borde del habla
Aquí está el detalle que más cambia el resultado. Whisper miente en los bordes: mete el silencio anterior dentro del primer token de cada bloque, así que si cortas donde te dice la primera palabra, te comes medio segundo de nada al principio.
La solución es cruzar las palabras con los silencios reales medidos aparte:
ffmpeg -i audio.wav -af "silencedetect=n=-36dB:d=0.20" -f null -Y ajustar: si el inicio de una palabra cae dentro de un silencio detectado, se mueve al final de ese silencio. Con eso el vídeo arranca justo en la sílaba, sin lead. En un reel de 30 segundos esto son dos o tres segundos de aire muerto que desaparecen.
En un vídeo real de tres tomas, esto me quitó 44 segundos de silencio en medio de un archivo, más las colas de los otros dos, sin que hubiera que mirar la línea de tiempo ni una vez.
Paso 3: el karaoke
Reglas que están en la skill y no se negocian por vídeo:
- Bloques de 1 a 3 palabras, máximo unos 14 caracteres
- Blanco sobre el vídeo, sin placa gris; la palabra activa con fondo
#146CFF - Inter en peso 800, unos 168 px sobre un lienzo de 2160 de ancho
- El bloque centrado al 63 % de la altura, o al 70-73 % si tapa la boca
Ese último punto parece una tontería y es la diferencia entre que se vea profesional o no. En plano cerrado hablando a cámara, el subtítulo al 63 % cae justo en los labios.
Paso 4: overlays con Skia, no con un navegador
Los overlays (tarjetas de producto, teclas, el pill del gancho, el CTA) se pintan como PNG con Skia desde Node, un frame por fotograma, repartido en doce workers. Los frames que no cambian se deduplican y se enlazan en duro, así que un vídeo de 30 segundos a 30 fps no pinta 900 imágenes sino las que de verdad son distintas.
La escena es un JSON que el script de Python genera desde la transcripción, con los tiempos ya en coordenadas de la composición:
{
"kind": "cta",
"start": 35.13,
"end": 38.09,
"top": 0.20,
"word": "EDITOR",
"anim": true
}Nada de Playwright ni de renderizar HTML en un navegador headless. Es más rápido y no depende de que un Chrome pinte igual dos veces.
Paso 5: zoom y render
El zoom Ken Burns se aplica en el propio ffmpeg al construir la base, con zoompan y una expresión pura del tiempo, para que sea determinista y se pueda buscar en cualquier punto:
zoompan=z='if(lt(in_time,2.9),1,...)':x='(iw-iw/zoom)*0.5':y='(ih-ih/zoom)*0.4':d=1Dos a cuatro zooms por vídeo, siempre anclados a una palabra concreta. Si todo respira, no respira nada.
El render final sale en HEVC con NVENC, etiqueta hvc1, 1080x1920 a 30 fps y unos 8 Mbps. La etiqueta importa: con hev1 el iPhone se niega a reproducirlo.
El bucle real de trabajo
El preview se hace a 540p en unos quince segundos. Miras el MP4, dices "los overlays más abajo, que en TikTok se recorta arriba", el agente ajusta las coordenadas, vuelve a exportar, y cuando te gusta lanzas el final. La conversación es la interfaz; no hay línea de tiempo que arrastrar.
Lo que todavía no hace bien
No elige el b-roll por ti, no sabe si tu cara sale mal en un plano y no juzga si el gancho funciona. Corta bien, subtitula perfecto y anima con criterio, pero las decisiones de qué contar siguen siendo tuyas. Que es exactamente donde quieres seguir estando.
Recursos relacionados
Dónde se van tus tokens de Claude Code: el informe que ya tienes en tu ordenador
El comando /insights analiza tus sesiones y te genera un HTML. Y por qué acortar prompts no sirve de nada: el 97 % de tus tokens es Claude releyendo.
/grill-me: el comando que obliga a Claude a preguntar antes de escribir código
Cómo funciona la entrevista por rondas de /grill-me, los tres ficheros para instalarlo y el orden en el que conviene usarlo.