Communitygithub.com

editar-reel

Edita los reels del usuario (vídeos verticales hablando a cámara para Instagram) con su flujo aprobado: transcripción local con Whisper, quitar silencios/muletillas/tomas repetidas, gancho en mayúsculas, titulares con gráfico animado cada 2-3 s, logos reales de marcas, subtítulos de una línea, efectos de sonido calibrados, voz a -14 LUFS y render con HyperFrames. Úsala siempre que pida editar, montar, cortar, subtitular o "dejar listo" un reel, un clip de CapCut o un vídeo vertical suyo, aunque

What is editar-reel?

editar-reel is a Claude Code agent skill that edita los reels del usuario (vídeos verticales hablando a cámara para Instagram) con su flujo aprobado: transcripción local con Whisper, quitar silencios/muletillas/tomas repetidas, gancho en mayúsculas, titulares con gráfico animado cada 2-3 s, logos reales de marcas, subtítulos de una línea, efectos de sonido calibrados, voz a -14 LUFS y render con HyperFrames. Úsala siempre que pida editar, montar, cortar, subtitular o "dejar listo" un reel, un clip de CapCut o un vídeo vertical suyo, aunque.

Works with✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Alexandrevnc/editar-reel/tree/HEAD

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Editar un reel

Este es el flujo ya aprobado con el reel de WhatsApp (references/ejemplo-whatsapp.reel.json). El objetivo es que el próximo reel salga igual sin que tenga que volver a explicarlo: mismo estilo, mismos criterios, mismas comprobaciones. Háblale en español y sin jerga técnica innecesaria.

Antes de nada: perfil e instalación

Lee ~/.claude/skills/editar-reel/perfil.json (nombre del usuario, su marca, el logo del cierre y dónde guarda los clips). Llámale por su nombre y usa su carpeta de clips en el paso 1. Si no existe perfil.json, o falta alguna herramienta del entorno, es la primera vez en este Mac: sigue INSTALAR.md (instalar todo y crear el perfil) antes de editar nada.

Entorno (lo deja listo install.sh, ver INSTALAR.md)

  • HyperFrames CLI: ~/.npm-global/bin/hyperframes (telemetría desactivada). Exporta siempre PATH="$HOME/.npm-global/bin:$PATH" HYPERFRAMES_NO_TELEMETRY=1 HYPERFRAMES_SKIP_SKILLS=1; el shell de Claude no carga ~/.zshrc.
  • faster-whisper: ~/.venvs/whisper/bin/python (con av<16; la versión nueva de PyAV rompe faster-whisper).
  • FFmpeg en /opt/homebrew/bin. python3 del sistema (3.9) sirve para los scripts sin numpy.
  • Librería de efectos de sonido: ~/Movies/Reels/_sfx/. Los 13 originales (whoosh_1/2, pop_1/2, tick, ding, message, counter, typing, clock, slide, hit, riser) suenan solos con los gráficos; estilo "sonidos de Apple": cortos, limpios, suaves. Hay ~45 más (impactos, whooshes, caja registradora, clics, iPhone…) para usar a mano: catálogo y cuándo usar cada uno en references/sfx.md.
  • Scripts de esta skill: SK=~/.claude/skills/editar-reel/scripts.
  • Logo del cierre: el de perfil.json (cierre). El de vinagre.tech, vectorizado, está en assets/vinagre-tech/; el de otra marca se guarda en assets/marca/ (ver INSTALAR.md).

Estilos

El usuario pide los reels por estilo ("edítalo con el estilo 2"). Si no dice ninguno, usa el estilo 1. Todos comparten el flujo de abajo (transcribir, cortar, QA, sonidos, master); cambia el paso 5–6. Todos terminan con el cierre del logo de su marca (el de perfil.json; 1,6 s, fondo blanco, scripts/outro.py): el vídeo nunca acaba de golpe. Sale por defecto (salvo "cierre": null en el perfil); "outro": null en reel.json lo quita, "outro": {"bg": "#000"} lo cambia.

EstiloQué esScriptReferencia
1 · TarjetaTitular con gráfico en tarjeta oscura arriba cada 2–3 s + subtítulo pequeño de una línea abajo.build.pyreferences/ejemplo-whatsapp.reel.json
2 · FrasesFrase grande abajo en blanco (lo que viene, translúcido), palabra clave en píldora, iconos en línea y flotantes, pocas tarjetas blancas y planos de gráfico a pantalla completa.build_frases.pyreferences/estilo-frases.md
3 · CineClip horizontal en franja de cine 16:9 sobre negro (franjas despejadas), color cálido, zoom lento, subtítulos pequeños en minúsculas a los dos lados de la cara, palabra final grande en mayúsculas. Para vídeos cercanos o emotivos.cut_cine.py + build_cine.pyreferences/estilo-cine.md

Movimiento v2 (aprobado el 02-11-2026, por defecto en el estilo 1): reglas de references/motion-reglas.md (titulares que ruedan, cifras que ruedan dígito a dígito, gráficos que llegan enteros). Los reels hechos antes llevan "anim": 1 en su reel.json para que un retoque no les cambie el movimiento que ya aprobó.

Los estilos 1 y 2 pueden llevar además planos motion a pantalla completa (terminal de Mac, rejilla de puntos con una cifra, órbita de tarjetas), en "motion" de reel.json: lee references/motion.md para saber cuándo y cómo.

Cuando el usuario pida cambios a un estilo y los apruebe, guárdalos en el script y la ficha de ese estilo. Si quiere algo nuevo, crea un estilo nuevo (4, 5…) en vez de cambiar uno aprobado. Hazle primero una muestra de ~10 s ("sample_end" en reel.json, estilos 2 y 3) antes de montar el reel entero.

Estructura de cada reel

~/Movies/Reels/<nombre-corto>/
  reel.json            lo propio de este reel (lo escribes tú; formato en references/reel-json.md)
  work/                transcripciones, cortes, fotogramas de QA, render intermedio
  proyecto/            proyecto HyperFrames (index.html generado + assets/)
  reel-<nombre>.mp4    el entregable
  portada-<nombre>.jpg la portada para Instagram (paso 8b)

Flujo

1. Localizar el clip

Suele estar en la carpeta clips de perfil.json (por defecto ~/Movies/CapCut/) o en sus subcarpetas. Si hay más de un candidato y no está claro cuál es, pregunta con opciones (nombre, duración, fecha); editar el equivocado cuesta mucho tiempo. Comprueba con ffprobe resolución, fps y duración.

2. Transcribir

mkdir -p ~/Movies/Reels/<n>/work
~/.venvs/whisper/bin/python -I $SK/transcribe.py "<clip>" ~/Movies/Reels/<n>/work medium es

Crea src.words.json (palabras con tiempos), fillers.txt (pasada que fuerza a Whisper a escribir "eh", "mmm", "o sea"; normalmente se las come) y silences.json. Lee las tres cosas.

3. Decidir qué quitar (criterio tuyo)

  • Tomas repetidas: si repite una frase o la empieza y la corta, quédate con la última toma y quita las anteriores.
  • Muletillas: las que aparezcan en fillers.txt y no en la limpia.
  • Silencios: no hace falta marcarlos; cut.py quita los ≥0,2 s dejando 0,07 s de aire a cada lado. Apunta los rangos (tiempo original) en remove de reel.json, junto con source. Si no hay nada, "remove": [] y díselo ("no había muletillas ni tomas repetidas", si es el caso: lo comprobaste, no lo supongas).
cd ~/Movies/Reels/<n> && hyperframes init proyecto --example blank --resolution portrait --non-interactive
python3 -I $SK/cut.py ~/Movies/Reels/<n>

Crea el proyecto HyperFrames (antes de cortar: init necesita que la carpeta proyecto no exista) y luego corta, saca 1080×1920 a 30 fps y deja la voz a -14 LUFS en proyecto/assets/cut_norm.mp4; las palabras con tiempos nuevos quedan en work/cut.words.json.

4. Mirar el encuadre

Saca una tira de fotogramas (ffmpeg -i proyecto/assets/cut_norm.mp4 -vf "fps=1/5,scale=270:-1,tile=6x1" -frames:v 1 work/contact.png) y localiza la cara: en el reel de referencia iba de ~520 a ~1160 px en vertical, con pared libre a la derecha. El titular va encima de la cabeza (tarjeta de 170 a 430 px), los subtítulos sobre la camiseta por debajo del micrófono de solapa, el logo de la intro en la pared junto a la cabeza. Si este clip tiene otro encuadre, ajusta layout y la posición de logos en reel.json.

5. Escribir el contenido en reel.json

Lee references/reel-json.md y references/graficos.md. Lo que está decidido:

  • Gancho (0–2 s): dos líneas grandes en MAYÚSCULAS, cajas amarillas con texto negro. Una pregunta o afirmación que resuma el dolor que plantea el vídeo, no una frase literal. Visible desde el primer fotograma.
  • Titulares: 2–5 palabras, cambian cada 2–3 s, resumen lo que dice en ese tramo, cada uno con su gráfico animado.
  • Logos: cada vez que nombre una herramienta o marca, su logo real (Simple Icons; si no está, el SVG oficial de su kit de prensa en proyecto/assets/logos/<slug>.svg). Nunca un logo inventado o aproximado.
  • Subtítulos: pequeños, una línea, abajo, palabra activa en el color de acento. Corrige en fixes los errores de Whisper que veas (nombres propios, "una gente" → "un agente", etc.).
  • Planos motion (opcional, uno o dos por reel): cuando diga que le pide algo a Claude o explique pasos de una automatización → terminal; cuando suelte una cifra → dots; cuando haga la cuenta de lo que se gana o pierde al año → months; «mira todo lo que he montado» → orbit; le escriben clientes o le llegan mensajes → notify; dice una cifra de ingresos o resultados → chart. Se quieren: dan respiro al vídeo (ofrécele uno si no hay). Ver references/motion.md. Proponlos solo si cuentan lo que dice; si dudas, pregúntale.
  • Llamada final: si pide escribir una palabra o nombra la marca, último bloque con "graphic": "logo" y un ding en sfx_extra justo cuando dice esa palabra.
  • Sonidos literales (opcional): cuando diga algo con un sonido propio (dinero → cash, soltar el móvil → iphone_lock, escribir un mensaje → phone_typing), añádelo en sfx_extra en esa palabra. Lee references/sfx.md; uno o dos por cada 10 s como mucho, y los memes solo si los pide.

6. Preparar sonidos y generar la composición

python3 -I $SK/prep_sfx.py ~/Movies/Reels/_sfx ~/Movies/Reels/<n>/proyecto/assets/sfx
python3 -I $SK/build.py ~/Movies/Reels/<n>
cd ~/Movies/Reels/<n>/proyecto && hyperframes lint

prep_sfx quita el silencio inicial de cada sonido (si no, suena tarde respecto a la animación), recorta los largos con fundido y los iguala a -3 dBFS de pico. El riser se recorta para que acabe en su punto álgido (0,2–2,0 s del archivo actual); si cambia el archivo, mira su envolvente y ajusta SPEC. En lint son esperables y se ignoran: nested_structure_needs_subcomposition y timeline_track_too_dense. Cualquier error, o un aviso de otro tipo, se arregla.

7. Control de calidad de fotogramas (antes de renderizar, siempre)

Saca un fotograma de cada bloque, a mitad del bloque cuando la animación ya ha terminado:

hyperframes snapshot --at <gancho≈1.0>,<cada bloque: start+1.3>,... --no-end --describe false -o ../qa

Móntalos en una hoja (ffmpeg -pattern_type glob -i 'qa/frame-*.png' -vf "scale=360:-1,tile=6x2" ...), míralos y amplía las zonas dudosas (recortes a tamaño real de la tarjeta y de los subtítulos). Busca y arregla:

  • texto cortado o que se sale de la tarjeta / una palabra sola en una línea;
  • algo encima de la cara (en cualquier bloque, también con el zoom de 1,08 de los cortes);
  • poco contraste (texto claro sobre pared blanca → necesita fondo oscuro);
  • subtítulos tapando el micrófono de solapa o el logo de la camiseta de forma fea;
  • un gráfico que no se entienda o se vea raro (pasó con el primer head: se rehízo). Repite snapshot tras cada arreglo. Las manos pasando por delante de los subtítulos no se pueden evitar; no es un fallo.

Comparar con el oro. references/oro/ tiene la hoja de 12 fotogramas de los reels aprobados de cada estilo (estilo1-whatsapp, estilo1-18k, estilo2-fras, estilo3-reto40). Tras el render (paso 8) saca la del reel nuevo con python3 -I $SK/hoja.py <reel>.mp4 work/hoja.png, ponla al lado de la de su estilo y responde: ¿cuál de las dos está más vacía, más plana o con los gráficos más pequeños? Si es la nueva, eso es lo primero que se arregla. Cuando el usuario apruebe un reel que se vea mejor que el oro de su estilo, añade su hoja a references/oro/.

8. Renderizar, comprobar el audio y masterizar

hyperframes render --fps 30 -o ../work/render_mix.mp4
~/.venvs/whisper/bin/python -I $SK/measure_sfx.py ~/Movies/Reels/<n> ~/Movies/Reels/<n>/work/render_mix.mp4
python3 -I $SK/master.py ~/Movies/Reels/<n>/work/render_mix.mp4 ~/Movies/Reels/<n>/reel-<n>.mp4
  • measure_sfx dice cuánto suena cada efecto respecto a la voz. Objetivo: golpe -6 dB, ding -8, message ≈-8, pop/whoosh/slide -11 a -13, tick -14, reloj/contador/riser -16, tecleo -18 a -20. Si alguno se desvía >2 dB (p. ej. porque cambió un archivo de _sfx), corrígelo con sfx_vol y vuelve a renderizar. Que un efecto suene más que la voz es el fallo grave: tapa lo que dice.
  • master.py lleva el reel a -14 LUFS (pico -1,5 dB) copiando el vídeo sin tocarlo. Hace falta porque el mezclador de HyperFrames baja la mezcla ~1,8 dB y la deja en ~-16 LUFS.
  • Verifica el entregable: 1080×1920, 30 fps, duración esperada, -14 LUFS.

8b. Portada

python3 -I $SK/cover.py ~/Movies/Reels/<n>

Fotograma limpio del vídeo con el gancho en cajas amarillas, centrado en la franja que Instagram enseña en la cuadrícula del perfil (3:4), para que en el feed se lea de qué va cada vídeo. Deja portada-<n>.jpg y work/portada-feed.png (cómo se verá recortada). Va con el título en el centro (decidido el 02-11-2026, aunque tape parte de la cara; en el vídeo el gancho sigue arriba, encima de la cabeza). Mírala: el fotograma ("cover": {"at"}) tiene que tener buena cara y nada cortado. "cover": {"y"} o python3 -I $SK/cover.py <reel> 560 solo si pide otra altura. El usuario la sube al publicar en «Editar portada → Añadir desde el carrete».

9. Entregar

Dile dónde están el .mp4 y la portada, y resume en pocas líneas: cuánto se recortó (de X s a Y s y qué se quitó), el gancho, los titulares (o los más representativos), qué logos salen, qué correcciones de subtítulos hiciste y qué arreglaste en el control de calidad. Si algo es una decisión tuya discutible (p. ej. el gancho es un resumen, no una frase literal), díselo y ofrece cambiarlo.

10. Limpiar (solo cuando el usuario dé el reel por bueno)

Cada reel deja ~150 MB de intermedios y el disco suele ir justo. Cuando confirme que el reel está bien (no antes: mientras retoca los necesitas), mueve a la Papelera (~/.Trash/reel-<n>-intermedios-<fecha>/, nunca rm: así puede recuperarlos) todo lo regenerable: work/*.mp4, work/*.mov, work/*.png, qa/, versiones descartadas del reel, cualquier assets/*.mp4 que index.html ya no use y los assets/sfx/*.wav que index.html no nombre (prep_sfx copia toda la librería, ~15 MB; si un retoque necesita otro sonido, se vuelve a ejecutar). Conserva reel.json, work/*.json, proyecto/ (con assets/cut_norm.mp4 y sfx/) y el .mp4 final: con eso se puede retocar sin volver a cortar. Dile cuánto ocupa lo movido y que se libera al vaciar la Papelera. Si cut_norm.mp4 faltara al retocar, cut.py lo regenera desde el clip original (si sigue en CapCut).

Música

No la metas en el vídeo. El usuario añade la música al publicar desde la biblioteca de Instagram (canciones comerciales como Drake: si van dentro del archivo, Instagram puede silenciar el vídeo). Recuérdale ponerla al 10–20 % para que se entienda la voz. Si algún día te pasa un archivo de música libre de derechos (Epidemic Sound, Artlist…) por separado, se puede mezclar con la voz por encima (bajándola cuando habla); nunca le pidas el clip con la música ya mezclada, porque estropea la transcripción y los cortes.

Retoques sobre un reel ya editado

Cambia solo lo que pida en reel.json (o sfx_vol), vuelve a ejecutar build.py, haz QA solo de los bloques afectados y renderiza + masteriza. No vuelvas a transcribir ni a cortar si no lo pide: los cortes y los efectos visuales que ya aprobó se mantienen. Guarda el nuevo vídeo con otro nombre para que compare.

Related Skills