Communitygithub.com

robertomanfroi/videos-opus

Transforma una grabación vertical (persona hablando a cámara) en un ANUNCIO / creativo para Meta Ads — titular en los primeros 5 s y luego ESQUEMAS animados que muestran lo que la persona dice (flujos, antes/después, no ✕ / sí ✓, pantallas de app, capturas reales con contador), leyenda palabra por palabra, zonas seguras de los anuncios de Meta, sin pausas ni repeticiones.

¿Qué es videos-opus?

Esta skill convierte una grabación vertical simple en un anuncio pulido para Meta Ads (Reels). Se encarga de todo el flujo de trabajo: desde la transcripción rápida y el corte de pausas y repeticiones, hasta la composición de esquemas animados que ilustran visualmente las ideas del discurso. El resultado es un video corto (≤90 s) con titular inicial, esquemas por cada idea clave, leyenda palabra por palabra y estricto respeto a las zonas seguras de Meta. Está diseñada para usuarias que crean contenido para tráfico pago y necesitan alta velocidad de producción sin sacrificar claridad visual. Funciona en el ecosistema `videos-opus` (lanzador `$K`), y su SKILL.md detalla cada paso: proyecto, corte, conferencia, composición, montaje, renderizado y entrega, con múltiples comprobaciones automáticas y manuales para garantizar un resultado profesional.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/robertomanfroi/videos-opus/tree/HEAD/kit/.claude/skills/estilo-anuncio

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Estilo anuncio

La regla única: la parte de arriba (o la franja del pecho) MUESTRA el mecanismo de lo que ella dice; nunca vuelve a escribir la frase — la leyenda ya lo dice. Cada idea hablada se convierte en un esquema que cambia en la palabra.

Antes de empezar lee ../perfil-creadora.md y carga (o crea) el perfil.json de la raíz. Pregunta también, en un solo mensaje, lo que falte: nombre del producto/oferta, el llamado final (CTA: "comenta X" o "clic en el link") y las imágenes reales que ella quiere mostrar (portada del producto, capturas de resultado con los números, cuadros de videos de ella). Guarda las imágenes en assets/img/ del proyecto. Nunca inventes logo, portada, número, precio o resultado.

src/index.template.html (copiado de template/index.template.html) es un catálogo de 15 esquemas listos, con tiempos de ejemplo. Mantén el CSS y los helpers; reescribe el titular y elige/retemporiza los esquemas para el discurso de ella; borra los bloques que no uses. El modelo antiguo, solo con texto, está en src/classico.template.html (úsalo solo si ella pide ese visual: cópialo sobre index.template.html).

Estructura: titular y luego esquemas (obligatorio)

  1. 0 → ~5 s: solo el titular. Un título grande (línea blanca + línea en el color de acento, ~90–125 px, subrayado opcional barriendo la palabra clave). Sin esquema, sin pantalla de app, sin imagen.
  2. Después del titular: un esquema por idea hablada, cambiando en la palabra. Texto dentro del esquema solo en etiquetas cortas (1–3 palabras: "antes", "con IA", "tu negocio").
  3. Cuando el producto vende un proceso, muestra la complejidad del método antiguo al lado de la simplicidad del nuevo (línea de tiempo llena + reloj + ✕ × un pedido + ✓).

Esquemas del catálogo (reusa y retemporiza):

Idea habladaEsquemaBloque
"hice X → pasé por Y → se convirtió en Z"tarjeta de celular (cuadro real) → flecha punteada + punto avanzando → nodo redondo → flecha → tarjeta resultadoB2
elimina errores / pausasonda de audio: partes-problema se vuelven azul/rojo con etiqueta y desaparecen; reloj disminuyeB3
sucede solocelular donde los elementos aparecen solos + contador "0 clics"B4
método antiguo × método nuevodos paneles: línea de tiempo llena + reloj + ✕ × un pedido + ✓B5
objeciones ("sin tiempo", "no sé")No ✕ / Sí ✓: tarjetas de problema llevan ✕ → flecha → tarjeta solución con ✓B6
duda → pruebaglobo con la duda → tarjeta de prueba con ✓B7
"necesita explicar bien"pedido genérico → resultado gris ✕ × instrucción detallada siendo tecleada ✓B8
lista de lo que entregacasillas punteadas que se llenan con imágenes reales o íconos, una por ítem mencionadoB9
curso / productoportada real + chips volando hacia adentro + gráfico subiendoB10
prueba socialcapturas reales con contador de vistas subiendo (recorta el contador de la propia captura)B11
copiar un estiloreferencia → nodo → el cuadro de ella recibiendo el mismo estilo + "= mismo estilo"B12
oferta / lanzamientoetiqueta + sello → post con barra de envío → "✓ publicado"B13
tres pasos ("graba, edita, publica")tres nodos encendiéndose uno en cada palabraB14
CTA de comentariocaja de comentario tecleando la palabra ("YO QUIERO") + tarjeta de directB15
CTA de linkbarra blanca "Saber más ›" pulsandoB16

Antes de renderizar, lee cada bloque y pregúntate: "¿la zona MUESTRA la idea, o solo repite la leyenda?"

Números: los contadores de B3, B5 y B11 vienen con marcadores (__B3_SEG_ANTES__, __B5_SEG_NUEVO__, __VIEWS_CAPTURA_1__…). El montar.mjs se detiene con error mientras quede alguno. Cámbialo por el número REAL (dicho por ella o leído de la captura) o borra el contador.

Imágenes: bruto.jpg sale solo del video (nuevo-anuncio.mjs). Todo lo demás (portada, capturas, cuadros de otros videos, referencia) solo si la alumna lo envía. Falta imagen → borra o rediseña el esquema (ícono dibujado en SVG, tarjeta de texto); nunca dejes espacio de ejemplo. Nombre/@ y avatar vienen del perfil.json (montar.mjs reemplaza __USUARIO__, __NOMBRE__ y pone el avatar; sin foto, un círculo con la inicial).

Zonas seguras (anuncio de Meta en Reels — obligatorio)

Deja libres 14 % arriba, 35 % abajo y 6 % a cada lado. En 1080×1920 la caja segura es x 65–1015, y 270–1248: toda palabra, número, sello, CTA, leyenda y etiqueta de esquema queda dentro de ella (inclusive en el pico de escala/rotación de las animaciones). Solo decoración (franja oscura, sombra de panel) puede salirse. Verifica con $K --em video-proyectos/<slug> node ../../$E/scripts/zonas-seguras.mjs renders/<archivo>.mp4 assets/seguras.jpg t1 t2 … (caja roja en cada cuadro).

Zona de los esquemas (reel.json en la raíz del proyecto)

Los bloques se dibujan en un área de 1080×340 y el montar.mjs posiciona y escala esa área:

Encuadrereel.json
cabeza más baja, sobra espacio arriba (tope de la cabeza debajo de y ≈ 450){"franja":"superior","zonaTop":280,"zonaAltura":<tope de la cabeza − 290>,"capTop":<mentón + 20, máx. 1165>}
cabeza alta en el cuadro (selfie de cerca, coche){"franja":"pecho","zonaTop":<mentón + 20>,"zonaAltura":<≈ 1150 − zonaTop>,"capTop":<zonaTop + zonaAltura + 10, máx. 1165>}

En modo pecho una franja oscura cubre desde el mentón hasta el final del área segura, y los esquemas + leyenda van sobre ella. La leyenda (80 px de altura) debe terminar hasta y 1248.

Visual

ElementoRegla
Franja oscurasuperior: degradé rgba(0,0,0,.66) → transparente bajando desde arriba. pecho: franja oscura desde el mentón hasta ~y 1300.
Kit de esquemaspaneles rgba(16,16,19,.92) radio 22 con borde claro de 1 px; tarjetas de celular 160×284 (9:16) con cuadros reales; nodo redondo de IA en color color_ia; flechas punteadas con punto en el color de acento avanzando; sellos redondos ✕ rojo #ff453a y ✓ verde #30d158 que estallan en la palabra; textos de interfaz en Inter. Decoración repetida (barras de onda, clips de la línea de tiempo) usa el rnd() con semilla del template — nunca Math.random ni from:"random" de GSAP.
Tipografíafuente de título (Archivo Black o fuente_titulo del perfil) en el titular, etiquetas y leyenda. Blanco; acento en color color_acento (por defecto amarillo #FFD21F).
Movimientoentradas cortas: sube + aparece en 0,45–0,6 s (power3.out / expo.out); sellos con back.out; contadores corriendo; barras llenándose; flechas creciendo. Salidas en 0,28 s. Los esquemas cambian en la palabra hablada.
Leyendauna palabra por vez, 46 px, blanca con sombra suave (nunca contorno), justo debajo del mentón (capTop en reel.json).
CTAcaja de comentario tecleando la palabra + tarjeta de direct, o barra blanca "Saber más ›".

Colores, tamaños y prohibiciones: template/DESIGN.md (copiado para cada proyecto).

Reglas de corte

  • Elimina toda pausa (−30 dB / 0,15 s) y toda repetición; ≤ 90 s si es posible. Frase dicha dos veces: quédate con la ÚLTIMA (la corregida). Repetición de énfasis ("vale, vale") no es error.
  • Anuncio corta sin J/L (cortar.mjs --no-jl): la imagen acompaña al habla exactamente.
  • Después de cortar, retranscribe el clean.mp4 y léelo buscando frase duplicada y palabra cortada. La transcripción entera ESCONDE repeticiones: barre también el video completo en ventanas cortas, en una sola llamada, $K --em video-proyectos/<slug> node ../../$M/transcribir.mjs assets/clean.mp4 --ventanas 1,3,5,7,… (cada 2 s hasta el final), y compara.

Reglas de velocidad (la PC de la alumna puede ser lenta — aplican por encima de los pasos siguientes)

  • La transcripción de nuevo-anuncio.mjs ya es --rapido (solo para elegir el corte). La retranscripción del clean.mp4 (la de la leyenda) usa el modelo preciso — una vez por versión del corte.
  • Revisa empalmes y repeticiones en UNA llamada con --ventanas. Nunca una ventana por vez.
  • No renderices borrador entero solo para mirar cuadros. Usa $K --em video-proyectos/<slug> hyperframes snapshot --at t1,t2,… -o snapshots (un tiempo por esquema) y mira los PNGs. Renderiza UNA vez, cuando los snapshots estén correctos.
  • El codificador del raw.mp4 / clean.mp4 se elige solo. No lo cambies.
  • Antes de cada etapa lenta, avisa en una línea corta en español qué está corriendo ("Renderizando el anuncio — puede llevar unos minutos."), para que la espera nunca parezca un congelamiento.

Flujo (todo comando mediante el lanzador $K)

E=.claude/skills/estilo-anuncio · M=.claude/skills/_motor · K = el lanzador de la skill videos-opus: "<VO>\bin\node.exe" "<VO>\scripts\video.mjs" kit, donde <VO> es la carpeta de la skill videos-opus (la que tiene el SKILL.md que te envió a leer esta guía). Él pone los programas portátiles en el camino y corre en la carpeta de trabajo del kit ($K carpeta muestra cuál es; los proyectos quedan en <carpeta>\video-proyectos\<slug>). $K --em <subcarpeta> … corre dentro de ella. Nada de npx, Python o node suelto: todo pasa por $K.

  1. Proyecto + transcripción rápida: $K node $E/scripts/nuevo-anuncio.mjs "<video>" <slug> → video-proyectos/<slug>/ con raw.mp4, raw.json, assets/palabras.txt, los dos modelos, assets/img/bruto.jpg y reel.json.
  2. Encuadre: hoja de contacto con cuadrícula ($K --em video-proyectos/<slug> ffmpeg -i assets/raw.mp4 -vf "fps=1/5,drawbox=x=65:y=270:w=950:h=979:color=red:t=6,drawgrid=w=1080:h=100:[email protected]:t=2,scale=270:-1,tile=7x2" -frames:v 1 assets/contacto.png) y MIRA: líneas amarillas cada 100 px, caja roja = área segura. Encuentra el tope de la cabeza y el mentón y escribe reel.json (tabla "Zona de los esquemas").
  3. Corte: lee assets/palabras.txt, escribe assets/keeps.json; dentro de assets/: $K --em video-proyectos/<slug>/assets node ../../../$M/cortar.mjs --no-jl.
  4. Revisión: en la raíz del proyecto: $K --em video-proyectos/<slug> node ../../$M/transcribir.mjs assets/clean.mp4 assets/transcripcion.json --nombres "<términos del perfil>"; lee; haz el barrido --ventanas; ajusta el corte hasta que quede limpio; palabra oída mal → assets/caption-fixes.json.
  5. Composición: reescribe src/index.template.html: titular en 0–5 s, luego un esquema por idea hablada; tiempos de $K --em video-proyectos/<slug> node ../../$M/anclas.mjs "frase" … (raíz del proyecto); imágenes reales en assets/img/.
  6. Montaje + verificación: $K --em video-proyectos/<slug> node ../../$E/scripts/montar.mjs (se detiene con error si quedó marcador o falta imagen) → $K --em video-proyectos/<slug> hyperframes lint (0 errores) → $K --em video-proyectos/<slug> hyperframes snapshot --at … en CADA esquema y MIRA (rostro nunca cubierto, etiquetas legibles, números correctos, nada de ejemplo sobrante) → zonas-seguras.mjs sobre los snapshots/tempos → render y entrega (por el lanzador, en la carpeta de trabajo del kit): $K node $M/renderizar.mjs <slug> — revisa los bloqueos, renderiza en segundo plano, valida y ya copia a listos/. Salida 3 = aún renderizando: corre $K node $M/renderizar.mjs <slug> --esperar hasta que salga LISTO. Nunca corras $K --em video-proyectos/<slug> hyperframes render directamente ni listos.mjs a mano. Después zonas-seguras.mjs renders/<slug>-final.mp4 … en los tiempos de los esquemas.
  7. Entrega: responde en español, breve: dónde está, qué se cortó, imágenes usadas, qué quedó en duda, y que el video respeta el área segura de Meta. Nunca publiques ni subas el anuncio.

Variaciones de anuncio (cuando la alumna pide "más de una versión")

Mismo corte, otro titular y/u otro CTA: copia el proyecto (video-proyectos/<slug>-v2), cambia solo el bloque B1 y el CTA, monta, snapshot del titular y render. No rehagas corte ni transcripción.

Ajustes después de la entrega

"quita la parte del precio" → keeps.json, pasos 3–4, recalcula los tiempos de los esquemas después del tramo con anclas.mjs y paso 6. "cambia el titular" → B1 y paso 6. "leyenda más arriba" → capTop en reel.json y paso 6. Nunca rehagas desde cero lo que ella no pidió cambiar.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills relacionados