findbene/skills

Compétence agent pour la réalisation de vidéos de lancement ou de démonstration produit, exploitant l'audio comme source principale et générant des visuels à la demande.

Qu'est-ce que skills ?

Cette compétence transforme un agent d'IA (comme Claude Code, Cursor ou Codex) en un assistant de montage vidéo complet et autonome. Son approche est fondamentalement audio-centrée : les décisions de coupe sont principalement guidées par les limites de mots et les silences de la bande-son, et les visuels ne sont consultés qu'aux points de décision précis. Le flux de travail est structuré et sécurisé, avec une règle stricte « Demander → Confirmer → Exécuter » qui empêche toute modification avant l'approbation explicite de l'utilisateur. La compétence s'appuie sur des outils légers (ffmpeg, Python, PIL) et peut générer des animations, des sous-titres et des effets complexes sans nécessiter d'infrastructure lourde. Elle est idéale pour les démonstrations de produits, les lancements, les interviews ou les tutoriels. Le processus est entièrement reproductible et itératif, avec des étapes de vérification automatique de la qualité (auto-évaluation) avant présentation du résultat final.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add findbene/skills

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

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

Documentation

Utilisation vidéo

Principe

  1. Le LLM raisonne à partir de la transcription brute et de visuels à la demande. Le seul artefact dérivé qui a de la valeur est une transcription au niveau de la phrase, compressée (takes_packed.md). Tout le reste — marquage des mots de remplissage, détection des reprises, classification des plans, score d'emphase — vous le dérivez au moment de la décision. → vérifier : la sortie de l'étape correspond au résultat attendu
  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. → vérifier : la sortie de l'étape correspond au résultat attendu
  3. Demander → Confirmer → Exécuter → Itérer → Persister. Ne touchez jamais au montage tant que l'utilisateur n'a pas confirmé la stratégie en langage simple.
  4. Généralisez. Ne présumez pas du type de vidéo. Examinez le matériel, demandez à l'utilisateur, puis montez. → vérifier : la différence correspond au changement souhaité
  5. La liberté artistique est la valeur par défaut. Chaque valeur spécifique, préréglage, police, couleur, durée, structure de hauteur et technique décrite dans ce document est un exemple concret issu d'une vidéo éprouvée — pas une obligation. Lisez-les pour comprendre ce qui est possible et pourquoi chacun a fonctionné. Ensuite, prenez vos propres décisions en fonction du matériel réel et de ce que l'utilisateur souhaite réellement. Les seules choses que vous DEVEZ faire sont dans la section Règles strictes ci-dessous. Tout le reste vous appartient. → vérifier : le contenu du fichier correspond à la forme attendue
  6. Inventez librement. Si le matériel nécessite une technique non décrite ici — écran partagé, incrustation, cartes d'identité en bas de l'écran, plans de réaction, variations de vitesse, arrêts sur image, fondus enchaînés, raccords dans le mouvement, L-cuts, J-cuts, variations de vitesse sur la respiration, peu importe — construisez-la. Les outils sont ffmpeg et PIL. Ils peuvent faire tout ce que le format supporte. N'attendez pas la permission. → vérifier : la sortie de l'étape correspond au résultat attendu
  7. Vérifiez votre propre sortie avant de la montrer à l'utilisateur. Si vous ne l'expédieriez pas, ne la présentez pas.

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

Voici les choses où un écart produit des échecs silencieux ou des sorties cassées. Ce n'est pas une question de goût, c'est une question de justesse. Mémorisez-les.

  1. Les sous-titres sont appliqués EN DERNIER dans la chaîne de filtres, après chaque incrustation. Sinon, les incrustations cachent les légendes. Échec silencieux. → vérifier : la sortie de l'étape correspond au résultat attendu
  2. Extraction par segment → concaténation -c copy sans perte, pas un filtre unique. Sinon, vous double-encodez chaque segment lorsque des incrustations 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 pops audibles à chaque coupe. → vérifier : la sortie de l'étape correspond au résultat attendu
  4. Les incrustations utilisent setpts=PTS-STARTPTS+T/TB pour décaler l'image 0 de l'incrustation au début de sa fenêtre. Sinon, vous voyez le milieu de l'animation pendant la fenêtre d'incrustation. → vérifier : la sortie de l'étape correspond au résultat attendu
  5. Le SRT maître utilise les décalages de la chronologie de sortie : output_time = word.start - segment_start + segment_offset. Sinon, les légendes sont désalignées après la concaténation des segments. → vérifier : la sortie de l'étape correspond au résultat attendu
  6. Ne coupez jamais à l'intérieur d'un mot. Accrochez chaque bord de coupe à une limite de mot de la transcription Scribe. → vérifier : la sortie de l'étape correspond au résultat attendu
  7. Ajoutez un padding à chaque bord de coupe. Fenêtre de travail : 30–200 ms. Les horodatages Scribe dérivent de 50 à 100 ms — le padding absorbe la dérive. Plus serré pour les rythmes rapides, plus large pour le cinéma. → vérifier : la sortie de l'étape correspond au résultat attendu
  8. Transcription ASR textuelle uniquement au niveau du mot. Jamais en mode SRT/par phrase (perd les données de sous-seconde). Jamais de mots de remplissage normalisés (perd le signal éditorial). → vérifier : la différence correspond au changement souhaité
  9. Mettez en cache les transcriptions par source. Ne retranscrivez jamais sauf si le fichier source lui-même a changé. → vérifier : la sortie de l'étape correspond au résultat attendu
  10. Sous-agents parallèles pour plusieurs animations. Jamais séquentiel. Déclenchez N en même temps via l'outil Agent ; le temps total ≈ le plus lent. → vérifier : la sortie de l'étape correspond au résultat attendu
  11. Confirmation de la stratégie avant exécution. Ne touchez jamais au montage tant que l'utilisateur n'a pas approuvé le plan en langage simple. → vérifier : la sortie de l'étape correspond au résultat attendu
  12. Toutes les sorties de session dans <videos_dir>/edit/. N'écrivez jamais dans le répertoire du projet video-use/. → vérifier : la sortie existe + s'analyse sans erreur

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

Structure des répertoires

La compétence vit dans video-use/. Les séquences de l'utilisateur se trouvent là où il les a mises. 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         ← transcriptions au niveau de la phrase, vue de lecture principale du LLM
    ├── edl.json                ← décisions de coupe
    ├── transcripts/<nom>.json  ← JSON Scribe brut en cache
    ├── animations/slot_<id>/   ← source + rendu + raisonnement par animation
    ├── clips_graded/           ← extractions par segment avec étalonnage + fondus
    ├── master.srt              ← sous-titres sur la chronologie de sortie
    ├── downloads/              ← sorties yt-dlp
    ├── verify/                 ← images de débogage / PNG de la chronologie
    ├── preview.mp4
    └── final.mp4

Configuration

  • ELEVENLABS_API_KEY dans .env à la racine du projet ou dans l'environnement. Demandez et écrivez .env s'il manque.
  • ffmpeg + ffprobe dans le PATH.
  • Dépendances Python : pip install -e ..
  • yt-dlp, manim, Remotion installés uniquement lors de la première utilisation.
  • Cette compétence fournit skills/manim-video/. Lisez son SKILL.md lorsque vous construisez un emplacement Manim.

Outils

  • transcribe.py <vidéo> — appel Scribe pour un seul fichier. --num-speakers N optionnel. Mise en cache.
  • transcribe_batch.py <répertoire_vidéos> — transcription parallèle à 4 travailleurs. Utilisez-le pour les prises multiples.
  • pack_transcripts.py --edit-dir <répertoire> — transcripts/*.json → takes_packed.md (au niveau de la phrase, coupe sur silence ≥ 0,5 s).
  • timeline_view.py <vidéo> <début> <fin> — bande de film + forme d'onde PNG. Exploration visuelle à la demande. Pas un outil de scan — utilisez-le aux points de décision, pas constamment.
  • render.py <edl.json> -o <sortie> — extraction par segment → concaténation → incrustations (décalage PTS) → sous-titres EN DERNIER. --preview pour un rendu 720p rapide. --build-subtitles pour générer master.srt en ligne.
  • grade.py <entrée> -o <sortie> — chaîne de filtres ffmpeg pour l'étalonnage. Préréglages + --filter '<brut>' pour un étalonnage personnalisé.

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

Le processus

  1. Inventaire. ffprobe sur chaque source. transcribe_batch.py sur le répertoire. pack_transcripts.py pour produire takes_packed.md. Échantillonnez un ou deux timeline_view pour une première impression visuelle. → vérifier : la sortie de l'étape correspond au résultat attendu

  2. Pré-analyse des problèmes. Un passage sur takes_packed.md pour noter les lapsus, les erreurs de langage évidentes ou les formulations à éviter. Liste simple, à intégrer dans le brief d'édition. → vérifier : la sortie de l'étape correspond au résultat attendu

  3. Dialogue. Décrivez ce que vous voyez en langage simple. Posez des questions adaptées au matériel. Recueillez : type de contenu, durée/cible d'aspect, direction esthétique/marque, rythme, moments à préserver absolument, moments à couper absolument, préférences d'animation et d'étalonnage, besoins en sous-titres. N'utilisez pas une liste de contrôle fixe — les bonnes questions sont différentes à chaque fois. → vérifier : tous les tests réussissent

  4. Proposer une stratégie. 4 à 8 phrases : forme, choix de prises, direction du montage, plan d'animation, direction de l'étalonnage, style des sous-titres, estimation de la durée. Attendez la confirmation. → vérifier : la sortie de l'étape correspond au résultat attendu

  5. Exécution. Produisez edl.json via le brief du sous-agent éditeur. Explorez timeline_view aux moments ambigus. Construisez les animations dans des sous-agents parallèles. Appliquez l'étalonnage par segment. Composez via render.py. → vérifier : code de sortie de la commande 0

  6. Aperçu. render.py --preview. → vérifier : la sortie de l'étape correspond au résultat attendu

  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,5 s). Vérifiez chaque image pour : → vérifier : code de sortie de la commande 0

    • Discontinuité visuelle / flash / saut à la coupe
    • Pic de forme d'onde à la limite (pop audio qui a échappé au fondu de 30 ms)
    • Sous-titre caché derrière une incrustation (violation de la règle 1)
    • Incrustation mal alignée ou montrant les mauvaises images (violation de la règle 4)

    Échantillonnez aussi : les 2 premières secondes, les 2 dernières secondes et 2–3 points médians — 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 aux attentes de l'EDL.

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

  8. Itérer + persister. Retour en langage naturel, nouvelle planification, nouveau rendu. Ne retranscrivez jamais. Rendu final sur confirmation. Ajoutez à project.md. → vérifier : la sortie de l'étape correspond au résultat attendu

Art du montage (techniques)

  • Audio d'abord. Candidats à la coupe à partir des limites de mots et des silences.
  • Préservez les pics. Rires, chutes, temps forts. Prolongez après les chutes pour inclure les réactions — le rire EST le moment clé.
  • Les passes entre locuteurs bénéficient d'un silence entre les énoncés. Valeurs courantes : 400–600 ms. Moins pour les rythmes rapides, plus pour le cinéma. Décision de goût.
  • Les événements audio comme signaux. (rires), (soupirs), (applaudissements) marquent les moments clés. Prolongez au-delà.
  • Les silences sont des candidats à la coupe. Les silences ≥400 ms sont généralement les plus propres. Les limites de phrase de 150 à 400 ms sont utilisables avec une vérification visuelle. <150 ms est dangereux (milieu de phrase).
  • Exemple de padding de coupe (la vidéo de lancement livrée avec ceci) : 50 ms avant le premier mot conservé, 80 ms après le dernier. Plus serré pour l'énergie du montage, plus large pour le documentaire. Restez dans la fenêtre de travail de 30 à 200 ms (Règle stricte 7).
  • Ne raisonnez jamais l'audio et la vidéo indépendamment. Chaque coupe doit fonctionner sur les deux pistes.

La transcription compressée (vue de lecture principale)

pack_transcripts.py lit tous les transcripts/*.json et produit un fichier markdown où chaque prise est une liste de lignes au niveau de la phrase, chacune préfixée par son intervalle de temps [début-fin]. Les phrases sont coupées sur tout silence ≥ 0,5 s OU changement de locuteur. C'est l'artefact que le sous-agent éditeur lit pour choisir les coupes — il offre une précision au niveau du mot à partir du texte seul avec 1/10e des jetons du JSON brut.

Exemple de ligne :

## C0103  (durée : 43,0 s, 8 phrases)
  [002.52-005.36] S0 Quatre-vingt-dix pour cent de ce qu'un agent web fait est complètement perdu.
  [006.08-006.74] S0 Nous avons corrigé cela.

Brief du sous-agent éditeur (pour la sélection multi-prise)

Lorsque la tâche consiste à « choisir la meilleure prise de chaque temps fort parmi plusieurs clips », déclenchez un sous-agent dédié avec un brief structuré comme suit. La structure est importante ; l'exemple de forme de présentation ne l'est pas.

Vous montez une vidéo de <type>. Choisissez la meilleure prise de chaque temps fort et
assemblez-les chronologiquement par temps fort, pas par ordre des clips sources.

ENTRÉES :
  - takes_packed.md (transcriptions au niveau de la phrase avec annotations temporelles de toutes les prises)
  - Contexte produit/récit : <2 phrases de l'utilisateur>
  - Intervenant(s) : <nom, rôle, note sur le style de présentation>
  - Structure attendue : <choisissez un archétype ou inventez-en un>
  - Lapsus à éviter : <liste issue du passage de pré-analyse>
  - Durée cible : <secondes>

Archétypes structurels courants (choisissez, adaptez ou inventez) :
  - Lancement tech / démo :   ACCROCHE → PROBLÈME → SOLUTION → BÉNÉFICE → EXEMPLE → APPEL À L'ACTION
  - Tutoriel :                INTRODUCTION → CONFIGURATION → ÉTAPES → PIÈGES → RÉCAPITULATIF
  - Interview :               (QUESTION → RÉPONSE → SUIVI) répété
  - Voyage / événement :      ARRIVÉE → TEMPS FORTS → MOMENTS CALMES → DÉPART
  - Documentaire :            THÈSE → PREUVES → CONTREPOINT → CONCLUSION
  - Musique / performance :   INTRODUCTION → COUPLET → REFRAIN → PONT → OUTRO
  - Ou inventez le vôtre.

RÈGLES :
  - Les heures de début/fin doivent tomber sur des limites de mots de la transcription.
  - Ajoutez un padding aux limites de coupe (fenêtre de travail 30–200 ms).
  - Préférez des candidats à la coupe basés sur les silences (>= 400 ms de préférence).
  - Vérifiez les transitions entre locuteurs (laissez un silence de 400 à 600 ms entre les énoncés).
  - Ne coupez jamais avant ou après un mot de remplissage conservé (gardez le flux naturel).
  - Si une prise contient un lapsus évident, éliminez-la, sauf si c'est la seule occurrence d'un temps fort essentiel.

SORTIE :
  Un fichier edl.json avec la structure suivante. Chaque segment correspond à un temps fort sélectionné depuis takes_packed.md.

```json
[
  {
    "source": "nom_de_fichier.mp4",
    "start": <secondes_avec_une_décimale>,
    "end": <secondes_avec_une_décimale>,
    "offset": <secondes_avec_une_décimale>,
    "grade": "nom_du_préréglage",
    "overlays": []
  }
]

L'offset correspond à l'heure de début de ce segment dans le montage final. Le premier segment a un offset de 0,0. Chaque segment suivant a un offset égal à l'offset précédent plus la durée du segment précédent.

Skills associés