Communitygithub.com

MBehtemam/montagent-skills

Montage vidéo réel dans Montagent : têtes parlantes et interviews, incrustations fond vert, sous-titres et légendes mot à mot, tiers inférieurs et barres de nom, incrustation, et musique en retrait sous une voix.

Qu'est-ce que montagent-skills ?

Cette compétence permet d'éditer des vidéos enregistrées dans l'outil Montagent, en se concentrant sur des techniques avancées de post-production. Elle comprend le placement de séquences dans un cadre, l'incrustation fond vert avec réglages de tolérance et de douceur, et la génération automatique de sous-titres synchronisés avec la parole. Le système utilise un flux de travail structuré : d'abord l'analyse des clips avec la commande `probe`, puis la planification basée sur le timing des mots, et enfin l'application des effets. Chaque étape se termine par une vérification visuelle via la commande `frame` pour garantir la qualité. La compétence est utile pour créer des contenus professionnels comme des interviews, des présentations ou des tutoriels, en automatisant des tâches complexes comme l'incrustation fond vert ou le sous-titrage mot à mot. Elle prend en charge des fonctionnalités avancées comme le ralenti, l'accélération, les arrêts sur image, et la gestion de l'audio avec des fondus et des pistes séparées.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Montage vidéo enregistré

Recettes pour des pièces construites à partir de séquences enregistrées. Elles s'intègrent dans la boucle de montagent à l'étape de construction ; chargez d'abord montagent si ce n'est pas déjà fait. Pour un portrait, un clip de présentateur ou un extrait d'interview, ouvrez la structure portrait avant de planifier.

Commencer par la séquence

Avant d'écrire un élément, probe chaque clip : sa taille, sa fréquence d'images, sa durée et s'il a du son. Ensuite, planifiez la pièce sur la voix. Ses timings de mots sont l'horloge à laquelle chaque légende, repère et fondu se rattache, donc les timings sont vérifiés en premier (voir Légendes).

Pour choisir un moment dans un long clip (la partie d'un enregistrement d'écran à montrer dans un insert, par exemple), placez le clip seul dans un projet brouillon et appelez frame --from 0 --to <sa durée> --infill-ceiling <ms>, avec le plafond à un vingtième de la durée. Un appel donne une vignette étiquetée toutes les quelques secondes ; frame --at pour toute vignette que vous voulez voir de plus près.

Recettes

Chaque recette donne des plages de départ, pas des réponses. Chacune se termine par une étape de vérification : chargez montagent-craft, puis regardez là où l'étape le dit avant de continuer.

Placer la séquence

{
  "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}]}
    ]}
  ]
}
  • Séquence large dans un cadre haut : faites en sorte que l'élément soit aussi haut que le cadre et aussi large que l'aspect de la source le permet (1920 de hauteur donne 3413 de largeur pour du 16:9), puis décalez-le latéralement pour garder le locuteur centré.
  • Yeux : à 25–35 % du haut du cadre. Abaissez le bottom-center de l'élément au-delà du bord inférieur du cadre pour y parvenir ; couper les jambes est normal.
  • Espace au-dessus de la tête : 4–8 % de la hauteur du cadre au-dessus des cheveux.
  • Une prise plus courte que la pièce : "overrun": "hold" fige sa dernière image. Gardez le gel sous une demi-seconde, ou terminez la pièce plus tôt.
  • Une image figée à l'intérieur d'un clip, un ralenti, ou un inversement : écrivez source_time à la place de source_start et source_end : un littéral fige un moment, et des clés de millisecondes source en fonction du temps de la timeline t font varier la vitesse (une paire plate fige, une paire descendante inverse). Réglez "frame_blend": "mix" sur un clip au ralenti (speed < 1.0) ou à variation de vitesse (source_time) pour fondre enchaîné les images source consécutives au lieu de passer à l'image la plus proche ("none"). Pour un look d'arrêt sur image (stop-motion) sur des séquences, utilisez des images clés source_time échelonnées, maintenant chaque timestamp source cible sur plusieurs images de la timeline. Un clip avec source_time est silencieux à volume 0, donc mettez son son sur son propre élément audio.
  • Le propre son de la prise : la voix reste à volume 1.0. Tout le reste est mixé en dessous.
  • Vérification : frame au début, au milieu et à la dernière image dessinée, et vérifiez que les yeux se situent dans la bande et que rien d'important n'est coupé sur les côtés du cadre.

Incrustation fond vert

chroma sur l'élément de la séquence incruste le fond. Commencez ici :

  • color : la couleur pure du fond, #00FF00 pour un fond vert. Un fond éclairé qui a légèrement dérivé vers le bleu ou le jaune s'incruste de la même manière à ces tolérances, donc vous n'avez pas besoin de l'échantillonner.
  • tolerance : 0.2 (plage 0.18–0.25). Au-dessus d'environ 0.3, l'incrustation mange les cheveux noirs, les cols blancs et les vêtements foncés.
  • softness : 0.08 (plage 0.05–0.1).
  • spill : 0.9 (plage 0.9–1.0).

Vérifiez-le avant toute autre chose par-dessus :

  1. Trois recadrages sans perte. frame --crop <x,y,w,h> --png aux cheveux, au bord d'une épaule ou d'une manche, et aux mains, sur le fond sur lequel vous allez livrer. Un recadrage revient à l'échelle réelle, donc une boîte de 200–400 px suffit.
  2. Déjà fait ? Cheveux, col et mains solides, avec au maximum une ligne de 1–2 px foncée, olive ou beige le long des bords : l'incrustation est faite, donc passez à la suite. Cette ligne est le sol de bord : chaque réglage de 0.12 à 0.3 la laisse, et spill l'a déjà transformée de verte en beige, donc un comptage de pixels verts lit zéro dessus.
  3. Sinon, un correctif par défaut. Le fond qui apparaît à travers les cheveux, un col ou des vêtements foncés : abaissez tolerance de 0.05. Un halo pâle ou vert plus large que le sol de bord : augmentez tolerance de 0.03, ou softness de 0.03. Recadrez et retournez à l'étape 2. Au maximum trois réglages, tous sur le même élément incrusté : des copies incrustées divisées par région multiplient le temps de rendu et laissent encore une couture.
  4. Dérive. measure l'élément incrusté. Sa part opaque devrait rester à un ou deux points près sur toute la prise. Un saut signifie que l'éclairage a changé à cet endroit : incrustez tolerance avec une image clé de chaque côté du saut, ou coupez l'élément à cette image et incrustez chaque partie séparément.
  • Vérification : frame l'image entière à deux moments où le locuteur bouge le plus, et vérifiez que le contour tient.

Légendes avec le mot parlé mis en évidence

Les légendes viennent des timings de mots fournis, via le script fourni, pas à la main. python3 scripts/captions.py <projet> <mots> <spec> (exécutez-le avec --help pour la spec) vérifie les timings, divise les mots en pages d'une ou deux lignes avec measure, donne à chaque mot une fenêtre highlight pendant qu'il est parlé, et imprime le projet avec les légendes ajoutées. Il signale chaque réparation sur stderr. Lisez ce rapport : c'est la vérification des timings.

  • Ce qu'il vérifie : un mot qui commence une phrase après que la parole a déjà repris (un "Maintenant" fourni 110 ms en retard et 20 ms de long est le cas classique), un mot qui se trouve dans un silence, des mots qui se chevauchent, et des mots trop courts pour être vus. Les mots courts sont allongés à min_word (150 ms) : dans la pause après, puis à partir du mot suivant. Un mot signalé dans un silence signifie que le fichier est mal aligné à cet endroit : corrigez le fichier, puis exécutez-le à nouveau.
  • Taille : 56–72 px sur un cadre de 1080 de large, gras, une couleur claire pour la ligne et l'accent de la marque pour le mot parlé.
  • Lignes : au maximum deux, width environ 80 % de la largeur du cadre. Une page se coupe à la fin d'une phrase ou à une pause de 400 ms ou plus.
  • Fond : un pill de la couleur de marque la plus foncée à 80–85 % d'alpha (CC–D9) se lit sur n'importe quelle séquence. pad 28–36 px en travers et 14–20 px en bas, radius 20–28.
  • Placement : sous le menton et dégagé des 15–20 % inférieurs d'un cadre haut, où les lecteurs dessinent leurs commandes. Sur 1080×1920, c'est un centre à environ y 1350–1450. Sur un cadre large, centrez-le à 10–14 % du bas.
  • Pages restent jusqu'à ce que la page suivante commence, ou 1 s après leur dernier mot quand une pause plus longue suit.

Il écrit de vraies légendes, donc agissez sur les résultats de légendes que validate soulève à leur sujet.

  • Vérification : frame --from --to sur une page : chaque mot allumé est sa propre vignette. Vérifiez que chaque vignette allume exactement un mot, dans l'ordre de parole, et que la boîte reste dégagée du visage. Ensuite frame --at la première image après la pause la plus longue, et vérifiez que la nouvelle page est levée et que rien n'est allumé trop tôt.

Barre de nom sur la séquence

Un tiers inférieur apparaît et disparaît en fondu. La séquence n'est pas une couleur unie, donc le fondu d'occlusion de montagent-motion ne peut pas révéler la barre elle-même. À la place, la barre grandit à partir de son bord, et son texte est révélé par un occluder dans la propre couleur de la barre, qui est unie.

{
  "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 your agent can read"}], "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]}]}
    ]}
  ]
}
  • Apparition : la barre grandit à partir de son bord gauche sur 250–350 ms, [0.65, 0, 0.35, 1]. Le texte et son cache commencent au moment où la barre est complètement développée (jamais avant, sinon le cache apparaît sur la séquence). Le cache rétrécit autour de son bord éloigné sur 300–400 ms, découvrant le texte dans l'ordre de lecture.
  • Disparition, commençant sur son signal : le cache se redéveloppe sur le texte en 200–300 ms, puis la barre rétrécit vers son bord sur 250–300 ms. Toute la barre a disparu 450–600 ms après le signal.
  • Taille : barre de 130–180 px de haut sur un cadre de 1080 de large, nom 52–64 px, deuxième ligne 30–38 px. Une bande d'accent de 8–16 px de large sur le bord d'attaque.
  • Cache : exactement le fill de la barre, à 20 px à l'intérieur des extrémités de la barre et à 10 px à l'intérieur de son haut et de son bas, au-dessus du texte.
  • Placement : à 48–80 px du bord du cadre, dégagé de la boîte de légende et du visage du locuteur, généralement à 55–65 % de la hauteur d'un cadre haut.
  • Vérification : frame --from --to --keyframes sur 1 s à partir de chaque signal, et vérifiez qu'aucun cache n'apparaît au-delà de la barre sur aucune vignette. frame --at la barre au repos, et vérifiez que son bord gauche s'aligne avec la marge de la boîte de légende.

Incrustation circulaire image dans l'image

Affichez un deuxième clip dans un cercle : un élément vidéo avec un mask cercle, un anneau derrière lui, et une apparition sur la courbe de dépassement.

{
  "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}]}
    ]}
  ]
}
  • Le rectangle du cercle : un carré aussi haut que l'élément. Son x choisit quelle partie de l'image s'affiche. Le centre est (largeur - hauteur) / 2, et c'est celui à utiliser : l'apparition se met à l'échelle autour de l'origin de l'élément, donc un cercle déplacé du centre dérive latéralement en grandissant. Pour montrer une autre partie de l'image, choisissez un source_start où cette partie se trouve au milieu, ou agrandissez l'élément et réglez son x pour que la partie atterrisse dans le cercle, puis faites varier x sur la courbe d'apparition pour que le centre du cercle reste fixe.
  • Taille : 30–40 % de la largeur du cadre. L'anneau est 12–24 px plus large que le cercle, dans la couleur la plus claire du fond, avec une shadow douce.
  • Apparition : 350–450 ms sur [0.34, 1.56, 0.64, 1] pour les deux, à partir de l'échelle 0, sur les mêmes clés. Sortie en 200–300 ms, ease-in, retour à 0.
  • Timing : apparaît quand le locuteur nomme pour la première fois la chose qu'il montre, disparaît un temps avant la fin pour que la fermeture soit nette.
  • Placement : à côté du locuteur à hauteur de poitrine, dégagé du visage et de la boîte de légende, et à 40 px ou plus du bord du cadre.
  • Son : volume 0 sauf si le son propre du clip est le point.
  • Vérification : frame au pic de l'apparition (début plus 40 % de sa durée) et vérifiez que le cercle dégage le visage et le bord du cadre. frame au repos et vérifiez que la partie qui compte est à l'intérieur du cercle.

Musique sous une voix

La musique baisse pendant que la voix parle et remonte dans les pauses. scripts/duck.py l'écrit comme des images clés volume ordinaires sur l'élément musical, à partir des timings de mots de la voix (--words, un ...

Individual skills in this repo

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

Skills associés