freecut
Principe
- Le LLM raisonne à partir de la transcription brute + visuels à la demande. Le seul artefact dérivé qui mérite sa place est une transcription compacte au niveau des phrases (
takes_packed.md). Tout le reste — marquage des remplissages, détection des reprises, classification des plans, score d'emphase — vous le déduisez au moment de la décision. - L'audio est primaire, les visuels suivent. Les candidats au découpage proviennent des frontières de parole et des silences. Ne plongez dans les visuels qu'aux points de décision.
- Demander → confirmer → exécuter → itérer → persister. Ne touchez jamais au montage tant que l'utilisateur n'a pas confirmé la stratégie en français clair.
- Généralisez. Ne partez pas du principe que vous savez de quel type de vidéo il s'agit. Regardez le matériau, demandez à l'utilisateur, puis montez.
- La liberté artistique est la règle par défaut. Chaque valeur, préréglage, police, couleur, durée, structure de pitch et technique spécifique dans ce document est un exemple concret issu d'une vidéo réelle — pas une obligation. Lisez-les pour comprendre ce qui est possible et pourquoi chaque choix a fonctionné. Ensuite, prenez vos propres décisions esthétiques en fonction du matériau réel et des souhaits de l'utilisateur. Les seules choses que vous DEVEZ faire se trouvent dans la section Règles dures ci-dessous. Tout le reste vous appartient.
- Inventez librement. Si le matériau nécessite une technique non décrite ici — écran partagé, incrustation d'image, cartes d'identité en bas-tiers, coupes de réaction, rampes de vitesse, arrêts sur image, fondus enchaînés, raccords dans le mouvement, L-cuts, J-cuts, rampes de vitesse sur la respiration, peu importe — construisez-la. Les outils sont ffmpeg et PIL. Ils peuvent tout faire ce que le format supporte. N'attendez pas la permission.
- Vérifiez votre propre sortie avant de la montrer à l'utilisateur. Si vous ne la livreriez pas, ne la présentez pas.
Règles dures (exactitude de production — non négociables)
Ce sont les points où une déviation produit des échecs silencieux ou une sortie cassée. Ce n'est pas une question de goût, c'est une question d'exactitude. Mémorisez-les.
- Les sous-titres sont appliqués EN DERNIER dans la chaîne de filtres, après chaque superposition. Sinon, les superpositions cachent les légendes. Échec silencieux.
- Extraction par segment → concaténation
-c copysans perte, pas un graphe de filtres en un seul passage. Sinon, vous ré-encodez deux fois chaque segment lorsque des superpositions sont ajoutées. - Fonclus audio de 30ms à chaque frontière de segment (
afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03). Sinon, clics audibles à chaque coupe. - Les superpositions utilisent
setpts=PTS-STARTPTS+T/TBpour 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. - Le SRT maître utilise les décalages de la timeline de sortie :
output_time = word.start - segment_start + segment_offset. Sinon, les légendes se désalignent après la concaténation des segments. - Ne coupez jamais à l'intérieur d'un mot. Ancrez chaque bord de coupe à une frontière de mot de la transcription.
- Tamponnez chaque bord de coupe. Fenêtre de travail : 30–200ms. Les horodatages ASR dérivent de 50 à 100 ms — le tampon absorbe la dérive. Plus serré pour les rythmes rapides, plus lâche pour le cinématographique.
- ASR verbatim au niveau du mot uniquement. Jamais le mode SRT/expression (perd les données d'écart sub-secondes). Jamais de remplissages normalisés (perd le signal éditorial).
- Mettez en cache les transcriptions par source. Ne retranscrivez jamais à moins que le fichier source lui-même n'ait changé.
- Sous-agents parallèles pour plusieurs animations. Jamais séquentiel. Lancez N à la fois via l'outil
Agent; le temps mural total ≈ le plus lent des temps. - Confirmation de la stratégie avant exécution. Ne touchez jamais au montage tant que l'utilisateur n'a pas approuvé le plan en français clair.
- Toutes les sorties de session dans
<videos_dir>/edit/. N'écrivez jamais à l'intérieur du répertoire du projetfreecut/.
Tout le reste dans ce document est un exemple concret. Déviez chaque fois que le matériau le justifie.
Structure des répertoires
Le skill vit dans freecut/. Les séquences utilisateur se trouvent là où ils les mettent. Toutes les sorties de session vont dans <videos_dir>/edit/.
<videos_dir>/
├── <fichiers sources, intacts>
└── edit/
├── project.md ← mémoire ; ajouté à chaque session
├── takes_packed.md ← transcriptions au niveau des phrases, la vue de lecture principale du LLM
├── edl.json ← décisions de montage
├── transcripts/<nom>.json ← JSON ASR normalisé en cache
├── animations/slot_<id>/ ← source + rendu + raisonnement par animation
├── clips_graded/ ← extractions par segment avec étalonnage et fondus
├── master.srt ← sous-titres de la timeline de sortie
├── downloads/ ← sorties yt-dlp
├── verify/ ← images de débogage / PNG de timeline
├── preview.mp4
└── final.mp4
Configuration
L'installation initiale se trouve dans install.md (clone, dépendances, ffmpeg, enregistrement du skill, clé API). Ne l'exécutez pas à chaque session ; lors d'un démarrage à froid, vérifiez simplement :
- Le backend de transcription est disponible. Le backend par défaut est
whisper(gratuit, local) — vérifiez quemlx-whisper(Apple Silicon) oufaster-whisperest importable. Si aucun des deux n'est installé, dites à l'utilisateur depip install mlx-whisper(oufaster-whisper) plutôt que de passer silencieusement à un backend payant. Pour les backends optionnelsvibevoice/elevenlabs, vérifiezVIBEVOICE_ASR_URL/ELEVENLABS_API_KEYdans l'environnement ou dans.envà la racine du dépôt freecut. ffmpeg+ffprobedans le PATH.- Dépendances Python installées (
uv syncoupip install -e .dans le dépôt). - Node.js + npm disponibles si la session nécessite HyperFrames ou des slots Remotion. HyperFrames nécessite actuellement Node.js 22+.
yt-dlp, HyperFrames, Remotion, Manim installés seulement lors de la première utilisation.- La configuration de l'animation pour la première utilisation a lieu dans le répertoire du slot, jamais à la racine du dépôt freecut. HyperFrames peut être invoqué avec
npx --yes hyperframes ...; Remotion peut être échafaudé avecnpx create-video@latestou installé comme dépendance locale du projet avant d'utiliser sa commanderemotion render. - Ce skill vend
skills/manim-video/. Lisez son SKILL.md lors de la construction d'un slot Manim.
Les outils (helpers/transcribe.py, helpers/render.py, etc.) se trouvent à côté de ce SKILL.md. Résolvez leurs chemins par rapport au répertoire contenant ce fichier — le skill est généralement un lien symbolique à ~/.claude/skills/freecut/ ou ~/.codex/skills/freecut/.
Outils
transcribe.py <video>— transcription d'un seul fichier. Backend enfichable via--backend {whisper,vibevoice,elevenlabs}(par défautwhisper, local + gratuit, locuteur unique).vibevoiceutiliseVIBEVOICE_ASR_URLpour la diarisation en temps réel ;elevenlabsutiliseELEVENLABS_API_KEYet supporte--num-speakers. Mis en cache.transcribe_batch.py <videos_dir>— transcription parallèle avec 4 workers. Même indicateur--backend. Utilisez pour les prises multiples.pack_transcripts.py --edit-dir <dir>—transcripts/*.json→takes_packed.md(au niveau des phrases, coupe sur silence ≥ 0,5 s ou changement de locuteur). Fonctionne de manière identique sur tous les backends car la forme JSON est normalisée.timeline_view.py <video> <start> <end>— filmstrip + PNG de forme d'onde. Exploration visuelle à la demande. Pas un outil de balayage — utilisez-le aux points de décision, pas constamment.render.py <edl.json> -o <out>— extraction par segment → concaténation → superpositions (décalées PTS) → sous-titres EN DERNIER.--previewpour 720p rapide.--build-subtitlespour générer master.srt en ligne.grade.py <in> -o <out>— chaîne de filtres ffmpeg pour l'étalonnage. Préréglages +--filter '<raw>'pour personnalisé.
Pour les animations, créez <edit>/animations/slot_<id>/ avec Bash et lancez un sous-agent via l'outil Agent.
Le processus
-
Inventaire.
ffprobede chaque source.transcribe_batch.pysur le répertoire.pack_transcripts.pypour produiretakes_packed.md. Échantillonnez une ou deuxtimeline_viewpour une première impression visuelle. -
Pré-analyse des problèmes. Un passage sur
takes_packed.mdpour noter les lapsus verbaux, les erreurs de langage évidentes ou les formulations à éviter. Liste simple, alimente le brief de l'éditeur. -
Dialogue. Décrivez ce que vous voyez en français clair. Posez des questions guidées par le matériau. Collectez : type de contenu, durée/format cibles, direction esthétique/de marque, rythme, moments à préserver, moments à couper, préférences d'animation et d'étalonnage, besoins en sous-titres. N'utilisez pas de liste de contrôle fixe — les bonnes questions sont différentes à chaque fois.
-
Proposer une stratégie. 4 à 8 phrases : forme, choix des prises, direction du montage, plan d'animation, direction de l'étalonnage, style de sous-titres, estimation de la durée. Attendez la confirmation.
-
Exécuter. Produisez
edl.jsonvia le brief du sous-agent éditeur. Plongez danstimeline_viewaux moments ambigus. Construisez les animations dans des sous-agents parallèles. Appliquez l'étalonnage par segment. Composez viarender.py. -
Aperçu.
render.py --preview. -
Auto-évaluation (avant de montrer à l'utilisateur). Lancez
timeline_viewsur la sortie rendue (pas les sources) à chaque frontière de coupe (fenêtre de ±1,5 s). Vérifiez chaque image pour :- Discontinuité visuelle / flash / saut à la coupe
- Pic de forme d'onde à la frontière (clic audio qui a échappé au fondu de 30 ms)
- Sous-titre caché derrière une superposition (violation de la règle 1)
- Superposition mal alignée ou montrant les 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 générale. Lancez
ffprobesur la sortie pour vérifier que la durée correspond à l'attente de l'EDL.Si quelque chose échoue : corrigez → re-rendu → ré-évaluez. Limitez à 3 passes d'auto-évaluation — si des problèmes persistent après 3 passes, 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.
-
Itérer + persister. Retour d'information en langage naturel, re-planification, re-rendu. Ne retranscrivez jamais. Rendu final sur confirmation. Ajoutez à
project.md.
Techniques de coupe
- Audio d'abord. Coupes candidates à partir des frontières de mots et des silences.
- Préservez les pics. Rires, punchlines, temps forts. Prolongez après les punchlines pour inclure les réactions — le rire EST le temps fort.
- Les changements de locuteur bénéficient d'un espace entre les paroles. Valeurs courantes : 400–600 ms. Moins pour un rythme rapide, plus pour un style cinématographique. Décision esthétique.
- Les événements audio comme signaux.
(rires),(soupirs),(applaudissements)marquent les temps forts. Prolongez au-delà. - Les silences sont des candidats à la coupe. Les silences ≥400 ms sont généralement les plus propres. Les frontières de phrase de 150 à 400 ms sont utilisables avec une vérification visuelle. <150 ms est dangereux (au milieu d'une phrase).
- Exemple de tampon de coupe (la vidéo de lancement livrée avec ce skill) : 50 ms avant le premier mot conservé, 80 ms après le dernier. Plus serré pour l'énergie du montage, plus lâche pour le documentaire. Restez dans la fenêtre de travail de 30 à 200 ms (règle dure 7).
- Ne raisonnez jamais sur l'audio et la vidéo indépendamment. Chaque coupe doit fonctionner sur les deux pistes.
La transcription compacte (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 des phrases, chacune précédée de sa plage temporelle [start-end]. 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 donne une précision au niveau du mot à partir du seul texte avec 1/10 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 gaspillé.
[006.08-006.74] S0 Nous avons résolu ce problème.
Brief du sous-agent éditeur (pour la sélection multi-prises)
Lorsque la tâche est « choisir la meilleure prise de chaque temps fort parmi plusieurs clips », lancez un sous-agent dédié avec un brief similaire à celui-ci. La structure est importante ; l'exemple de forme de pitch ne l'est pas.
Vous éditez une vidéo de <type>. Choisissez la meilleure prise de chaque temps fort et
assemblez-les chronologiquement par temps fort, pas par ordre de clip source.
ENTRÉES :
- takes_packed.md (transcriptions au niveau des phrases avec annotations temporelles de toutes les prises)
- Contexte produit/narratif : <2 phrases de l'utilisateur>
- Locuteur(s) : <nom, rôle, note de style de livraison>
- Structure attendue : <choisissez un archétype ou inventez-en un>
- Lapsus verbaux à éviter : <liste 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 → MISE EN PLACE → ÉTAPES → PIÈGES → RÉCAPITULATIF
- Interview : (QUESTION → RÉPONSE → RELANCE) 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 frontières de mots de la transcription.
- Tamponnez les bords de coupe (fenêtre de travail 30–200 ms).
- Préférez les silences ≥ 400 ms comme cibles de coupe.
- Les lapsus inévitables sont conservés s'il n'existe pas de meilleure prise. Notez-les dans « raison ».
- Si hors budget, révisez : supprimez un temps fort ou rognez les fins. Signalez le total et corrigez-vous.
SORTIE (tableau JSON, pas de prose) :
[{"source": "C0103", "start": 2.42, "end": 6.85, "beat": "ACCROCHE",
"quote": "...", "reason": "..."}, ...]
Retournez l'EDL final et une vérification de la durée totale en une ligne.
Étalonnage (sur demande)
Votre travail consiste à raisonner sur l'image, pas à appliquer un préréglage. Regardez une image (via timeline_view), décidez ce qui ne va pas, ajustez une chose, regardez à nouveau.
Le modèle mental est ASC CDL. Par canal : out = (in * slope + offset) ** power, puis saturation globale. slope → hautes lumières, offset → ombres, power → tons moyens.
Exemples de chaînes de filtres (grade.py a --list-presets ; utilisez-les comme points de départ ou mélangez les vôtres) :
warm_cinematic— rétro/technique, subtile division teal/orange, désaturé. Livré dans une vraie vidéo de lancement. Sûr pour les têtes parlantes.neutral_punch— correctif minimal : contraste augmenté + courbe en S douce. Pas de décalage de teinte.none— copie directe. Par défaut lorsque l'utilisateur n'a rien demandé.
Pour tout le reste — portrait, nature, produit, clip musical, documentaire — inventez votre propre chaîne. grade.py --filter '<raw ffmpeg>' accepte n'importe quelle chaîne de filtres.
Règles dures : appliquez par segment lors de l'extraction (pas après la concaténation, ce qui ré-encode deux fois). Ne devenez jamais agressif sans tester les tons de peau.
Sous-titres (sur demande)
Les sous-titres ont trois dimensions à prendre en compte : le découpage (1/2/3 ou phrase par ligne), la casse (MAJUSCULES/Première lettre en majuscule/Naturel) et l'emplacement (marge par rapport au bas). La bonne combinaison dépend du contenu.
Styles travaillés — choisissez, adaptez ou inventez le vôtre :
| Style | Découpage | Casse | Emplacement | Quand | Exemple |
|---|---|---|---|---|---|
| Poétique | 1–2 mots par ligne | Mots choisis en majuscules, le reste en minuscules | Bas, centré, fond | Narration lyrique, poésie | CIEL / étoile |
| Interview | 50–75 % de la largeur, phrase complète | Minuscule naturelle | Bas, centré, barre semi-transparente | Interviews, documentaires | Je pense que le changement climatique est... |
| Tutoriel | 100 % de la largeur, 1–2 lignes | Minuscule naturelle | Bas, centré, fond plein | Tutoriels, conférences | Ensuite, vous initialisez le vecteur de poids |
| Karaoké | Mot par mot | Minuscule | Bas, centré, pas de fond | Contenu musical ou rythmé | Ensuite (apparaît) → vous (apparaît) etc. |
| Accessibilité | 1× phrase complète | Minuscule sauf noms propres | Bas, centré, fond plein, taille 1,5×, contraste 7:1 | Conformité WCAG, tout public | |
| Cinématique | 1 seul mot-clé par ligne | Minuscule, police fine | Au centre | Storytelling minimaliste | attendez |
| Plein écran | 1 mot, centré | Minuscule, police grasse | Centre de l'écran, 40 % de hauteur | Accent dramatique | non |
Exemples de commandes ffmpeg pour les sous-titres :
Sous-titres statiques (chemin principal) :
ffmpeg -i final_no_subs.mp4 -vf \
"subtitles=master.srt:force_style='Alignment=2,FontName=Arial,FontSize=18,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,BorderStyle=1,Outline=1,Shadow=0,MarginV=30'" \
-c:a copy final.mp4
Sous-titres de karaoké (mot par mot) :
ffmpeg -i final_no_subs.mp4 -vf \
"subtitles=master.srt:force_style='Alignment=2,FontName=Arial,FontSize=20,PrimaryColour=&HFFFFFF,OutlineColour=&H000000,BorderStyle=1,Outline=1,Shadow=0,MarginV=40'" \
-c:a copy final_karaoke.mp4
Règles dures pour les sous-titres :
- Appliquez EN DERNIER dans la chaîne de filtres (règle dure 1).
- Le SRT maître utilise les décalages de la timeline de sortie (règle dure 5).
- Ne coupez jamais à l'intérieur d'un mot (règle dure 6).
- Si le dialogue est rapide, 3 lignes sont acceptables ; plus que cela est illisible.
Exemple de session de montage : Vidéo de lancement
Cette section documente une session réelle — vidéo promotionnelle SaaS de 45 secondes, une seule tête parlante. Elle illustre le processus décrit ci-dessus. Adaptez-la à votre matériau.
Inventaire → Prétraitement
Identique au processus principal : ffprobe → transcription → pack → échantillon visuel.
Dialogue
Posez des questions, ne présumez pas. Le dialogue réel de la session de lancement :
Moi : Quelle est l'ambiance de cette vidéo ? C'est un lancement technique, donc plutôt professionnel et net ? Ou vous cherchez quelque chose de plus décontracté et en phase avec la culture startup ?
Utilisateur : Les deux. Les démos techniques doivent inspirer confiance, mais je veux aussi que cela semble ambitieux — comme si nous construisions l'avenir.
Moi : Je vois. Donc une palette sobre avec une subtile chaleur dans les tons de peau pour le côté humain, et des animations élégantes pour le côté visionnaire. Des préférences de couleurs ?
Utilisateur : Utilisons les deux. Bleu foncé, blanc, une touche de doré.
...discussion sur la structure, les prises à utiliser, la durée cible...
Moi : OK, voici ma stratégie : nous ouvrons sur le problème immédiatement — un hook. Un plan large de vous, puis un plan rapproché serré lorsque vous parlez de la solution. Nous découpons autour de 95 % des pauses, en gardant les rires et la respiration pour l'énergie. Animations : un défilement de code élégant pendant que vous montrez l'indice d'utilisation — une superposition de style code flottant. À la fin, un appel à l'action superposé sur un plan large de vous. L'étalonnage sera un bleu foncé professionnel avec des reflets chauds — un aspect
warm_cinematicmodifié. Les sous-titres suivront le style « poétique » — pas de légendes standard, mais des mots-clés flottant sur l'écran aux moments clés. Devrait faire environ 45 secondes. Qu'en pensez-vous ?Utilisateur : J'aime la direction. Allez-y.
Exécution (réelle)
Le sous-agent éditeur a sélectionné :
[
{"source": "C0103", "start": 2.42, "end": 6.85, "beat": "ACCROCHE",
"quote": "...les agents web gaspillent..."},
{"source": "C0103", "start": 7.1, "end": 12.3, "beat": "PROBLÈME",
"quote": "...l'utilisateur moyen..."},
...
]
L'animation du défilement de code a été construite avec PIL (image d'arrière-plan de code, superposition avec position et opacité animées), rendue comme une courte vidéo transparente de 3 secondes. Le sous-agent d'animation a choisi un décalage de tremblement de 3 %, une exponentielle douce pour l'entrée et la sortie, et une sensation de début de démo technique.
La superposition de l'appel à l'action finale a été un texte "Essayez Gratuitement" entrant avec un fondu de 0,6 seconde, maintenu 2 secondes, puis sortant progressivement.
L'étalonnage a utilisé :
curve=preset=medium_contrast:
red='0/0 0.1/0.15 0.3/0.35 0.5/0.5 0.7/0.65 0.9/0.85 1/1':
green='0/0 0.1/0.1 0.3/0.3 0.5/0.5 0.7/0.7 0.9/0.9 1/1':
blue='0/0 0.1/0.1 0.3/0.3 0.5/0.5 0.7/0.65 0.9/0.8 1/1',
eq=saturation=0.85,
hue=H=10
(Cela donne un aspect teal/orange avec des noirs bleutés)
Auto-évaluation (réelle)
La passe d'auto-évaluation a détecté que l'animation de défilement de code apparaissait 1 image trop tard (décalage de PTS) — la règle dure 4 a été corrigée. Aucun autre problème. Pas de second passage nécessaire.
Résultat
Sortie : final.mp4 dans edit/. L'utilisateur a été ravi. La session a été ajoutée à project.md.
Ce document est un point de départ, pas un ensemble de restrictions. Plus que tout, n'oubliez pas la règle 6 : inventez librement.