Clips
Chemins : ${CLAUDE_SKILL_DIR} désigne le dossier contenant ce SKILL.md, et ${CLAUDE_SKILL_DIR}/../.. le dossier de l'éditeur (le .claude/ de ce dépôt) deux niveaux au-dessus.
Lisez d'abord ${CLAUDE_SKILL_DIR}/../../PRINCIPLES.md : les règles que toute vidéo suit (question, authenticité, mouvement, récit et cadrage, vie privée, coût).
Chaque question à l'utilisateur passe dans la boîte de question : utilisez l'outil AskUserQuestion (2-4 options, la recommandée en premier). Uniquement dans un agent sans cet outil, posez les questions numérotées en texte.
Une vidéo longue en entrée. Les meilleurs clips courts en sortie, chacun un montage vertical fini dans le style de l'utilisateur.
clips/<nom>/
source.mp4 la vidéo longue (un lien symbolique pour un fichier local ; ne jamais modifier l'original)
source.mp3, cover.jpg pour un podcast audio uniquement : son audio et l'image de l'émission
words.raw.json une transcription de l'ensemble (ne jamais la lire)
candidates.json chaque candidat avec ses caractéristiques (ne jamais le lire)
shortlist.md les 8 meilleurs qui ne se chevauchent pas, environ 1 500 tokens : le seul fichier que vous lisez
shortlist.json la même chose, pour la page
picks.html la page à partir de laquelle l'utilisateur choisit
edits/<nom>-clip<N>/ un montage par clip choisi : source.mp4, words.raw.json (réajusté), clip.json
Exécutez les scripts avec python3 sur Mac et Linux, py sur Windows.
PY="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/run.py" ; python3 "$PY" ci-dessous exécute le Python du venv de l'éditeur (py "$PY" sur Windows).
S'il manque, exécutez d'abord la compétence setup. K="${CLAUDE_SKILL_DIR}/scripts/clips.py",
C="${CLAUDE_SKILL_DIR}/../../skills/cut/scripts", S="${CLAUDE_SKILL_DIR}/../../skills/style-edit/scripts".
0. Demander, une fois
Lisez d'abord le profil et les goûts (python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" show,
python3 "${CLAUDE_SKILL_DIR}/../../skills/taste/scripts/taste.py" show). Pas encore de profil : exécutez d'abord le
recueil de style de la compétence start, afin que les clips sortent dans l'apparence de l'utilisateur.
Ensuite, un appel à la boîte de question, l'option recommandée en premier :
| question | options |
|---|---|
| Combien de clips ? | 3 (Recommandé) / 5 / 1 |
| Quelle durée pour chacun ? | 20-40 s (Recommandé) / 40-60 s / 60-90 s |
| Combien de personnes parlent dedans ? | une (Recommandé) / deux (un podcast ou une interview) |
Sautez toute question déjà répondue par l'utilisateur. Ces questions remplacent celle de la compétence cut ("couper d'abord ou tout en une fois") : les clips s'exécutent directement, et l'utilisateur approuve les sélections et les feuilles de photogrammes.
1. La vidéo
Un fichier local (un lien physique sur le même disque, sinon un lien symbolique, une copie uniquement en dernier recours) :
python3 "${CLAUDE_SKILL_DIR}/../../skills/clips/scripts/clips.py" link "<chemin absolu>" clips/<nom>
Un lien :
python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/links.py" fetch "<url>" clips/<nom> --max-height 1080
Il utilise yt-dlp du venv (l'installation le met là, pas dans le PATH), limite le téléchargement à 1080p (un
clip 1080x1920 n'a pas besoin de 4K ; une discussion de 20 minutes en 4K fait plusieurs Go) et affiche le chemin du fichier :
clips/<nom>/source.mp4. Code de sortie 3 : le site demande une connexion (le "confirmez que vous n'êtes pas un robot" de YouTube).
Demandez dans la boîte de question avant de relancer avec --cookies-from-browser chrome (ou leur navigateur).
Un podcast (lien RSS ou Apple Podcasts) : route liste ses épisodes les plus récents comme options ask ; demandez
lequel dans la boîte de question (le plus récent en premier), puis fetch "<url de l'option>" clips/<nom de l'option> --direct --cover "<image de l'option>" :
l'audio arrive sous forme de source.mp3 (ou son extension propre) et l'image de l'émission sous forme de cover.jpg.
Téléchargez uniquement ce que l'utilisateur a le droit de réutiliser : sa propre vidéo, ou une pour laquelle il a
l'autorisation. Dites-le une fois si le lien appartient à quelqu'un d'autre.
2. Transcrire une fois
python3 "$PY" "$C/transcribe.py" clips/<nom>/source.mp4 clips/<nom>/words.raw.json # le fichier que fetch a affiché : source.mp3 pour l'audio
Annoncez d'abord la durée : Whisper prend 1 à 4 minutes pour 3 minutes de vidéo sur un portable (gratuit), Scribe
environ 20 s pour une vidéo de 13 minutes. Mêmes moteurs que la compétence cut. Scribe ajoute les rires et autres événements audio, utilisés par le score.
Chaque clip réutilise cette transcription : rien n'est transcrit deux fois.
3. Candidats et shortlist
python3 "$K" candidates clips/<nom> --min 20 --max 40 [--speakers 2] [--style creator-teardowns/<handle>/style.json]
Passez la durée choisie par l'utilisateur. --style est le premier créateur du profil : les mouvements "ce qui marche"
mesurés là sont listés dans la shortlist. Le code divise la transcription en phrases et fait de chaque suite de
phrases entières dans la durée un candidat (ne commence jamais par "Mm-hmm" ni ne finit en milieu de mot),
les mesure, les classe par caractéristiques et écrit shortlist.md.
Lisez uniquement shortlist.md. Chaque entrée a l'accroche, les premiers mots de chaque phrase intermédiaire, la
dernière phrase et les caractéristiques mesurées. Jugez chaque entrée sur quatre questions : l'accroche fonctionne-t-elle
seule, un étranger peut-il la suivre, y a-t-il une conclusion, y a-t-il une affirmation concrète, un nombre ou une histoire.
Ne lisez jamais words.raw.json ou candidates.json. Choisissez le nombre de clips demandé par l'utilisateur dans la
shortlist, les meilleurs d'abord. Supprimez, quel que soit le score :
- une lecture publicitaire, un segment sponsorisé, une introduction ou une conclusion ;
- une accroche qui repose sur un contexte antérieur ("comme je l'ai dit", "c'est pourquoi", "celui-ci") ;
- un clip dont le point repose sur une affirmation datée ("au moment où j'enregistre ceci, c'est le numéro 40") alors que
l'affirmation a changé depuis : une capture en direct de la page d'aujourd'hui la contredirait.
4. La page de sélection, puis la boîte de question
python3 "$K" page clips/<nom> --recommend c12,c40,c7
open clips/<nom>/picks.html # Windows : start "" ..., Linux : xdg-open ...
Une page : chaque clip de la shortlist avec un aperçu de 360 px, sa transcription (l'accroche en gras), la
décomposition du score et les caractéristiques mesurées, vos choix marqués. Ensuite demandez dans la boîte de question
(sélection multiple) : vos choix d'abord, chacun étiqueté avec son horodatage et son accroche, plus "un différent
parmi la page". Attendez la réponse.
5. Chaque clip choisi
python3 "$K" trim clips/<nom> c12 c40 c7 # -> edits/<nom>-clip1, -clip2, -clip3
Chaque dossier de montage reçoit source.mp4 (précis à la trame, rempli sans attraper le mot suivant) et
words.raw.json réajusté pour lui. Une source audio uniquement (source.mp3) n'a pas d'image : trim crée pour chaque
clip un source.mp4 avec son audio sur la couverture du podcast (la couverture floutée et assombrie pour remplir 1080x1920,
la couverture nette au-dessus des sous-titres ; pas d'illustration : noir), et clip.json indique audio_only. Avec une couverture, le
rendu la déplace : un lent zoom sur la couverture, le fond défilant contre elle, une petite impulsion au début de chaque phrase. Pour ceux-ci,
ne demandez pas de disposition : superposition, recadrage non, pas de cut-out, sous-titres activés (profile.py style les laisse activés). Dites une fois
que chaque clip est l'audio sur la couverture de l'émission avec les mots de l'orateur en sous-titres. Avant d'exécuter les clips, réglez la musique une fois pour tous
(style-edit references/plan.md "Music" ; le style décide sauf si l'utilisateur a défini sound.music).
Tous les clips en une fois (Claude Code, ou tout agent avec sous-agents) : lancez un agent clip-editor
(clip-editor) par clip, tous dans un seul message pour qu'ils s'exécutent simultanément. Donnez à chacun
EDIT (le dossier du clip, absolu), ROOT (${CLAUDE_SKILL_DIR}/../..), la ligne PY, et les réponses :
aspect, disposition, musique, moteur de transcription, et recadrage oui (source large, sauf si la plateforme est
YouTube) ou non, et si la source a des sous-titres incrustés. Chacun prend son clip à travers le cut et le style-edit jusqu'à la feuille de photogrammes et retourne un
JSON court : status, cut_s, verify, cut_page, sheet, error. Fusionnez-les ; n'ouvrez jamais la transcription
d'un clip ni son montage papier. Lancez ensuite l'agent stills-critic sur chaque feuille de clip ready, à nouveau tous dans
un seul message, et corrigez ce qu'ils échouent (plan et photogrammes à nouveau pour ce clip). Un clip failed : exécutez-le manuellement comme ci-dessous.
Un par un (pas de sous-agents), pour chaque clip dans l'ordre :
- Vertical à partir d'une vidéo large :
python3 "$PY" "$K" reframe edits/<nom>-clip<N>recadre en 9:16 avec le
recadrage suivant le visage de l'orateur plan par plan (coupures de caméra trouvées avec ffmpeg). Ignorez-le lorsque
la plateforme du profil est YouTube ou que la source est déjà verticale. - Cut : la compétence cut à partir de son étape 2 (
retakes.py propose) : la transcription est déjà là.
Puis build, render, verify et la page cut, comme indiqué dans cette compétence. La musique sous la voix est
mesurée par fichier :build_timeline.pyne coupe qu'entre les mots là-bas. - Style :
python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" style edits/<nom>-clip<N>,
puis la compétence style-edit à partir de son étape 2. Si la source a déjà des sous-titres incrustés, définissez
"captions": {"present": false}dans lestyle.jsonde ce montage, sinon les sous-titres s'empilent.
Dans les deux cas, ouvrez chaque cut-check.html de clip et montrez toutes les feuilles de photogrammes ensemble pour une
approbation, posez la question de rendu une fois pour tous, et rendez. Après approbation, exécutez
python3 "${CLAUDE_SKILL_DIR}/../../skills/cut/scripts/judge_cut.py" score sur chaque dossier de clip (cut
references/judge.md). Remettez les rendus sur une
seule page de révision, chaque clip un onglet (start avec le clip 1, alt pour les autres, dossier clips/<nom> ; voir
${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/review.md), puis serve et wait en arrière-plan.
Si un script s'arrête
| message | action |
|---|---|
no run of whole sentences lasts <lo>-<hi> s | demandez dans la boîte de question une durée plus large, relancez candidates |
no candidate <id> | utilisez un id depuis shortlist.md |
links.py fetch exit 3 (connexion ou "confirmez que vous n'êtes pas un robot") | demandez avant de relancer avec --cookies-from-browser <navigateur> |
| tout message de cut ou style-edit | tableau "Si un script s'arrête" de cette compétence |
Règles
- Chaque mot, nombre et nom à l'écran provient des mots du clip lui-même. Rien du reste de
la vidéo, et rien que l'orateur n'ait dit. - Pas d'apparence IA :
${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/ai-tells.mds'applique à chaque clip. - Un plan serré de podcast n'a pas d'espace libre : aucune carte ou logo ne va au-dessus de la tête. Moins de visuels est
juste ; les sous-titres et les zooms portent le contenu. - Ne coupez jamais un clip en milieu de phrase. Plus court ou plus long que demandé vaut mieux qu'une pensée brisée.
Coût par vidéo longue
Mesuré sur un podcast de 13 minutes à deux personnes et une vidéo de 12 minutes en talking-head (2026-10) :
- Transcription : Scribe a pris 16-18 s ; Whisper est gratuit et plus lent. Une fois par vidéo longue.
- Candidats et caractéristiques : 4-6 s de code, 0 $.
- Claude lit
shortlist.md(environ 1 500 tokens), jamais la transcription (environ 20 000). - La page de sélection : 30-40 s de ffmpeg pour 8 aperçus, 7-9 Mo.
- Chaque clip coûte ensuite ce que coûtent un cut et un style-edit.
Auto-vérification
python3 "$K" demo
Fichiers
scripts/clips.py: candidats, page, trim, reframe et la démo hors ligne (transcription synthétique).
Stdlib uniquement, saufreframe(OpenCV, via le venv).${CLAUDE_SKILL_DIR}/../../agents/clip-editor.md: un clip à travers le cut et le style-edit jusqu'à sa feuille de photogrammes.