Communitygithub.com

morrimoz/talking-head-clip-review

À utiliser lorsque quelqu'un s'est filmé en train de parler face caméra et a besoin que les meilleurs extraits soient sélectionnés. Couvre plusieurs prises du même script (aligner chaque prise par ligne de script et les comparer côte à côte) et un long enregistrement (découper chaque point de discussion en extraits à garder ou à ignorer). Transcrit localement avec horodatage des mots, supprime les pauses et les redémarrages, évalue la fluidité, construit une page HTML de révision avec des extraits lisibles, les décisions Garder/Ignorer et des notes, exporte les décisions vers JSON, puis assemble les sélections sous forme de rendu ffmpeg, EDL et CSV. Shell simple + python, donc fonctionne dans Claude Code, Codex et Cursor.

Qu'est-ce que talking-head-clip-review ?

Cette compétence automatise l'édition de séquences de type « talking head » (prise de parole face caméra) en remplaçant le visionnage manuel par un workflow structuré : transcription locale, alignement des prises multiples ou découpage d'un long enregistrement, évaluation de la fluidité, puis présentation d'une page de révision HTML interactive. L'utilisateur approuve ou rejette chaque extrait en un clic, et l'agent assemble automatiquement les sélections retenues sous forme de fichier vidéo, table de montage EDL, CSV et JSON. Fonctionne avec Claude Code, Codex et Cursor grâce à une combinaison de scripts shell et Python. La transcription reste locale (Whisper), les vidéos sources ne sont jamais modifiées, et la compétence gère les contraintes d'édition (coupures, transitions, regards, bruits).

Compatible avec✓Claude Code✓Codex CLI✓Cursor
npx skills add https://github.com/morrimoz/talking-head-clip-review/tree/HEAD

Demander à votre IA préférée

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

Documentation

Révision d'extraits de prise de parole face caméra

Transformez des rushes de parole face caméra en sélections approuvées sans que personne ne doive les visionner manuellement. L'agent transcrit, aligne et suggère. Une personne approuve sur une page. L'agent assemble ensuite exactement ce qui a été approuvé.

La transcription reste sur la machine. Les vidéos sources ne sont jamais modifiées.

Règles strictes

  • Ne jamais modifier, déplacer ou ré-exporter les vidéos sources. Tout se résume à des points d'entrée/sortie et des fichiers dérivés.
  • Ne jamais supprimer les rushes de l'utilisateur ni vider la corbeille. Si l'espace disque est insuffisant, prévenez et laissez l'utilisateur agir.
  • Travaillez dans un dossier temporaire. Seuls les aperçus, les affiches, la page de révision et les sélections accompagnent les médias.
  • N'inventez pas de formulation. Le texte des extraits provient de la transcription. Les corrections facultatives de phrases vivent dans un fichier JSON passé avec --fix (voir references/term-corrections.example.json). N'appliquez pas le fichier d'exemple.
  • Vérifiez les faits prononcés face caméra (heures, chiffres, « il y a 10 minutes ») par rapport à l'enregistrement réel avant de les sélectionner.
  • Pas de regards vers le moniteur, de chocs sur le micro, de clics ou de bruits de respiration dans un segment conservé. Relancez le regard (étape 5) et écoutez chaque point de montage après toute ré-édition, pas seulement lors de la première sélection. Coupez ou atténuez le bruit, jamais le mot adjacent.
  • Les reprises et les lignes ré-enregistrées doivent correspondre au ton, au niveau sonore et à l'environnement de la prise principale (même micro, gain, distance, égalisation et débruitage). Signalez une ligne qui semblera étouffée ou enfermée au lieu de la livrer.
  • Utilisez des traits d'union (pas des tirets longs) dans tout ce que vous écrivez pour l'utilisateur.
  • Les limites de mots sont des contraintes absolues, même lorsqu'une instruction demande des coupes serrées ou des coupures de regard. Les extraits reçoivent un pré-rouleau de 0,15s et une queue de 0,25s autour des temps de mots de Whisper (ses bords de mots sont souvent en avance ou en retard), limités pour ne jamais empiéter sur un mot voisin. Les coupures de pause et de regard ne coupent que dans les espaces entre les mots et conservent au moins 0,1s à côté de chaque mot. Si un regard détourné chevauche un mot parlé, gardez le mot et signalez-le (away_words, bordure rouge dans le stringout), ne le coupez jamais. Utilisez build_review.py --gaze-trim pour les coupures de bord au lieu d'écrire votre propre script de coupure. Les exact_spans définis manuellement sont également repoussés aux bords des mots.

Configuration (une fois par machine)

Exécutez scripts/check_deps.sh. Il nécessite ffmpeg, ffprobe, python3 et un backend Whisper. Swift est facultatif pour l'étape de regard. Étapes d'installation : references/setup.md.

Structure

TRAVAIL/                      dossier temporaire, par exemple ./talk/
  tx/<prise>.wav|json|txt     audio 16 kHz mono, JSON Whisper avec mots, transcription lisible
  picks.json                  beats + candidats (édité par l'agent)
  picks_resolved.json         plages précises aux mots, texte, durées (généré)
  pose.json                   intervalles de regard détourné (facultatif, macOS)
REVISION/                     à côté des médias, par exemple ./review/
  previews/<prise>.mp4        copies 540p H.264 pour la page
  posters/<beat>-<i>.jpg
  "<Titre> - prise review.html"
  "<Titre> - stringout des extraits (540p).mp4"
SELECTIONS/                   selections.json, selections.csv, selections.edl, selections.mp4

Nommez l'épisode d'après le sujet, par exemple launch-01. Gardez les clés de prise courtes (A, B, C) et mappez-les aux noms de fichiers dans picks.json.

Étapes

  1. Inventaire. ffprobe chaque prise (durée, taille, fps, rotation). Les vidéos de téléphone sont souvent à débit variable et en portrait. Les aperçus et les rendus normalisent cela. Demandez quels fichiers sont les exports étalonnés à couper, et lesquels sont les originaux de la caméra à ignorer.
  2. Transcrire. python3 scripts/transcribe.py --out TRAVAIL/tx PRISE.... Utilisez l'interpréteur signalé par check_deps.sh si le package Whisper n'est pas sur le python3 par défaut. Si les fichiers sont encore en cours d'export, utilisez --watch DOSSIER --expect N en arrière-plan : il attend que chaque fichier n'ait plus grossi pendant 30s. Modèle préféré sur Apple Silicon : mlx-community/whisper-large-v3-turbo, horodatage des mots, avec condition_on_previous_text désactivé. Définissez --lang lorsque la parole n'est pas en anglais.
  3. Ébaucher les sélections.
    • Mode (a), prises d'un script : écrivez TRAVAIL/script.txt avec une ligne ou un point de discussion par ligne (id | nom | texte si vous voulez des identifiants). Exécutez python3 scripts/segment.py takes --tx TRAVAIL/tx --script TRAVAIL/script.txt --out TRAVAIL/picks.json A=prise-a B=prise-b .... Il trouve chaque tentative de chaque ligne dans chaque prise (correspondance floue par fenêtre de mots, donc les redémarrages apparaissent comme des candidats distincts) et pré-coche la plus fluide.
    • Mode (b), une seule longue vidéo : python3 scripts/segment.py single --tx TRAVAIL/tx --out TRAVAIL/picks.json A=longue-prise coupe aux pauses de 1,2s ou plus et aux fins de phrase, en extraits de 4 à 40s.
    • Ensuite, lisez vous-même les transcriptions .txt. Corrigez les points d'entrée/sortie, ajoutez cut: [[a,b]] pour les redémarrages et les défauts, fusionnez ou divisez les beats, et écrivez un why réel par candidat (propre, redémarrage, mauvais mot, correspond à l'enregistrement d'écran). Privilégiez la prise qui a été filmée avec l'enregistrement d'écran correspondant. Le score automatique ne départage que les ex æquo.
  4. Construire la page. python3 scripts/build_review.py --work TRAVAIL --media SRC --out REVISION --title "launch-01" --stringout. Les plages sont divisées aux espaces entre mots de plus de 0,6s et resserrées avec silencedetect -35dB / 0.35s. Ajoutez keep_pauses: true sur un candidat pour ignorer cela. Indicateurs de marge : --pre 0.15 --tail 0.25 --guard 0.1. Passez --fix chemin/vers/corrections.json uniquement lorsque vous avez un véritable dictionnaire de phrases. Ouvrez le HTML dans le navigateur. Les vidéos se chargent au clic, donc la page s'ouvre rapidement.
  5. Facultatif, macOS : regard. python3 scripts/gaze.py --work TRAVAIL --review REVISION, puis relancez l'étape 4 avec --stringout --gaze-trim. Les images de regard détourné obtiennent une bordure rouge dans le stringout. Couvrez-les plus tard avec des images d'écran et conservez l'audio.
  6. Révision humaine. Dites à l'utilisateur quoi faire : Lire, Utiliser/Ignorer, notes, puis « Sauvegarder les décisions (JSON) ». Cela télécharge <slug>-decisions.json. « Copier comme texte » est la solution de repli. Les cartes non touchées conservent la suggestion.
  7. Appliquer les notes. Lisez le JSON des décisions. Transformez chaque note en modifications de picks.json : cut, in/out, audio_only: true, grade: "eq=gamma=1.28:brightness=0.03", optional: true. Faites d'abord une sauvegarde (cp picks.json picks.before-notes.json). Relancez l'étape 4 et résumez chaque note et ce que vous avez fait.
  8. Assembler. python3 scripts/assemble.py --work TRAVAIL --media SRC --decisions /chemin/vers/<slug>-decisions.json --out SELECTIONS --render. Vous obtenez un selects.mp4 en pleine résolution, précis à l'image, un selects.edl CMX3600 (importable dans Premiere, Resolve, Final Cut), selects.csv et selects.json avec les plages de regard détourné et les notes.
  9. Vérifier. Écoutez chaque point de montage (pas de première ou dernière syllabe coupée, pas de regard, pas de bruit). ffprobe la durée du rendu par rapport à la somme dans selects.json, et créez une planche contact : ffmpeg -i selects.mp4 -vf "fps=1/6,scale=180:-1,tile=10x3" -frames:v 1 sheet.jpg. Visualisez-la, puis rapportez la durée, ce qui a changé et ce qui nécessite encore l'utilisateur.

Format de picks.json

{"episode":"launch-01","mode":"takes","takes":{"A":"prise-a","B":"prise-b"},
 "beats":[{"id":"01a","name":"Accroche","script":"...","cands":[
   {"take":"B","in":0.82,"out":21.2,"pick":true,"why":"Propre, correspond à l'écran.","cut":[[51.4,53.82]],
    "note":"","audio_only":false,"grade":null,"optional":false,"signals":{"dur":20.1,"wpm":162,"fillers":0,"repeats":0}}]}]}

Conseils

  • Vérifiez ponctuellement tout timing de mot avec le JSON de transcription. Un dump de mot@début-fin autour d'une note est le moyen le plus rapide de placer une coupe.
  • Si ffmpeg n'a pas drawtext, marquez les images avec drawbox ou hue, pas de texte.
  • Gros rendus : vérifiez d'abord l'espace disque libre. Les prises 4K s'accumulent vite.

Skills associés