Communitygithub.com

Montage Vidéo

Éditez des séquences réelles par conversation, entièrement en local. Transcription avec whisper.cpp, sélection des prises à partir du transcript, écriture d'une liste de montage JSON, validation, rendu avec ffmpeg, ajout de légendes et superpositions animées Hyperframes, recadrage en 9:16 / 1:1 / 16:9, puis auto-vérification du rendu.

Qu'est-ce que Montage Vidéo ?

Cette compétence permet d'éditer des séquences réelles (têtes parlantes, contenus UGC, témoignages, vidéos de fondateurs, enregistrements d'appels, interviews, tutoriels) par simple conversation en langage naturel, entièrement en local sans aucune clé API. Elle utilise whisper.cpp pour la transcription mot à mot, génère une liste de montage JSON validée, effectue le rendu avec ffmpeg, ajoute des légendes animées via Hyperframes et recadre la toile pour les variantes publicitaires (9:16, 1:1, 16:9). Le processus est structuré en étapes : inventaire, conversation, proposition de stratégie, exécution avec validation automatique, prévisualisation, auto-évaluation rigoureuse et itération. Des règles strictes garantissent la correction technique : les légendes sont appliquées en dernier dans la chaîne de filtres, les coupes sont alignées sur les limites de mots, et un validateur intégré vérifie chaque rendu.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add huzaifa-hb/video-edit

Demander à votre IA préférée

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

Documentation

Que fait Montage Vidéo ?

Fork de browser-use/video-use (MIT) : whisper.cpp local au lieu d'ElevenLabs, une porte de validation avant chaque rendu, des légendes Hyperframes au lieu des sous-titres libass, et un recadrage de la toile pour les variantes publicitaires sur les réseaux sociaux.

Principe

  1. Le LLM raisonne à partir du transcript brut + visuels à la demande. Le seul artefact dérivé qui mérite sa place est un transcript compressé au niveau des phrases (takes_packed.md). Tout le reste — étiquetage des mots de remplissage, détection des reprises, classification des plans, score d'emphase — vous le dérivez au moment de la décision.
  2. L'audio est primaire, les visuels suivent. Les candidats à la coupe proviennent des limites de parole et des silences. N'explorez les visuels qu'aux points de décision.
  3. Demander → confirmer → exécuter → itérer → persister. Ne touchez jamais au montage avant que l'utilisateur n'ait confirmé la stratégie en anglais simple.
  4. Généralisez. Ne présumez pas du type de vidéo. Regardez le matériel, demandez à l'utilisateur, puis montez.
  5. La liberté artistique est le défaut. Chaque valeur, préréglage, police, couleur, durée, structure de pitch et technique spécifiques dans ce document sont un exemple concret d'une vidéo éprouvée — pas un mandat. Lisez-les pour comprendre ce qui est possible et pourquoi chacun a fonctionné. Ensuite, faites vos propres choix de goût en fonction de ce qu'est le matériel et de ce que l'utilisateur veut réellement. Les seules choses que vous DEVEZ faire sont dans la section Règles strictes ci-dessous. Tout le reste vous appartient.
  6. Inventez librement. Si le matériel nécessite une technique non décrite ici — écran partagé, incrustation, cartes d'identité en tiers inférieur, coupes de réaction, rampes de vitesse, arrêts sur image, fondus enchaînés, L-cuts, J-cuts, rampes de vitesse sur la respiration, peu importe — construisez-la. Les assistants sont ffmpeg et PIL. Ils peuvent tout faire ce que le format supporte. N'attendez pas la permission.
  7. Vérifiez votre propre sortie avant de la montrer à l'utilisateur. Si vous ne livreriez pas, ne le présentez pas.

Règles strictes (correction de production — non négociable)

Voici les points où une déviation produit des échecs silencieux ou une sortie cassée. Ce ne sont pas des goûts, ce sont des corrections. Mémorisez-les.

  1. Les légendes sont appliquées en DERNIER dans la chaîne de filtres, après chaque superposition. Sinon, les superpositions cachent les légendes. Échec silencieux.
  2. Extraction par segment → concaténation -c copy sans perte, pas de graphique de filtre en un seul passage. Sinon, vous doublez l'encodage de chaque segment lorsque des superpositions sont ajoutées.
  3. Fondu audio de 30 ms à chaque limite de segment (afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). Sinon, des clics audibles à chaque coupe.
  4. Les superpositions utilisent setpts=PTS-STARTPTS+T/TB pour décaler l'image 0 de la superposition au début de sa fenêtre. Sinon, vous voyez le milieu de l'animation pendant la fenêtre de superposition.
  5. Les légendes utilisent des décalages de la chronologie de sortie : output_time = word.start - segment_start + segment_offset, où chaque segment dure la longueur de son image entière (captions.py fait cela). Sinon, les légendes se désalignent après la concaténation des segments.
  6. Ne coupez jamais à l'intérieur d'un mot. Accrochez chaque bord de coupe à une limite de mot du transcript. validate_edl.py --fix le fait mécaniquement.
  7. Remplissez chaque bord de coupe. Fenêtre de travail : 30–200 ms. Les bords des mots sont déjà accrochés à l'enveloppe audio, mais le remplissage absorbe ce qui reste. Plus serré pour un rythme rapide, plus large pour un rendu cinématographique.
  8. Transcription ASR mot à mot uniquement. Jamais de mode SRT/phrase (perd les données de sous-seconde). Jamais de mots de remplissage normalisés (perd le signal éditorial). transcribe.py invite whisper à conserver "euh"/"hum" — ne supprimez pas l'invite.
  9. Mettez en cache les transcripts par source. Ne retranscrivez jamais à moins que le fichier source lui-même n'ait changé.
  10. Sous-agents parallèles pour plusieurs animations. Jamais séquentiel. Lancez N à la fois via l'outil Agent ; le temps total approximatif ≈ le plus lent.
  11. Confirmation de la stratégie avant exécution. Ne touchez jamais au montage avant que l'utilisateur n'ait approuvé le plan en anglais simple.
  12. Toutes les sorties de session dans <videos_dir>/edit/. N'écrivez jamais dans le répertoire de la compétence.
  13. Validez avant chaque rendu. validate_edl.py <edl> --fix, puis ne rendez que sur le code de sortie 0. Cela détecte les identifiants de source inventés, les temps au-delà de la fin d'un fichier, les coupes au milieu des mots, les fichiers de superposition manquants et les superpositions qui dépassent la coupe — les modes de défaillance que les listes de montage écrites par LLM ont réellement.
  14. Les légendes sont une couche Hyperframes, pas des sous-titres incrustés. Le ffmpeg de Homebrew n'a pas de libass, donc subtitles dans l'EDL échoue. Utilisez captions.py ; render.py composite les légendes WebM au-dessus de chaque superposition.
  15. Les identifiants de source sont les noms de fichiers (sans extension). Dans sources, la clé doit être le nom du fichier vidéo sans extension (take_B pour take_B.mp4), ou <stem>.track<N> lorsqu'il est transcrit avec --audio-track N — c'est ainsi que les transcripts sont trouvés. Le validateur signale une erreur en cas de non-concordance lorsque les légendes sont activées.
  16. Une seule fréquence d'images par rendu. Si vous passez --fps à render.py, passez le même --fps à validate_edl.py et captions.py. Les plages sont arrondies à des images entières afin que les légendes ne dérivent jamais.

Tout le reste dans ce document est un exemple concret. Déviez chaque fois que le matériel le demande.

Disposition des répertoires

La compétence réside dans son propre répertoire (assistants + modèles à côté de ce fichier). Les séquences de l'utilisateur se trouvent là où il les a placées. Toutes les sorties de session vont dans <videos_dir>/edit/.

<videos_dir>/
├── <fichiers sources, non modifiés>
└── edit/
    ├── project.md                 ← mémoire ; ajouté à chaque session
    ├── takes_packed.md            ← transcripts au niveau des phrases, vue de lecture principale du LLM
    ├── edl.json                   ← décisions de montage (edl_9x16.json, edl_1x1.json … pour les variantes)
    ├── transcripts/<name>.json    ← transcripts whisper.cpp mis en cache (mot à mot + silences)
    ├── captions_<edl stem>/       ← composition des légendes Hyperframes + captions.webm
    ├── animations/slot_<id>/      ← source d'animation + rendu + raisonnement
    ├── clips_graded/              ← extractions par segment avec étalonnage + fondus
    ├── downloads/                 ← sorties yt-dlp
    ├── verify/                    ← images de débogage / PNG de la chronologie
    ├── preview.mp4
    └── final.mp4

Configuration

install.sh / setup.sh installe tout (paquets Homebrew, .venv, modèle whisper, Hyperframes + Chrome). Au premier démarrage, vérifiez simplement — et si .venv est manquant ou si un assistant échoue sur une importation ou un outil manquant, exécutez <ce répertoire de compétence>/setup.sh (il est idempotent) avant toute chose :

  • PY=<ce répertoire de compétence>/.venv/bin/python existe. Exécutez chaque assistant avec $PY, jamais le python système (il manque numpy/Pillow/OpenCV).
  • ffmpeg, ffprobe, whisper-cli dans le PATH, et un modèle ggml whisper. Par défaut : ~/.claude-video-vision/models/ggml-large-v3-turbo.bin ; remplacez par VIDEO_EDIT_WHISPER_MODEL.
  • Node.js 22+ pour Hyperframes. Appelez toujours la version épinglée : npx --yes [email protected] ….
  • yt-dlp et Manim uniquement lors de la première utilisation. Cette compétence fournit skills/manim-video/ ; lisez son SKILL.md lors de la construction d'un slot Manim.
  • Pas de clés API. Rien ne quitte la machine à l'exception du téléchargement unique npm d'Hyperframes.

Les assistants se trouvent dans helpers/ à côté de ce SKILL.md. Résolvez leurs chemins par rapport au répertoire contenant ce fichier.

Assistants

Tous prennent $PY helpers/<name>.py ….

  • transcribe.py <video> — whisper.cpp local, mot à mot, conservant les tics de langage, bords des mots accrochés à l'enveloppe audio, silences listés. Mis en cache par source (réexécution uniquement si le fichier a changé). --language en ignore la détection ; --audio-track N pour les enregistrements multipistes.
  • transcribe_batch.py <videos_dir> — chaque vidéo dans un dossier, une par une (whisper sature déjà le GPU).
  • pack_transcripts.py --edit-dir <dir> — transcripts/*.json → takes_packed.md (au niveau des phrases, Coupe sur silence ≥ 0.5s ; abaissez --silence-threshold à 0.3 pour les parleurs rapides).
  • timeline_view.py <video> <start> <end> — bande d'images + PNG de forme d'onde. Exploration visuelle à la demande. Pas un outil de balayage — utilisez-le aux points de décision, pas constamment.
  • validate_edl.py <edl.json> [--fix] — la porte avant chaque rendu (Règle stricte 13). --fix accroche les bords aux lacunes de mots, les remplit (--pad-in, --pad-out), arrondit les plages à des images entières, recalcule total_duration_s, conserve edl.json.bak. Les avertissements concernant les bords avec moins de 30 ms de silence survivent à --fix : ces coupes se situent là où les mots se touchent — déplacez-les vers une vraie pause.
  • captions.py <edl.json> — légendes de mots de la chronologie de sortie sous forme de composition Hyperframes → captions.webm transparent, définit la clé captions de l'EDL. Indicateurs de style : --accent, --color, --top, --size, --font, --case, --words, --no-pop.
  • render.py <edl.json> -o <out> — extraction par segment (image exacte, HDR→SDR, recadrage de la toile, étalonnage, fondus) → concaténation sans perte → superpositions (décalage PTS) → légendes → loudnorm. --preview pour le contrôle qualité, --draft pour les vérifications de coupe uniquement.
  • reframe.py <edl.json> [--apply] — détection de visage OpenCV (YuNet) sur chaque plage → crop_x/crop_y qui gardent l'orateur centré avec un espace libre sur la canvas de l'EDL. Exécutez-le après validate_edl.py --fix chaque fois qu'une canvas change le rapport d'aspect. Il signale les plages où le visage BOUGE trop pour un seul recadrage statique (divisez-les) et les plages avec aucun visage (choisissez le recadrage vous-même). "crop_lock": true sur une plage protège un recadrage manuel.
  • scenes.py <video> — détection de changement de plan OpenCV plus indicateurs SOMBRE / FLOU par plan → edit/shots/<stem>.json. Utilisez-le pour les séquences que le transcript ne peut pas structurer : séquences B, plans produits, montages, exports multi-caméras, clips silencieux. Les limites de plan sont des points de coupe visuels propres ; les plans signalés sont rarement utilisables dans une publicité.
  • grade.py <in> -o <out> — chaîne de filtres ffmpeg d'étalonnage. Paramètres prédéfinis + --filter '<raw>' pour des réglages personnalisés.

Pour les animations, créez <edit>/animations/slot_<id>/ avec Bash et lancez un sous-agent via l'outil Agent.

Le processus

  1. Inventaire. ffprobe de chaque source. transcribe_batch.py sur le répertoire. Pour les sources avec peu ou pas de parole (séquences B, plans produits), exécutez scenes.py pour obtenir leurs plans. Lisez les lignes QC: qu'il imprime (également sous qc dans chaque transcript) : les mots compressés à ≤20 ms ou commençant dans un silence ont des temps peu fiables — vérifiez toute coupe près d'eux avec timeline_view avant de l'utiliser.

    • Plusieurs orateurs (appels, interviews) : il n'y a pas d'étiquettes d'orateur. Déduisez les tours de parole du contenu (questions vs réponses), puis confirmez chaque phrase que vous prévoyez de conserver avec timeline_view (sur les appels vidéo, la vignette de l'orateur actif montre qui parle). Si l'appel a été enregistré avec une personne par piste audio, transcrivez chaque piste avec --audio-track N. pack_transcripts.py pour produire takes_packed.md. Échantillonnez un ou deux timeline_view pour une première impression visuelle.
  2. Pré-analyse des problèmes. Un passage sur takes_packed.md pour noter les lapsus, les erreurs de parole évidentes ou les formulations à éviter. Simple liste, à intégrer dans le brief de l'éditeur.

  3. Conversez. Décrivez ce que vous voyez en anglais simple. Posez des questions façonnées par le matériel. Collectez : type de contenu, longueur/format cible(s), direction esthétique/de marque, sensation rythmique, moments à préserver, moments à couper, préférences d'animation et d'étalonnage, besoins en sous-titres. N'utilisez pas de liste de vérification fixe — les bonnes questions sont différentes à chaque fois.

  4. Proposez une stratégie. 4 à 8 phrases : forme, choix de prise, direction de montage, plan d'animation, direction d'étalonnage, style de sous-titres, estimation de la longueur. Attendez la confirmation.

  5. Exécutez. Produisez edl.json via le brief du sous-agent éditeur. Explorez timeline_view aux moments ambigus. Construisez des animations en parallèle dans des sous-agents. Exécutez validate_edl.py --fix jusqu'à ce qu'il se termine avec 0. Ensuite captions.py si des légendes ont été demandées (les légendes sont construites à partir des plages finales, donc réexécutez-les après tout changement de plage).

  6. Prévisualisation. validate_edl.py (sans --fix) → render.py --preview.

  7. Auto-évaluation (avant de montrer à l'utilisateur). Exécutez timeline_view sur la sortie rendue (pas les sources) à chaque limite de coupe (fenêtre ±1.5s). Vérifiez chaque image pour :

    • Discontinuité visuelle / flash / saut à la coupe
    • Pic de forme d'onde à la limite (clic audio qui a échappé au fondu de 30 ms)
    • Sous-titre caché derrière une superposition (violation de la règle 1)
    • Superposition désalignée ou affichant de mauvaises images (violation de la règle 4)

    Échantillonnez également : les 2 premières secondes, les 2 dernières secondes et 2-3 points intermédiaires — vérifiez la cohérence de l'étalonnage, la lisibilité des sous-titres, la cohérence globale. Exécutez ffprobe sur la sortie pour vérifier que la durée correspond à l'attente de l'EDL.

    Mesurez l'audio, ne présumez pas : ffmpeg -i out.mp4 -af ebur128=peak=true -f null - pour la sonie intégrée et le pic réel, plus RMS par section (dialogue, musique uniquement, carte de fin). Une carte de fin à 15 dB sous le dialogue, ou des effets plus forts que la parole, est un bogue. Vous ne pouvez pas écouter : dites-le, et rapportez les chiffres.

    Pour tout ce que l'utilisateur publiera (lancement, promotion, publicité), lancez également un sous-agent critique avec le fichier rendu, l'EDL et toutes les vidéos de référence données par l'utilisateur. Demandez-lui de critiquer, pas de louer : un verdict, des problèmes classés avec codes temporels et preuves (images, niveaux), et les 5 correctifs à effectuer en premier. Un regard neuf repère ce que l'auteur a cessé de voir — lignes de punchline coupées, mèmes de 0,5 s, texte illisible en 28 px à la taille d'un téléphone.

    Si quelque chose échoue : corrigez → re-rendu → réévaluation. Limitez à 3 passages d'auto-évaluation — si des problèmes persistent après 3, signalez-les à l'utilisateur plutôt que de boucler à l'infini. Ne présentez l'aperçu qu'une fois l'auto-évaluation réussie.

  8. Itérez + persistez. Retour en langage naturel, re-planification, re-rendu. Ne retranscrivez jamais. Rendu final sur confirmation. Ajoutez à project.md.

Art du montage (techniques)

  • Audio d'abord. Coupes candidates à partir des limites de mots et des silences.
  • Préservez les pics. Rires, punchlines, battements d'emphase. Prolongez au-delà des punchlines pour inclure les réactions — le rire EST le battement.
  • Les changements d'orateur bénéficient d'un temps mort entre les énoncés. Valeurs courantes : 400–600 ms. Moins pour un rythme rapide, plus pour un rendu cinématographique. Choix de goût.
  • Les rires et réactions ne sont pas étiquetés (whisper n'émet pas d'événements audio). Trouvez-les comme des étendues sans parole mais fortes dans les formes d'onde de timeline_view ; prolongez au-delà — le rire EST le battement.
  • Les silences sont des candidats à la coupe.

[Note : le contenu original semble avoir été tronqué. La traduction ci-dessus couvre tout le texte fourni.]

Skills associés