Légender une vidéo
L'utilisateur fournit une vidéo de parole. Il choisit dans le catalogue de styles de légendes, qui est prévisualisé sur sa propre vidéo, et vous livrez le MP4 légendé. Tout s'exécute localement avec HyperFrames. After Effects n'est jamais nécessaire.
Kit : .claude/skills/caption-video/kit/ dans le dépôt du studio. Les projets sont créés dans videos/captions/<name>/ et les vidéos terminées vont dans out/captions/<name>.mp4 (les deux sont relatifs à la racine du studio).
Depuis la racine du studio, définissez K="$PWD/.claude/skills/caption-video/kit" et exécutez python3 "$K/caption.py" … (mettez les chemins entre guillemets ; les dossiers peuvent contenir des espaces). Utilisez le venv python du studio (.venv/bin/python) si numpy/scipy manquent dans le python système – setup/setup.sh le crée.
Flux
1. Obtenir la vidéo
Si aucun chemin de vidéo n'a été donné, demandez-en un. Vérifiez qu'il existe et qu'il contient une personne parlant. Exécutez :
python3 "$K/caption.py" new "<chemin vidéo>" <nom court>
Ceci copie la vidéo, la ré-encode en H.264 et la transcrit mot par mot avec WhisperX. La première exécution après un certain temps peut prendre une minute. Les longues vidéos prennent environ temps réel ÷ 4.
2. Afficher la transcription
Affichez la transcription de la sortie de commande dans un bloc lisible. Signalez toute erreur probable, en particulier les noms de marque et le jargon (noms de produits, "HyperFrames", acronymes), et demandez à l'utilisateur de confirmer ou de corriger. Les corrections vont dans --fix "faux=juste,…" au moment de la construction. Si la transcription est du charabia, ou si l'audio ne contient pas de parole, arrêtez-vous et dites-le. Ne légendez pas des mots inventés.
3. Afficher chaque style sur leur vidéo
Exécutez python3 "$K/caption.py" styles pour la liste et python3 "$K/caption.py" preview <nom> pour la feuille visuelle. La feuille se trouve à videos/captions/<nom>/previews/styles.png. Regardez-la vous-même, puis envoyez-la avec SendUserFile (affichage render). À côté, donnez la liste numérotée avec la ligne "meilleur pour" de chaque style :
- Lime Hook : le look template (Anton en capitales, mot parlé en vert fluo)
- Karaoke Pop : grandes salves de 2 mots, mot parlé en jaune
- One Word : un mot géant à la fois
- Clean Box : texte sombre sur une carte blanche, surligneur sur le mot parlé
- Editorial : calme en casse normale, mots-clés en italique serif
- Subtitle : petits sous-titres en phrase complète
- Neon : lueur cyan sur le mot parlé
Recommandez-en un en une seule ligne en fonction du contenu : hype ou social → 1 ou 2, explicatif ou pub → 4, histoire de fondateur ou premium → 5, interview ou podcast → 6, tech ou IA → 7. Demandez ensuite à l'utilisateur de choisir un numéro. Si le catalogue dans caption.py a changé, listez ce que styles affiche plutôt que cette copie.
4. Accroche (optionnelle)
Suggérez 3 accroches tirées de ce que le locuteur dit réellement. Commencez par le nombre, résultat ou contradiction le plus surprenant, utilisez 4 à 8 mots, et gardez le mot payant pour la fin. Formatez chaque accroche en syntaxe d'accroche, puis demandez avec AskUserQuestion : trois options d'accroche plus "Pas d'accroche" (l'utilisateur peut aussi taper la sienne).
La syntaxe d'accroche utilise une ligne par |, chacune commençant par son style :
s:introduction en italique serif ("Comment", "Pourquoi")c:mise en place en capitales condensées blanchesb:le mot ou nombre payant en grand cercle (1–2 mots)l:rebond en capitales vert fluor:petite étiquette en italique
Exemple : s:Comment|c:J'ai atteint|b:300k+|l:sans pubs|r:vues. L'accroche doit correspondre à ce que la vidéo délivre dans ses 10 premières secondes.
4b. Polissage (proposez-le ; exécutez-le quand l'utilisateur demande une notation, un audio plus propre, un rognage ou de la musique)
python3 "$K/polish.py" <nom> [--grade clean|cinematic|none] [--music calm|none] [--music-level 1.0] [--denoise 100]
- Rognage : coupe le silence avant le premier mot et après le dernier (garde 0,3 s et 0,9 s), et décale la transcription en conséquence.
- Notation :
clean(par défaut) donne une peau chaude et saine, un contraste doux et une légère vignette.cinematicest plus profond et plus froid. Avant de choisir, comparez une image de chacun avec l'original et regardez-la. - Voix : suppression du bruit DeepFilterNet3 (
~/.venvs/dfn, créé par setup.sh ; ne l'installez jamais globalement, il nécessite numpy<2), puis un filtre passe-haut, une accentuation de la présence, un dé-esseur et une compression douce. - Musique : un lit de piano et pad calme synthétisé. Au niveau 1, il se situe environ 20 dB sous la voix dans les pauses et environ 25 dB sous la voix pendant qu'elle parle. Utilisez
--music-level 0.6pour plus silencieux ou1.5pour plus présent. - Les originaux sont conservés sous
source_orig.mp4/transcript_orig.json, donc le polissage peut être ré-exécuté avec n'importe quels réglages. Après le polissage, exécutez à nouveaubuildetrender. - Mentionnez tout bafouillage ou faux départ dans l'ouverture ("à l'heure actuelle, au moment présent…"). Les couper crée un petit saut de coupe, donc demandez avant de le faire.
5. Construire, vérifier, rendre
python3 "$K/caption.py" build <nom> --style <clé> [--hook "…"] [--hot "mot,mot"] [--fix "a=b"]
cd "videos/captions/<nom>" && npx --yes [email protected] check
python3 "$K/caption.py" render <nom>
--hotliste les mots qui restent dans la couleur d'accentuation. Choisissez 2 à 5 mots payants ; les nombres sont automatiquement chauds.check: les avertissements de contraste au moment de la disparition de l'accroche sont attendus. Corrigez toute erreur réelle avant de rendre.- Avant de rendre une accroche, faites un instantané (
npx --yes [email protected] snapshot . --at 1.6 --no-end --describe false) et vérifiez qu'elle ne couvre pas le visage. Lorsque le visage est haut dans le cadre (assis ou plan américain), déplacez l'accroche sur la poitrine avec--hook-y 0.43; l'ombrage suit automatiquement. - Avant d'envoyer, extrayez 3–4 images de
out/captions/<nom>.mp4et regardez-les. Les légendes ne doivent pas couvrir la bouche ou les yeux. Si c'est le cas, reconstruisez avec--cap-y(nombre plus élevé = plus bas à l'écran). - Les vidéos filmées inclinées (un appareil photo tourné sur le côté, sans métadonnées de rotation) montrent la personne allongée sur le côté dans la feuille de contact. Faites-la pivoter d'abord (
ffmpeg -vf transpose=2= 90° dans le sens inverse des aiguilles d'une montre, outranspose=1= dans le sens des aiguilles ; vérifiez une image) dansvideos/_caption-inputs/, puis exécuteznewsur ce fichier. - Envoyez le MP4 avec
SendUserFile, et donnez son chemin sous forme de lien.
6. Révisions
Les réglages persistent dans videos/captions/<nom>/caption.json, donc une révision n'est que build <nom> --<option> … suivi de render <nom>. Demandes courantes :
- Style différent :
--style. - Plus grand ou plus petit :
--size 1.2. - Plus haut ou plus bas :
--cap-y 0.7. - Moins de mots par légende :
--words 2. - Couleur différente :
--accent "#FF4D3D". - Changer l'accroche :
--hook;--hook ""la supprime. - Longueur de l'accroche :
--hook-dur 3.5.
Ils peuvent aussi l'ouvrir eux-mêmes dans HyperFrames Studio avec cd videos/captions/<nom> && npm run dev.
Informations de configuration (si quelque chose casse)
- La transcription appelle
~/.claude/skills/embedded-captions/scripts/transcribe.cjsavecHYPERFRAMES_ROOT=~/.hyperframes-root, une installation de HyperFrames CLI 0.8.147 avec un lien symboliquepackages/cli/dist/cli.js. Si l'un ou l'autre manque, réinstallez :npx hyperframes skills update embedded-captions, puis reconstruisez~/.hyperframes-root(npm install[email protected]et liez symboliquementnode_modules/hyperframes/dist/cli.jsàpackages/cli/dist/cli.js). - Les polices se trouvent dans
kit/fonts/(toutes en SIL OFL) et sont copiées dans chaque projet. setup/doctor.shvérifie chaque élément ci-dessous ;setup/setup.shles répare.- Les légendes qui passent derrière la personne sont possibles avec le flux
/embedded-captions, mais c'est beaucoup plus lent (environ 4 minutes pour 10 secondes) et nécessite queHYPERFRAMES_ROOTsoit défini. Proposez-le uniquement si demandé.