Reels
Clips verticales a partir de un video largo (o reels independientes filmados como reels).
Configuración: establece tu marca aquí
Edita estos valores una vez antes de la primera ejecución. Todo lo que sigue los referencia por nombre.
| Configuración | Dónde | Por defecto |
|---|---|---|
| color de acento | --brand al inicio de scripts/motion.html, scripts/thisorthat.html, scripts/hook.html | #3b82f6 |
| fuente de visualización (tarjetas de gancho, títulos, palabras clave) | --display-font en los mismos archivos | Anton (gratuita, Google Fonts) |
| fuente de subtítulos | scripts/caption.html | Montserrat ExtraBold 800 (gratuita) |
| LUT de cámara | "lut" en reel-params.json, y la variable de entorno LUT para preview_reel.py | <RUTA_A_TU_LUT>.cube |
| carpeta de llegada de nuevo metraje | paso "Dónde llega el nuevo metraje" | <TU_DISCO_DE_METRAJE>/<CARPETA_DE_ENTRADA>/ |
| biblioteca de b-roll | estilo animado, paso 6 | <TU_DISCO_DE_METRAJE>/<rodaje>/<cam>/full/ |
| rastreador de reels | Paso 0 | drafts/social/reel-tracker.md en tu proyecto |
| modelo de Whisper | variable de entorno WHISPER_MODEL | ~/.cache/whisper-models/ggml-small.en.bin |
| CTA con palabra clave de comentario | elementos del plan cta | tu propia palabra clave (ej. GUÍA) |
| referencia de música de fondo | paso de música | una pista de referencia que te guste (ej. un ID de pista de Spotify para SearchRecordings) |
Fuentes: instala Montserrat y tu fuente de visualización en ~/Library/Fonts (o mantén la importación @import de Google Fonts en cada archivo HTML y renderiza en línea). Si tu fuente de visualización tiene licencia, mantenla fuera del repositorio.
Herramientas: whisper-cli (whisper.cpp), ffmpeg, Node + puppeteer-core, Google Chrome, DaVinci Resolve Studio con scripting habilitado (y un MCP de Resolve con execute_resolve_code), macOS para cutout.swift.
Paso 0: lee primero el marcador
Antes de seleccionar o cortar algo, lee el rastreador de reels.
- Completa las estadísticas de cualquier fila que haya estado activa 7+ días y aún esté en blanco. Extráelas de tu herramienta de análisis (ej.
getAnalyticsDataByMetricsde Metricool para reels de Instagram). Visualizaciones, tiempo de visualización promedio, retención a los 3 segundos si está disponible, compartidos, guardados, comentarios, seguidores. - Compara por lo que controlamos: formato, estilo de gancho (tarjeta / construcción / título), duración, tipo de CTA, zoom, tema. Solo llama a algo un patrón si hay al menos 3 reels de cada lado, y di qué tan grande es la brecha.
- Escribe la conclusión bajo "Lo que dicen los números hasta ahora" en el rastreador, con fecha.
- Aplícalo a este lote y dilo en la lista de reels que le muestras al usuario ("los ganchos de construcción están reteniendo 1.4 veces más a los 3 segundos, así que usé construcción en 6 de 8"). Si un ganador contradice un estilo fijo, pregunta antes de cambiarlo.
- Después de programar, agrega una fila por reel con cómo fue editado.
La regla que importa: el gancho primero
Los primeros 3 segundos deciden la distribución, hasta la mitad de los espectadores se van dentro de esa ventana, y un gancho tiene que cargar al instante en lugar de construirse. Un reel que abre con "el consejo número dos es..." está muerto.
Por lo tanto, no cortes un extracto cronológico. Construye cada reel como:
- GANCHO (2-4s): la línea independiente más impactante, tomada de cualquier parte del video, incluido el final.
- CONSTRUCCIÓN: el contexto y la explicación, en el orden que mejor se lea.
- REMATE: una línea de cierre corta si existe.
Los fragmentos cronológicos producen ganchos débiles. Reordenar el mismo metraje, sin volver a filmar, lo soluciona. Reordenar es todo el trabajo.
Buenos ganchos, como patrón: "ya no nos saltamos el día de piernas", "un plan que te saltas no es un plan", "10 minutos al día son 60 horas al año". Cortos, declarativos, sin introducción.
Dónde llega el nuevo metraje
Los nuevos lotes de reels aparecen en <TU_DISCO_DE_METRAJE>/<CARPETA_DE_ENTRADA>/, a menudo como carpeta sin título. Mira allí primero. Una vez que sepas lo que contiene, renombra la carpeta primero con la fecha, luego un nombre: 26-09-2026 reels de equipo. Transcribe antes de renombrar, luego corrige las rutas en clips.ndjson.
Reels independientes: estilo animado
Para reels filmados como reels (sin video largo, sin edición en papel), el estilo animado es más atractivo: producto en el encuadre, tarjetas con fotos, una flecha o anillo en un botón, notas de máquina de escribir en la parte superior, pequeñas imágenes emergentes sobre la cabeza, un gancho grande y audaz con un subtítulo pequeño. Construye uno primero y obtén la aprobación antes de hacer el lote.
- Sin edición en papel. Escribe
segments-v2.jsoncomo[]y dale a cada parte"raw": true, "exact": true. - No confíes en la transcripción completa de Whisper en estos. Las tomas con largos reinicios entre líneas se desvían de 2 a 5 segundos (Whisper puede colocar una frase dentro de un silencio de 5.4s). Ejecuta
GAP=0.18 SUF=.fine blobs.py <trabajo> <clip>y corta las partes en los bordes de los blobs. Para la última palabra, verifica un mapa RMS de 50ms: una caída en medio de una palabra puede ser una fricativa ("f" en "free"), así que vuelve a leer la cola de los subtítulos. Termina la última parte después de que la cola de la palabra caiga por debajo de -50 dB. Whisper también inventa palabras después del corte en la última tarjeta, así que verifica la última señal del SRT contra el audio. - Ritmo de zoom: alterna partes entre gran angular (zoom 1.25, inclinación 0) y con zoom (zoom 1.6, inclinación -90) en metraje nativo vertical. Desplaza cualquier parte donde el orador se incline (ej. gancho: desplazar 180).
- Capa de animación en V2:
motion.json(lista de elementos sincronizada con las palabras enreels-built.json) ->render_motion.mjs(fotograma a fotograma, ~50s para 30s). Los tipos de elementos están documentados enmotion.html: construcciones de palabras, slam, notas de máquina de escribir, wobble, recortes de producto (pop / volar / encoger), anillos pulsantes en botones, un tachado, y una tarjeta de b-roll que reproduce metraje real (gradado con el LUT a través de ffmpeglut3d). Un visual por línea, todos en la banda sobre la cabeza (y 200-550; a y 100 las palabras superiores se cortan). Para hacer espacio, inclina cada parte hacia abajo 100 más que el encuadre base (gran angular 1.25 / inclinación -100, zoom 1.6 / inclinación -190). Las palabras clave usan la claseblue(usa--brand), que dibuja un borde blanco grueso detrás del relleno para que el acento no desaparezca en una pared neutra. Coloca conresolve_captions.py,"track": 2. - Imágenes de producto: primero la API de Wikimedia Commons, luego imágenes OG de la marca. Recórtalas con
scripts/cutout, recorta los reflejos de la mesa. Mantenlos en<trabajo>/gear/. - Tu metraje para b-roll:
<TU_DISCO_DE_METRAJE>/<rodaje>/<cam>/full/. Si el metraje está en log, usa los archivos de resolución completa más el LUT; los proxies horneados a menudo se ven granulados. - Efectos de sonido en A2:
build_sfx.py motion.json out.wav. Usavideo-reels/sfx/<nombre>.wavcuando esté presente (pop, whoosh, slam, tick, click, type, swipe, wobble, shrink), de lo contrario un sustituto sintetizado, por lo que funciona de inmediato sin archivos.dingsiempre esscripts/ding.wav(se envía como un ding sintetizado; reemplázalo con tu propio sonido de selección). Elpopsintetizado es un obturador de cámara (un pop con barrido de tono tiende a sonar "alienígena"), yMASTER = -3dB mantiene cada efecto un poco por debajo de la voz. Para mejores sonidos, creasfx/e introduce tus propios efectos con licencia, luego ajusta las ganancias por archivo enLIBGAIN. Con el conector de Epidemic Sound: busca conSearchSoundEffects, obtén conDownloadSoundEffect(WAV), luego haz curl a laassetUrl. 7b. Música de fondo suave en A3: elige una vibra y mantente con ella (ej. jazz / saxofón soñador, sin voces). Con Epidemic Sound:SearchRecordingsconquery.externalID = {type: SPOTIFY_TRACK, id: <ID_DE_PISTA_DE_SPOTIFY_DE_REFERENCIA>}yvocals: false, salta cualquier cosa etiquetada como extraña/escalofriante/drone/orquestal, y dale a cada reel una pista diferente. LuegoEditRecordingcontargetDurationMs= duración del reel + ~0.3s yforceDuration, para que la pista termine en lugar de ser cortada. Hornea -21 dB y un fade-out de 1.2s en el wav con ffmpeg, porque la API de Resolve no puede configurar el volumen del clip (SetProperty("Volume")devuelve False). Esto sitúa la base unos 15 dB por debajo de la voz. - Vista previa antes de la revisión en Resolve:
preview_reel.py(mismos recortes, LUT, superposiciones, sfx, música) produce un mp4 que puedes ver en segundos. Recorta cada pieza al recuento exacto de fotogramas de Resolve (fps, luegotrim=end_frame, luegoatrim=duration); las entradas simples de-ss/-tse ejecutan ~0.45s más y cortan la última línea de la vista previa. Pruébalo con una hoja de contactos de 1.3s y susurra los últimos 1.5s para confirmar que el final está todo ahí. - Mantén una línea de despedida si el orador agrega una después del CTA: corta en el silencio después de ella, no después de la palabra del CTA.
build_reels.pyagrega 1s de silencio después del audio, porque de lo contrario Whisper elimina las últimas palabras de los subtítulos. Las re-renderizaciones van a nuevos nombres de archivo (-v3) para que Resolve no pueda servir un clip antiguo en caché.
Lotes de reels independientes
Primero obtén la aprobación del estilo de UN reel, luego ejecuta el resto en paralelo:
- Una carpeta por reel (
~/Movies/reels-<MMDD>/<NN>-<slug>/) con<clip>.wav/.jsonenlazados simbólicamente,clips.ndjson,segments-v2.json=[]. Las carpetas separadas evitan que los reels sobrescriban elreels-built.jsonde los demás. - Escribe un breve resumen que apunte a los archivos del reel aprobado (
motion.json, encuadre, sfx) y lanza un agente en segundo plano por reel, 4 a la vez (más estrangula un portátil en decodificaciones 4K). Dale a cada agente la transcripción del clip, el nombre exacto del modelo del producto y cualquier línea a eliminar (hechos incorrectos, reinicios, charla). - Los agentes se detienen en una vista previa sin música. Haz la música de forma centralizada (una edición por reel, una pista diferente cada vez), nivela a aproximadamente -38 dB promedio con un fade, renderiza la vista previa final, luego coloca en Resolve un reel a la vez.
- Revisa tú mismo la hoja de contactos de cada agente antes de construir. Reúne las vistas previas finales en una carpeta
previews/para su revisión. - El encuadre difiere según la configuración. Ejemplo: gran angular zoom 1.2 / inclinación -190, zoom 1.5 / inclinación -380 en una configuración; 1.25/-100, 1.6/-190 en una más suelta. Verifica las imágenes fijas por clip.
- Reúne los elementos "para verificar" de cada agente (errores de audición, hechos que eliminó, afirmaciones en pantalla) en tu resumen. Whisper comúnmente escucha mal el habla rápida (ej. "free" como "for you").
Obtén cada reel del video
Explota todo el video, nunca repitas contenido.
- Haz un inventario primero. Recorre toda la transcripción y enumera cada unidad de idea que pueda ser independiente: cada consejo, historia, estadística, guión, confesión, línea contraria y victoria de cliente. Espera aproximadamente un reel por cada 1.2-1.5 min de corte final.
- Busca estos tipos de gancho:
- un número: "300 panes", "40% de mi factura del supermercado", "de 5K a 50K seguidores"
- una confesión: "Solía simplemente sentarme y esperar que me contactaran"
- una línea contraria: "no lo regales así nomás... eso es un mal sorteo"
- una línea de experto: "el secreto de esto que nadie hace"
- una victoria de cliente: un resultado nombrado (con permiso)
- un guión dicho en voz alta: el DM, la solicitud de referencia
- un "nunca": "Nunca he tenido a nadie que me diga que no en mi cara"
- El gancho tiene que nombrar el tema. "El secreto que nadie hace" falla por sí solo porque el espectador no puede saber de qué se trata. Elige la línea que dice de qué trata el reel en el primer segundo.
- Ninguna línea en dos reels. Dos reels pueden compartir un tema si el gancho y el ángulo difieren.
- Preséntalo en niveles: la lista A para construir, la lista B como repuestos, y los sobrantes con una razón cada uno ("segunda mitad del Reel 4", "sin gancho", "divagando en cámara"). El usuario elige.
- Detente cuando se repita. Más allá de ese punto, cada reel diluye a los demás.
La forma que sigue cada reel
"El gancho necesita enganchar a la gente, y luego el resto del reel explica el gancho y explica el valor, la parte sustanciosa."
- Gancho: detiene el desplazamiento y nombra el tema.
- Explica el gancho: la siguiente línea responde la pregunta que planteó el gancho. Si el gancho es "Perdí 20 kilos sin gimnasio", lo que sigue dice cómo.
- La parte sustanciosa: el valor real, el cómo se hace, el guión, la prueba. Esto es la mayor parte del reel.
- Detente en la línea de remate.
Un gran gancho seguido de líneas que no lo pagan es peor que un gancho simple, porque el espectador se siente engañado. Juzga cada reel en ambas mitades: ¿me detendría el gancho? ¿y todo lo que sigue tiene sentido y cumple lo que prometió?
Verificación de flujo: léelo como un extraño antes de construir
Escribe cada reel como oraciones simples en orden, luego léelo como alguien que nunca ha visto el video largo. Solo entonces busca los tiempos. Estas son las reglas en las que los recortes manuales continúan aterrizando:
- Termina en el remate, una vez. Detente en la línea más fuerte. No agregues un eslogan después ni un segundo intento del punto.
- Nada puede referirse a algo que el reel no preparó. "Simplemente les pregunté y casi siempre lo comparten" sin un "pregunté qué" en el reel tiene que desaparecer. Verifica cada "ella", "ellos", "esto", "eso" y "entonces" contra lo que vino antes en el reel.
- Las historias se cuentan en orden de historia. Una victoria como gancho hablado, con la persona nombrada después, confunde al oyente. Nombra a la persona primero, luego la victoria. La tarjeta de texto hace el gancho.
- Una idea por reel. Dos ideas más una reformulación deberían convertirse en una idea más una prueba.
- Corta los comentarios sobre el orador y los tartamudeos dentro de una parte. Divide la parte a su alrededor.
- El gancho hablado nombra el tema con palabras. "También es una forma increíble de llegar a una nueva comunidad" deja "eso" indefinido. "Mientras sigues preparando comidas los domingos..." dice de qué trata el reel.
- Apunta a 20-35s. Cualquier cosa más allá de 40 necesita una razón.
Entrégalo ajustado: sin muletillas, sin silencios vacíos, sin reinicios. Antes de construir:
- Audio de solapa/sala en vivo: ejecuta
segments.py(depaper-edit) conNOISE_DB=-30. El detectar silencio de ffmpeg se basa en picos, y el ruido de la sala en una solapa sobrepasa el valor predeterminado de -36, por lo que las pausas reales de 0.5-0.8s pasan desapercibidas a -36. - Whisper elimina por completo las muletillas "um" , incluso con un prompt de relleno. Verifica el primer blob con voz de cada parte: un blob corto (0.2-0.7s) aislado antes de la primera palabra real podría ser "um". Corta el blob si es probable que lo sea. Para una rata de 3.2s, un solo "um" al final puede sumar 0.5s; recorta la parte. Si un ráster muestra un blob ruidoso antes de la palabra real y el audio tiene un espacio por delante, elimina el blob en lugar de silenciarlo (el silencio es más corto).