Montage de vidéos verticales avec rushes réels (Windows + Codex + Jianyin)
Contexte : vous disposez de rushes fournis par quelqu’un d’autre (talking head + plans de coupe). Vous devez produire une vidéo verticale de 30 à 50 secondes, en 1080×1920, destinée aux réseaux sociaux, et laisser éventuellement le monteur finaliser dans Jianyin ou exporter directement.
Règle absolue (non négociable) : voir references/AGENTS_rules.md. Lisez-la avant toute action. Ce fichier ne décrit que le processus.
Entrée
- Répertoire des rushes (lecture seule — ne jamais modifier les originaux ; copiez d’abord dans votre répertoire de travail).
- Habitudes de style du monteur (si connues). Les habitudes déclarées par le monteur sont la référence absolue ; les vidéos de référence sont une source d’inspiration technique, pas de paramètres. En cas de conflit, suivez le monteur.
- Optionnel : vidéo de référence, emplacement du logo, texte CTA de fin (n’inventez jamais de numéro de téléphone ou d’adresse non vérifiés).
Sortie
spec.json(storyboard, seule source de vérité pour le montage), montage brut ou final (mp4),.srt, mosaïque de contrôle qualité image par image, rapport QC.- Route A supplémentaire : projet Jianyin. Route B supplémentaire : calque de surcouche transparent ProRes 4444
.mov.
Étape 0 : Auto-vérification de l’environnement (ne pas commencer sans)
Exécutez l’auto-vérification selon references/windows_env.md : ffmpeg complet (avec zscale, tonemap, prores_ks), Python 3.10/3.11, faster-whisper + whisperX, Playwright + Chromium + police chinoise cible, optionnellement demucs / RVM ; le répertoire des projets Jianyin doit être configuré et ajouté à writable_roots. Le bac à sable Codex est hors ligne par défaut : les modèles et dépendances doivent être préinstallés. Signalez les échecs sans forcer. Les commandes spécifiques sont dans references/windows_commands.md.
Étape 1 : Inventaire des rushes
- ffprobe chaque fichier : résolution, framerate (variable ?), rotation, durée, transfert colorimétrique (HLG/PQ = HDR). Écrivez dans
inventory.csv. - N’exportez pas de fichiers intermédiaires SDR : appliquez les conversions à la volée dans le filtre de lecture. Tous les rushes :
fps=30. Pour les rushes HDR, la chaîne de filtres commence par une conversion HDR→SDR (sinon l’image est grise — idem pour l’extraction d’une image de couverture ; commandes danswindows_commands.mdsection 2). - Pour chaque rush, extrayez une miniature et étiquetez : contenu, personnage(s), plage utilisable, occultation/noir/début sombre, marque d’autrui. Signalez les rushes et plages inutilisables.
- Vérification : chaque rush a une étiquette ; les rushes avec transfert arib-std-b67 ou smpte2084 ont une chaîne de filtres commençant par la conversion HDR.
Étape 2 : Transcription et relecture
- faster-whisper en mode brut : modèle
medium,device='cpu',compute_type='int8',language='zh',vad_filter=True,word_timestamps=True,initial_promptavec vocabulaire métier. Le VAD peut sauter des phrases : relancez avecvad_filter=Falseetcondition_on_previous_text=False. - Relecture humaine obligatoire de l’intégralité du texte : mots techniques, chiffres, homophones ; Whisper hallucine parfois des phrases inexistantes — supprimez-les. Supprimez les mots inaudibles sans deviner.
- Avant la transcription, extrayez un fichier WAV 16 kHz mono avec ffmpeg, puis passez-le à whisper. Envoyez le texte relu à whisperX pour alignement forcé (résultat dans le champ
aligndu spec), pour obtenir le début mot par mot (tolérance 0–3 images). La fin de mot whisperX est peu fiable : utilisez la détection d’énergie pour la fin.
- Vérification : pas de mot technique ou chiffre non relu ; chaque phrase a un début mot par mot.
Étape 3 : Réorganisation narrative (d’abord le récit, ensuite les effets)
- La 1ʳᵉ seconde est un accroche : « contraste + résultat », avec les mots exacts. Pas de plan de coupe ni logo au début.
- L’accroche peut assembler deux phrases non adjacentes, mais chaque moitié doit porter
src_t. Le sens original doit être préservé. - Deux options (à écrire dans spec) : la 1ʳᵉ phrase commence normalement avec un gros titre ; ou la phrase de résultat (≤3 s) est placée en ouverture « à froid », puis le retour à l’ordre normal.
- L’accroche peut assembler deux phrases non adjacentes, mais chaque moitié doit porter
- Supprimez les phrases qui ne font pas avancer l’histoire (slogans, préparations, répétitions). Objectif : 30–50 secondes.
- Identifiez 3–4 points forts narratifs (accroche / changement de scène / point culminant / phrase conclusive). Les moments forts (explosifs) uniquement à ces endroits. Le point culminant a la priorité maximale, l’accroche vient ensuite. Deux points forts espacés d’au moins 6 secondes. Une vidéo de ~30 s a 3 points forts, ~50 s en a 4.
- Vérification : chaque texte à l’écran peut être retrouvé dans la transcription avec son horodatage, et le contexte est vérifié (un même mot peut avoir un sens différent dans une autre phrase).
Étape 4 : Rédiger le storyboard spec.json, demander validation
Voir references/spec_schema.md pour les champs, et references/kw_class.example.json pour les catégories de mots-clés (les exemples sont liés à un projet ; réécrivez pour chaque projet). Chaque segment doit préciser : rush source et points d’entrée/sortie, mise en page, sous-titres, kw_class, préréglages d’effets, B-roll, effets sonores, section musicale, src_t (horodatage des mots exacts). Avant le rendu, envoyez le storyboard à l’utilisateur pour validation.
Étape 5 : Montage
- Détection des points d’entrée/sortie par énergie RMS sur des fenêtres de 10 ms (pas de fin de mot Whisper). Coupez net les silences : inspirations, paroles inutiles — rien.
- Méthode éprouvée : découpez d’abord par énergie (seuil = max(10ᵉ percentile + 14 dB, −48 dBFS), 3 fenêtres de 10 ms consécutives pour considérer une parole, marge avant = 0,10 s, marge après = 0,14 s), puis resserrage manuel. Vérifiez que la longueur cumulée des silences (sous −42 dBFS) autour des points de coupe est ≤ 90 ms.
- Objectif du monteur : 1 à 2 images (≤67 ms) avant le début de chaque mot. Non encore testé selon cette norme (à valider). Méthode de validation : isolez la voix avec demucs, mesurez du point de coupe au début de 3 fenêtres de 10 ms consécutives au-dessus de −42 dBFS. Validez : chaque point ≤67 ms, la consonne initiale n’est pas coupée, et la ré-exécution de l’ASR sur le segment coupé ne montre pas de mot coupé. Ensuite, adoptez par défaut.
- Possibilité de produire une version avec 2–3 images entre les phrases, pour que le monteur choisisse.
- Exportez chaque segment image par image :
-ssavant-i,-vfavecfps=30, durée fixe via-frames:v nf(nf = round((sortie − entrée) × 30)), codeclibx264 -preset veryfast -crf 12, avec les 3 marqueurs de couleur BT.709 ; audio assemblé point par point, avec 8 ms de fondu entrant et 15 ms de fondu sortant par segment pour éviter les clics. - Les jump cuts sur le même plan doivent inclure un zoom avant/arrière de ×1,08 ; l’entrée/sortie du B-roll se fait avec un « whip pan » + flou horizontal.
- Le B-roll n’est inséré que lorsque la voix mentionne son contenu. Ne forcez pas de B-roll pour le rythme.
Étape 6 : Effets de sous-titres et animations (deux niveaux)
Niveau normal : toutes les 1,5 à 2 secondes, intervalle max ≤3 secondes, sobre.
- Sous-titres en bas : blanc avec contour noir, max 12 caractères par ligne, apparaissant en phrase entière (la coloration des mots-clés est un paramètre laissé au monteur).
- Accentuation au niveau intermédiaire : gros caractères dorés (mots-clés ×1,75, chiffres ×2), entrée caractère par caractère de 115 % à 100 %, sur 6–8 images ; possibilité d’ajouter des soulignements/cercle dessinés à la main, grain de papier, ombre douce.
- Techniques optionnelles : animation de chiffres, incrustation d’objets avec bruitage correspondant, listes cumulatives (taille de police ≥1,2× celle des sous-titres du bas, puis agrandissement), phrases choc verticales en vis-à-vis (cacher le sous-titre identique en bas), étiquette d’identité au début (utilisation unique, préciser « pas les mots exacts »).
Niveau « point fort » (explosif) : 3–4 au total, comptabilisés dans la densité générale, chaque occurrence maximale :
- Grands caractères : 75–85 % de la largeur de l’image (85 % est le max ; priorité à la zone de sécurité) ; zoom avant de ×1,15 à ×1,25 en 4 images ; tremblement d’écran sur 2–3 images avec flou de mouvement ; arrière-plan assombri de 6–30 %, légère désaturation (paramètres à régler pour que le visage reste net sur un téléphone) ; le calque de la personne n’est pas coloré ; effet sonore composé pré-mixé (compté comme 1).
- Gradation de la puissance : le plus fort a un zoom de ×1,25 et un tremblement de 3 images ; les autres ×1,15 et 2 images.
- Chaque technique utilisée une seule fois dans toute la vidéo : texte derrière le personnage (incrustation) / transition par masque de texte / défilement de chiffres plein écran + tampon rouge / phrase verticale s’écrivant + effet de lumière balayante.
- Texte derrière le personnage : placez le texte au-dessus des épaules, évitez les mains et accessoires ; la tête doit occulter 25–30 % du texte (moins de 15 % n’est pas visible sur mobile) ; avant d’ajouter le contour blanc, effacez les objets mal incrustés (chaise, etc.) du masque.
- Tampon rouge : seule couleur rouge de la vidéo, largeur 30–40 % de l’image, animation de 150 % à 100 % en 3 images + tremblement de 2 images.
- Arrêt sur image : uniquement sur un silence naturel après une phrase (voix < −45 dB), choisissez l’image la plus proche de la bouche fermée, durée ≤0,4 s, maximum un seul dans la vidéo, effet sonore lourd au début. C’est l’unique exception à la règle « aucun silence ».
- Toutes les animations d’entrée commencent 1 image plus tôt.
Étape 7 : Son
- Voix : filtre passe-haut 80 Hz → débruitage → léger EQ → compression.
- Musique : changement de morceau par section (habitude du monteur), fondu croisé 300–600 ms ; compression side-chain pendant la parole. Utilisez uniquement de la musique sous licence ou auto-produite.
- Effets sonores : environ 0,5 par seconde, répartis uniformément, fenêtre de 4 secondes : 1–3 effets, intervalle entre deux ≥0,25 s. Niveau par défaut : RMS de l’effet sonore = −14 dB par rapport à la voix (paramètre
db=-14). Les bruitages réalistes sont prioritaires sur les pops génériques. - Loudness : premier passage
loudnorm=I=-14:TP=-1.5:LRA=11pour mesurer ; second passage aveclinear=trueen utilisant les mesures, suivi dearesample=48000,alimiter=limit=0.7:attack=1:release=30:level=false. Mesure finale avec ebur128, gain supplémentaire : g = min(−14 − I, −2.9 − Peak). Objectif : −14 LUFS, pic vrai ≤−1 dBTP.
Étape 8 : Rendu et livraison (choisir A, B ou les deux)
- Route A : Projet Jianyin (par défaut si le monteur utilise uniquement Jianyin). Codex produit un montage brut, les sous-titres, les points de temps pour effets sonores et musique. Utilisez pyJianYingDraft pour créer un nouveau projet. Le monteur ouvre Jianyin et finalise. Limitations et consignes : voir
references/jianying_route.md. Testez cette route uniquement sur une machine Windows réelle. - Route B : Calque de surcouche (obligatoire si effets « point fort »). Effets rendus via HTML/Canvas, Playwright pilote Chrome système pour capturer chaque image en PNG transparent : viewport 1080×1920,
device_scale_factor=1, paramètres de lancement--font-render-hinting=none, attendezwindow.READYetdocument.fonts.ready,omit_background=True. Toutes les animations sont des fonctions pures du temps t. La séquence PNG est lue avec-framerate 30, encodée en ProRes 4444 (-alpha_bits 16), puis composée avec ffmpeg overlay. Placez le calque de surcouche comme piste vidéo dans le projet Jianyin : non testé à ce jour. ffmpeg drawtext ne permet pas l’entrée caractère par caractère ni le texte derrière le personnage. - Livraison de secours : montage brut + SRT + storyboard, finalisation par le monteur dans Jianyin.
- Avant la surcouche, appliquez un léger étalonnage au fond :
eq=contrast=1.04:saturation=1.07. - Encodage final :
libx264 -profile:v high -preset slow -crf 17 -maxrate 16M -bufsize 24M -g 60 -r 30 -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709, AAC 192k,-movflags +faststart.
Étape 9 : Contrôle qualité (tout doit passer avant livraison)
Suivez point par point references/qc_checklist.md. Le rapport ne contient que ce que vous avez vous-même vérifié (images, audio), chaque donnée avec une unité. Les mesures impossibles sont notées « non mesuré », sans inventer.
Vignette de couverture
- Répartition : le planificateur fournit le texte et les images candidates (dans le champ
coverdu spec), le monteur produit la mise en page et l’export (1080×1920 et 3:4). - Titre principal : extrait des mots exacts, ordre éventuellement modifié (ex. « un mois et demi à visser »), max 7 caractères, 2 lignes maximum. Sous-étiquette : chiffres de résultat, 2–3 stickers.
- Titre et visage dans la zone centrale 1080×1440 (y 240–1680). La grille de la page d’accueil TikTok recadre en 3:4.
- Fournissez au moins 3 images candidates, avec horodatage et justification. Légende « pas la version finale ».
- Parcourez la vidéo toutes les 0,5 s pour trouver des profils ou expressions. La direction du regard détermine la mise en page (regard vers le haut à gauche → personne en bas à droite, titre en haut à gauche). Si les vêtements ou l’arrière-plan contiennent du texte, interdiction de faire une symétrie miroir.
Critères de succès
- Durée 30–50 s, 1ʳᵉ seconde = accroche avec mots exacts. Texte à l’écran 100 % traçable jusqu’à la transcription.
- Effets normaux : intervalle max ≤3 s. Points forts : 3–4, avec gradation de puissance, techniques non répétées.
- Effets sonores ≈0,5/s, sans superposition. Calage ≤2 images. −14 LUFS ±1, pic vrai ≤−1 dBTP.
- Aucun débordement de la zone de sécurité. Pas d’image noire ou figée inattendue. Texte ne chevauchant ni visage ni logo.
- Utilisateur a validé le storyboard. Livrables complets.
Pièges courants → Solutions
| Piège | Solution |
|---|---|
| Rushes HLG gris | Conversion avec zscale + tonemap=hable vers SDR, gamma ≈1,12 |
| Whisper : début trop tôt, fin trop longue | Début avec whisperX, fin avec détection d’énergie |
| VAD saute des phrases | Relancez sans VAD |
| Texte à l’écran ≠ mot exact / mauvais contexte | Chaque mot avec src_t, QC vérifié sur transcription |
| Tous les effets ont la même force | Distinguez niveau normal et point fort ; les points forts sont max. |
| Texte derrière le personnage peu visible | Mesurez le taux d’occultation : tête couvrant 25–30 % |
| Chaise incrustée dans le personnage | Texte au-dessus des épaules ; effacez avant contour |
| Calage mal mesuré | Mesurez à partir de la 1ʳᵉ image visible ; animation 1 image plus tôt |
| Sifflements détectés comme effets sonores | Isolez la voix avec demucs, mesurez uniquement sur la bande d’accompagnement |
| Effets sonores groupés | Fenêtre de 4 s : 1–3 effets ; l’effet composé compte pour 1 |
| Texte ou gros titre dans la zone du bouton TikTok | Bord droit ≤ x 930 |
| Arrêt sur image pendant la parole | Uniquement dans un silence, ≤0,4 s |
| Animation glissante traverse le visage ou sort du cadre | Remplacez par fondu sortant + fondu entrant à la position cible |
| Outil d’inspection affiche une image en cache | Renommez le fichier à chaque vérification |
| Échec d’une commande à cause d’un chemin chinois ou d’espaces | Utilisez subprocess avec liste d’arguments ; fichiers en utf-8 explicite |
| Whisper hallucine des phrases inexistantes | Relecture audio humaine complète avant alignement |
| Envie d’utiliser une autre solution de rendu (ex. Remotion) | Non vérifiée, ne remplacez pas ; utilisez uniquement HTML/Canvas + Playwright pour les calques |
| Nouveau projet Jianyin introuvable ou police erronée | Ouvrez/fermez un projet existant ou redémarrez ; ouvrez le projet deux fois |