Communitygithub.com

MBehtemam/montagent-skills

Edición de vídeo real en Montagent: cabezas parlantes y entrevistas, claves de croma, subtítulos y leyendas palabra por palabra, tercios inferiores y barras de nombre, imagen en imagen, y música con reducción automática bajo la voz. Úsalo cuando un vídeo de Montagent parta de grabaciones reales.

¿Qué es montagent-skills?

Esta skill de agente de IA se especializa en la edición de vídeo real a partir de grabaciones, dirigida a la plataforma Montagent. Proporciona recetas estructuradas para tareas comunes como insertar cabezas parlantes, eliminar fondos verdes mediante clave de croma, generar subtítulos sincronizados con la palabra hablada, añadir barras de nombre y crear efectos de imagen en imagen. Cada receta incluye configuraciones iniciales (rangos de parámetros) y pasos de verificación visual. La skill integra scripts en Python para automatizar la generación de subtítulos y la mezcla de música con voz, usando marcas de tiempo de palabras para sincronizar las animaciones y los efectos de sonido. Su valor principal es simplificar flujos de edición complejos —como la animación de barras sobre vídeo real, el ajuste de claves de croma sin artefactos, o la creación de una ventana PIP con animación elástica— todo dentro del entorno Montagent.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MBehtemam/montagent-skills/tree/HEAD/skills/montagent-footage

Preguntar en tu IA favorita

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

Documentación

Edición de vídeo grabado

Recetas para piezas construidas sobre grabaciones. Se insertan en el bucle de montagent en el paso de construcción; carga montagent primero si no lo has hecho. Para una cabeza parlante, un clip de presentador o un corte de entrevista, abre la estructura de cabeza parlante antes de planificar.

Empezar desde la grabación

Antes de escribir un elemento, probe (sondear) cada clip: su tamaño, fotogramas por segundo, duración y si tiene sonido. Luego planifica la pieza sobre la voz. Sus marcas de tiempo de palabras son el reloj del que cuelgan cada subtítulo, señal y reducción de volumen, por lo que las marcas de tiempo se verifican primero (ver Subtítulos).

Para elegir un momento de un clip largo (el tramo de una grabación de pantalla para mostrar en un inserto, por ejemplo), coloca el clip solo en un proyecto de prueba y llama a frame --from 0 --to <su duración> --infill-ceiling <ms>, con el techo en una vigésima parte de la duración. Una llamada da una baldosa etiquetada cada pocos segundos; frame --at en cualquier baldosa que quieras ver más de cerca.

Recetas

Cada receta da rangos iniciales, no respuestas. Cada una termina en un paso de verificación: carga montagent-craft, luego mira donde dice el paso antes de continuar.

Colocar la grabación

{
  "frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#FF5A36", "duration": 6000, "output": "out/presenter.mp4",
  "tracks": [
    {"name": "presenter", "layer": 10, "elements": [
      {"id": "presenter", "type": "video", "start": 0, "end": 6000, "source": "media/clip.mp4", "source_start": 0, "source_end": 6000, "x": 540, "y": 2160, "origin": "bottom-center", "width": 3413, "height": 1920, "fit": "cover", "effects": [{"name": "chroma", "color": "#00FF00", "tolerance": 0.2, "softness": 0.08, "spill": 0.9}]}
    ]}
  ]
}
  • Grabación ancha en un marco alto: haz que el elemento tenga la altura del marco y el ancho que dé la relación de aspecto de la fuente (1920 de alto son 3413 de ancho para 16:9), luego deslízalo lateralmente para mantener al orador centrado.
  • Ojos: 25-35 % hacia abajo del marco. Baja el bottom-center del elemento más allá del borde inferior del marco para llegar allí; cortar las piernas es normal.
  • Espacio sobre la cabeza: 4-8 % de la altura del marco por encima del cabello.
  • Una toma más corta que la pieza: "overrun": "hold" congela su último fotograma. Mantén la congelación bajo medio segundo, o termina la pieza antes.
  • Un fotograma congelado dentro de un clip, una rampa de velocidad o una inversión: escribe source_time en lugar de source_start y source_end: un literal congela un momento, y las claves de milisegundos de origen contra el tiempo de línea de tiempo t crean una rampa (un par plano congela, un par descendente invierte). Establece "frame_blend": "mix" en un clip en cámara lenta (speed < 1.0) o con rampa de velocidad (source_time) para fundir fotogramas de origen consecutivos en lugar de saltar entre los fotogramas más cercanos ("none"). Para un aspecto de tiempo posterizado (stop-motion) en la grabación, usa fotogramas clave de source_time escalonados que mantengan cada marca de tiempo de origen de destino durante múltiples fotogramas de la línea de tiempo. Un clip con source_time tiene volumen 0, así que pon su sonido en su propio elemento de audio.
  • El sonido propio de la toma: la voz se mantiene a volume 1.0. Todo lo demás se mezcla por debajo.
  • Verificación: frame al inicio, al medio y al último fotograma dibujado, y comprueba que los ojos estén en la banda y que nada importante esté cortado en los lados del marco.

Clave de croma

chroma en el elemento de la grabación elimina la pantalla. Empieza aquí:

  • color: el color puro de la pantalla, #00FF00 para una pantalla verde. Una pantalla iluminada que se haya desviado ligeramente hacia el azul o el amarillo se trata igual con estas tolerancias, por lo que no necesitas muestrearla.
  • tolerance: 0.2 (rango 0.18-0.25). Por encima de aproximadamente 0.3, la clave se come el cabello negro, los cuellos blancos y la ropa oscura.
  • softness: 0.08 (rango 0.05-0.1).
  • spill: 0.9 (rango 0.9-1.0).

Verifícalo antes de poner cualquier cosa encima:

  1. Tres recortes sin pérdida. frame --crop <x,y,w,h> --png en el cabello, en el borde de un hombro o manga, y en las manos, sobre el fondo en el que vas a entregar. Un recorte vuelve a escala real, así que una caja de 200-400 px es suficiente.
  2. ¿Ya está listo? Cabello, cuello y manos sólidos, con como máximo una línea de 1-2 px oscura, oliva o tostada a lo largo de los bordes: la clave está lista, así que continúa. Esa línea es el suelo de borde: cada ajuste de 0.12 a 0.3 lo deja, y spill ya lo ha cambiado de verde a tostado, por lo que un recuento de píxeles verdes lee cero en ella.
  3. De lo contrario, una corrección por defecto. El fondo que se ve a través del cabello, un cuello o ropa oscura: baja tolerance en 0.05. Un halo pálido o verde más ancho que el suelo de borde: sube tolerance en 0.03, o softness en 0.03. Recorta de nuevo y vuelve al paso 2. Como máximo tres ajustes, todos en el mismo elemento con clave: las copias con clave divididas por región multiplican el tiempo de renderizado y aún dejan una costura.
  4. Deriva. measure el elemento con clave. Su proporción opaca debe mantenerse dentro de uno o dos puntos a lo largo de la toma. Un escalón significa que la iluminación cambió allí: clave tolerance con un fotograma clave a cada lado del escalón, o corta el elemento en ese fotograma y aplica clave a cada parte por separado.
  • Verificación: frame la imagen completa en dos momentos donde el orador se mueva más, y comprueba que el contorno se mantiene.

Subtítulos con la palabra hablada resaltada

Los subtítulos provienen de las marcas de tiempo de palabras suministradas, a través del script incluido, no a mano. python3 scripts/captions.py <proyecto> <palabras> <especificación> (ejecútalo con --help para la especificación) verifica las marcas de tiempo, divide las palabras en páginas de una o dos líneas con measure, da a cada palabra una ventana de highlight mientras se habla, e imprime el proyecto con los subtítulos añadidos. Informa cada reparación en stderr. Lee ese informe: es la verificación de marcas de tiempo.

  • Qué comprueba: una palabra que comienza una frase después de que el habla ya se haya reanudado (un "Ahora" suministrado 110 ms tarde y 20 ms largo es el caso clásico), una palabra que se encuentra dentro de un silencio, palabras superpuestas y palabras demasiado cortas para verse. Las palabras cortas se alargan a min_word (150 ms): hacia la pausa posterior, luego desde la palabra siguiente. Una palabra reportada dentro de un silencio significa que el archivo está desalineado allí: corrige el archivo, luego ejecútalo de nuevo.
  • Tamaño: 56-72 px en un marco de 1080 de ancho, negrita, un color claro para la línea y el acento de la marca para la palabra hablada.
  • Líneas: como máximo dos, width aproximadamente el 80 % del ancho del marco. Una página se rompe al final de una oración o en una pausa de 400 ms o más.
  • Fondo: un pill del color de marca más oscuro con un 80-85 % de alfa (CC-D9) se lee sobre cualquier grabación. pad 28-36 px a lo ancho y 14-20 px hacia abajo, radius 20-28.
  • Colocación: debajo de la barbilla y fuera del 15-20 % inferior de un marco alto, donde los reproductores dibujan sus controles. En 1080×1920, eso es un centro aproximadamente en y 1350-1450. En un marco ancho, centra un 10-14 % hacia arriba desde la parte inferior.
  • Las páginas permanecen hasta que comience la página siguiente, o 1 s después de su última palabra cuando le sigue una pausa más larga.

Escribe subtítulos reales, así que actúa sobre los hallazgos de subtítulos que validate plantee sobre ellos.

  • Verificación: frame --from --to sobre una página: cada palabra iluminada es su propia baldosa. Comprueba que cada baldosa ilumina exactamente una palabra, en orden de habla, y que la caja se mantiene alejada de la cara. Luego frame --at el primer fotograma después de la pausa más larga, y comprueba que la nueva página está activa y que nada está iluminado antes de tiempo.

Barra de nombre sobre grabación

Un tercio inferior se desvanece al entrar y salir. La grabación no es un color plano, por lo que la transición de oclusor de montagent-motion no puede revelar la barra en sí. En su lugar, la barra crece desde su borde, y su texto se revela mediante un oclusor en el mismo color de la barra, que es plano.

{
  "frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 7000, "output": "out/namebar.mp4",
  "fonts": {"bold": [{"file": "fonts/Inter-Bold.ttf"}]},
  "fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
  "tracks": [
    {"name": "bar", "layer": 20, "elements": [
      {"id": "bar", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 760, "height": 160, "fill": "#101418", "radius": 8, "scale": [{"t": 1000, "v": [0.0, 1.0]}, {"t": 1300, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}, {"t": 6266, "v": [1.0, 1.0], "ease": "linear"}, {"t": 6533, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
    ]},
    {"name": "bar-edge", "layer": 21, "elements": [
      {"id": "bar-edge", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 12, "height": 160, "fill": "#FF5A36"}
    ]},
    {"name": "bar-name", "layer": 22, "elements": [
      {"id": "bar-name", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1128, "origin": "center-left", "width": 400, "height": 70, "font": "bold", "size": 58, "color": "#F5F0E6", "runs": [{"text": "Montagent"}], "caption": false}
    ]},
    {"name": "bar-line", "layer": 22, "elements": [
      {"id": "bar-line", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1196, "origin": "center-left", "width": 560, "height": 44, "font": "bold", "size": 34, "color": "#F5F0E6", "runs": [{"text": "Video que tu agente puede leer"}], "caption": false}
    ]},
    {"name": "bar-cover", "layer": 23, "elements": [
      {"id": "bar-cover-on", "type": "rect", "start": 1300, "end": 1700, "x": 800, "y": 1160, "origin": "center-right", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 1300, "v": [1.0, 1.0]}, {"t": 1666, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]},
      {"id": "bar-cover-off", "type": "rect", "start": 6000, "end": 6266, "x": 84, "y": 1160, "origin": "center-left", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 6000, "v": [0.0, 1.0]}, {"t": 6233, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
    ]}
  ]
}
  • Entrada: la barra crece desde su borde izquierdo durante 250-350 ms, [0.65, 0, 0.35, 1]. El texto y su cubierta comienzan el fotograma en que la barra está completamente crecida (nunca antes, o la cubierta se muestra sobre la grabación). La cubierta se encoge alrededor de su borde lejano durante 300-400 ms, descubriendo el texto en orden de lectura.
  • Salida, comenzando en su señal: la cubierta vuelve a crecer sobre el texto en 200-300 ms, luego la barra se encoge de nuevo a su borde durante 250-300 ms. Toda la barra desaparece 450-600 ms después de la señal.
  • Tamaño: barra de 130-180 px de alto en un marco de 1080 de ancho, nombre de 52-64 px, segunda línea de 30-38 px. Una tira de acento de 8-16 px de ancho en el borde delantero.
  • Cubierta: exactamente el fill de la barra, 20 px dentro de los extremos de la barra y 10 px dentro de su parte superior e inferior, sobre el texto.
  • Colocación: 48-80 px hacia adentro desde el lado del marco, fuera de la caja de subtítulos y de la cara del orador, generalmente al 55-65 % de la altura de un marco alto.
  • Verificación: frame --from --to --keyframes durante 1 s desde cada señal, y comprueba que ninguna cubierta se muestre más allá de la barra en ninguna baldosa. frame --at la barra en reposo, y comprueba que su borde izquierdo esté alineado con el margen de la caja de subtítulos.

Imagen en imagen circular

Muestra un segundo clip en un círculo: un elemento de vídeo con un mask de círculo, un anillo detrás y un pop en la curva bezier de sobreimpulso.

{
  "frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 6000, "output": "out/pip.mp4",
  "tracks": [
    {"name": "pip-ring", "layer": 30, "elements": [
      {"id": "pip-ring", "type": "ellipse", "start": 1000, "end": 5500, "x": 800, "y": 900, "origin": "center", "width": 384, "height": 384, "fill": "#F5F0E6", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "shadow", "dx": 0, "dy": 16, "radius": 40, "color": "#101418", "opacity": 0.35}]}
    ]},
    {"name": "pip", "layer": 31, "elements": [
      {"id": "pip", "type": "video", "start": 1000, "end": 5500, "source": "media/clip.mp4", "source_start": 10000, "source_end": 14500, "volume": 0, "x": 800, "y": 900, "origin": "center", "width": 640, "height": 360, "fit": "contain", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "mask", "shape": "circle", "x": 140, "y": 0, "width": 360, "height": 360}]}
    ]}
  ]
}
  • El rectángulo del círculo: un cuadrado tan alto como el elemento. Su x elige qué parte de la imagen se muestra. El centro es (width - height) / 2, y ese es el que se debe usar: el pop escala alrededor del origin del elemento, por lo que un círculo movido del centro se desplaza lateralmente mientras crece. Para mostrar otra parte de la imagen, elige un source_start donde esa parte se sitúe en el medio, o haz el elemento más grande y establece su x para que la parte caiga en el círculo, luego clave x en la curva del pop para que el centro del círculo se mantenga fijo.
  • Tamaño: 30-40 % del ancho del marco de ancho. El anillo es de 12-24 px más ancho que el círculo, en el color más claro del fondo, con una shadow suave.
  • Pop: 350-450 ms en [0.34, 1.56, 0.64, 1] para ambos, desde escala 0, en las mismas claves. Salida en 200-300 ms, ease-in, de vuelta a 0.
  • Sincronización: entra cuando el orador nombra por primera vez la cosa que muestra, sale un tiempo antes del final para que el cierre sea limpio.
  • Colocación: al lado del orador a la altura del pecho, fuera de la cara y la caja de subtítulos, y a 40 px o más del borde del marco.
  • Sonido: volume 0 a menos que el sonido propio del clip sea el punto.
  • Verificación: frame en el pico del pop (inicio más el 40 % de su duración) y comprueba que el círculo no toque la cara ni el borde del marco. frame en reposo y comprueba que la parte que importa esté dentro del círculo.

Música bajo una voz

La música se reduce mientras la voz habla y vuelve a subir en las pausas. scripts/duck.py lo escribe como fotogramas clave de volume ordinarios en el elemento de música, a partir de las marcas de tiempo de palabras de la voz (--words, una ...)`

[truncada para traducción]

Individual skills in this repo

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

Skills relacionados