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 siemprePATH="$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(conav<16; la versión nueva de PyAV rompe faster-whisper). - FFmpeg en
/opt/homebrew/bin.python3del 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 enreferences/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á enassets/vinagre-tech/; el de otra marca se guarda enassets/marca/(verINSTALAR.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.
| Estilo | Qué es | Script | Referencia |
|---|---|---|---|
| 1 · Tarjeta | Titular con gráfico en tarjeta oscura arriba cada 2–3 s + subtítulo pequeño de una línea abajo. | build.py | references/ejemplo-whatsapp.reel.json |
| 2 · Frases | Frase 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.py | references/estilo-frases.md |
| 3 · Cine | Clip 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.py | references/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.txty no en la limpia. - Silencios: no hace falta marcarlos;
cut.pyquita los ≥0,2 s dejando 0,07 s de aire a cada lado. Apunta los rangos (tiempo original) enremovedereel.json, junto consource. 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
fixeslos 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). Verreferences/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 undingensfx_extrajusto 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 ensfx_extraen esa palabra. Leereferences/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_sfxdice 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 consfx_voly vuelve a renderizar. Que un efecto suene más que la voz es el fallo grave: tapa lo que dice.master.pylleva 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 de