Communitygithub.com

vstoos/vlog-film

Monte un film YouTube HDR (HLG 10 bits) à partir de rushes de voyage/voiture : clips parlés, dash-cam, photos, écran OBD/Torque, avec teaser, coupures sur la parole, inserts de route, sous-titres, doublage dans la voix clonée de l'utilisateur.

Qu'est-ce que vlog-film ?

Ce skill automatise le montage de vidéos de voyage en voiture (par exemple road trip, vlog de bord) en un film YouTube finalisé de qualité professionnelle. Il prend en charge les rushes typiques : clips parlés enregistrés avec un téléphone (format HLG), vidéos de dash-cam (dont Tesla Sentry), photos d'étape, et enregistrements d’écran OBD/Torque. Le workflow comprend la transcription WhisperX, une table de montage (EDL) dans un fichier Python, l’incrustation de photos sur la parole (b-roll), le floutage de plaques d’immatriculation et visages, la stabilisation audio, l’ajout de musique, la génération de sous-titres traduits, ainsi que le doublage complet dans la voix clonée de l’utilisateur via Higgs TTS. Le pipeline produit des vidéos HDR (HLG 10 bits) avec des chapitres YouTube, une miniature, une description et des pistes audio doublées. Le skill est conçu pour les utilisateurs de Claude Code et autres agents capables d’exécuter des scripts Python locaux. Il s’appuie sur FFmpeg, MLT, WhisperX (via une installation PyTorch dédiée), et plusieurs scripts dans `<skill>/scripts/`. L’utilisateur peut itérer sur le montage via des notes de révision ; le système vérifie chaque coupe avec une transcription du fichier final pour éviter les erreurs de la passe initiale.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/vstoos/vlog-film/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

Film Vlog

Transforme un dossier de rushes en un film YouTube finalisé, puis itère avec les notes de l'utilisateur jusqu'à son approbation. Le pipeline a été construit sur « Yaris farewell » (24 min, discours ukrainien, iPhone + dash-cam Sony) ; references/example_yaris.py est le fichier projet complet de ce film, le meilleur guide pour visualiser un montage fini.

Avant de commencer

  • Configuration. <skill>/config.json contient les chemins de la machine (ffmpeg, melt, Python avec WhisperX, modèle de plaques, dossier musique, encodeur, langue de parole). S'il manque, ou si un script échoue pour un outil manquant, exécute python <skill>/setup/setup.py (vérification seulement) et montre à l'utilisateur ce qui manque ; avec son accord, lance python <skill>/setup/setup.py --install. Exécute chaque script ci-dessous avec le Python défini dans config.json ("python"), car c'est là que WhisperX et torch sont installés.
  • L'utilisateur. Si <skill>/user.md existe, lis-le : il indique qui est l'utilisateur, dans quelle langue répondre et ses préférences permanentes. Sans lui : réponds dans la langue de l'utilisateur, garde les réponses courtes, nomme les durées des films en mm:ss pour tout ce qu'il doit examiner.
  • Dans les commandes ci-dessous, $K est <skill>/scripts et python est le Python configuré.

Structure du projet

Les rushes restent là où l'utilisateur les a placés ; le mp4 final, la description YouTube, la miniature et les sous-titres vont aussi là où l'utilisateur les cherche. Les fichiers de travail vont dans un dossier projet (par exemple C:/Data/<nom>-video/) :

<nom>-video/
  project.py        chemins, EDL, HOOK, musique, cadre, make_stills()   (copie de references/project_template.py)
  transcripts/      <clip>.json issu de transcribe_all.py
  film/             inserts rendus, <clip>_blur.mov, <nom>.mlt, <nom>.mp4
  film_check/       planches contacts, wavs de test, trames de vérification (brouillon)
  edit_notes.md     les notes de révision de l'utilisateur et ce qui a été fait pour chacune
  subs/, thumbnail/, route/

Flux de travail

1. Inventaire

  1. python $K/scan_meta.py <rushes> film_check/meta.json : heure, durée, GPS de chaque fichier. Trié par heure, c'est l'ordre narratif.
  2. Regarde avant de décider : python $K/contact_sheet.py <out.png> 6 <clips...> pour les clips, une planche contact pour les photos ; visualise les images toi-même. Note les clips portrait (rotation -90/90), les clips montrant des plaques d'immatriculation, les fichiers dash-cam, les enregistrements d'écran. Événements Tesla dash-cam / Sentry des dates du voyage : references/teslacam.md (trouver l'incident, couleur via teslacam_grade.py).
  3. python $K/transcribe_all.py <rushes> transcripts : transcription WhisperX avec timings par mot de chaque clip parlé (reprenable, langue depuis la config). Lis-les tous ; ils sont la matière première de l'histoire.

2. Histoire et EDL

Propose la structure à l'utilisateur en quelques lignes avant de construire : le teaser, les parties, quelles photos, cartes ou images fixes illustrent quelle parole. Forme typique :

  • Teaser (HOOK) : 4 à 6 phrases courtes et fortes tirées de tout le voyage, chacune une idée complète.
  • Carton titre sur des images de route, puis blocs de parole séparés par 4 à 10 secondes d'inserts de route sous la musique.
  • Inserts là où la parole mentionne quelque chose : le ticket de caisse quand on parle de carburant, le pont élévateur quand on parle de contrôle technique, un itinéraire au début de chaque étape.
  • Images sur la voix (b-roll, captures d'écran du téléphone, légendes pendant que l'intervenant continue à parler) : incruste-les dans le clip parlé avec burn_in.py, avant filmkit (il n'affiche un clip parlé que pendant qu'il parle). Une image portrait (capture d'écran, clip vertical, photo portrait) occupe toute la hauteur du cadre du côté libre du visage de l'intervenant, déterminé par détection faciale, afin que le visage reste visible ; l'horloge et les boutons du téléphone remplissent de toute façon le haut et le bas. Une image paysage couvre le cadre.
  • Les inserts de route doivent montrer ce dont l'histoire a besoin à ce moment-là (la bretelle d'accès à la station-service avant « on s'est arrêtés », le parking de l'aéroport avant la scène à l'aéroport), pas n'importe quelle autoroute : regarde une planche contact du clip de route autour du bon moment.
  • Carte de fin : 20 s sur des images de route, texte en haut, le milieu libre pour les vignettes de fin YouTube ; un lien de référence ici si l'utilisateur en a un.

Écris project.py à partir de references/project_template.py ; les types d'éléments de l'EDL, les légendes, les clés musicales et les options par clip y sont documentés. Les plages de parole proviennent des temps de transcription.

3. Construction et rendu

python $K/blur_plates.py <rushes> <projet>/film [--faces] IMG_0089 ...   # plaques ; --faces : personnes aussi
python $K/burn_in.py film/IMG_0089_blur.mov film/IMG_0089_over.mov spec.json   # images sur la parole, le cas échéant
python $K/filmkit.py <projet>/project.py                        # rend les inserts, écrit film/<nom>.mlt
python $K/render_final.py <projet>/film <nom> <rushes>/<Nom>_HLG.mp4   # long : lance en arrière-plan

Avant un gros travail GPU (rendu, WhisperX, doublage), lance nvidia-smi : les numéros de carte changent entre les sessions et diffèrent entre les outils, et d'autres tâches peuvent occuper une carte (references/lessons.md, « GPU et encodeurs matériels »). filmkit.py --no-media ne fait que réécrire le .mlt (quelques secondes). Le rendu affiche le volume sonore, la durée, les balises codec/HDR et un compteur d'images vertes : attendre environ -14 LUFS, Main 10, arib-std-b67, bt2020, 0 vert.

4. Vérification avant de dire à l'utilisateur que c'est fini

Écoute avec WhisperX au lieu de te fier à l'EDL : pour chaque coupe nouvelle ou modifiée, coupe les mêmes secondes dans le mp4 terminé et transcrit-les (python $K/transcribe_window.py <wav> <offset>). Les transcriptions de première passe sont souvent erronées sur la fin d'une phrase, surtout avec des chiffres, donc les coupes faites à partir d'elles tronquent la fin (« не 144, а 147 » a perdu « а 147 »). Mesure aussi le volume sonore des sections voisines (ffmpeg -ss A -t N -i film.mp4 -af ebur128 -f null -) et regarde une image de chaque nouvel insert. Les autres pièges et leurs corrections : references/lessons.md.

5. Cycles de révision

L'utilisateur regarde et envoie des notes avec les durées du film. Pour chaque note :

  1. python $K/timeline.py film/<nom>.mlt 12:22 donne le nom du clip et la seconde source.
  2. Vérifie la source (transcris une fenêtre, mesure le volume sonore, regarde les images). Dis à l'utilisateur ce qu'il y a réellement, en citant les mots originaux ; sa mémoire diffère parfois de l'enregistrement.
  3. Modifie l'EDL et consigne dans edit_notes.md (durée du film, clip et secondes, ce qui a été dit, changement).

Pendant que l'utilisateur regarde encore, collecte les notes et ne reconstruis pas : une seule reconstruction à la fin économise les longs rendus. Quand il dit de construire, reconstruis une fois, vérifie chaque endroit modifié comme à l'étape 4, mets à jour les chapitres.

6. Livrables

references/youtube.md : description avec chapitres (timeline.py), miniature (make_thumb.py), sous-titres (make_subs.py sur le film fini, corrigés à la main, puis traduits par réplique, plus les textes à l'écran traduits comme leurs propres répliques avec onscreen_subs.py), doublage automatique YouTube. L'utilisateur peut regarder les rendus sur un téléphone via python $K/media_server.py --port 8765 <rushes> <projet>/film (LAN/VPN seulement ; lecture seule ; aussi sur github.com/vstoos/media-server).

7. Pistes audio doublées

Pour une langue que l'utilisateur veut entendre, pas lire : references/dubbing.md. La voix est Higgs TTS 3 (par défaut depuis le 06.11.2026) avec la référence enregistrée de l'utilisateur dans cette langue (C:/Data/voices, passe -) ; chaque description de film avec une piste Higgs crédite « Boson AI's Higgs Audio ». Les sous-titres passent par dub.py gen, dub_check.py détecte les défauts du modèle prise par prise, dub_regen.py remplace ce qui a échoué, et dub.py mix construit la piste et imprime ce qu'il faut écouter. Corrige la prononciation dans say.json. La voix off pour les images silencieuses (clips dash-cam) emprunte la même voie en ukrainien, rédigée en sous-titres. Ne déclare pas un doublage propre uniquement d'après les vérifications : l'oreille de l'utilisateur est la dernière étape.

Vie privée

Plaques : l'utilisateur ne floute pas la circulation ordinaire (Pologne ; le cadre flottant gâche les plans de route). Ne floute une plaque que lorsque le clip montre une infraction potentielle de ce conducteur ou une quasi-collision, afin que le film ne puisse pas alimenter une plainte contre une personne ; les inserts de route sont utilisés tels quels via CLIP_SRC dans le projet. Floute les visages du personnel, des passants et des enfants (blur_plates.py --faces ; vérifie les images, les reflets dans la peinture de la voiture peuvent le tromper) ; commence les cartes d'itinéraire dans un lieu public, jamais au domicile de l'utilisateur ; ne mets pas les visages d'autres personnes (surtout des enfants) sur les miniatures sauf si demandé.

Fichiers de référence

  • references/project_template.py : fichier projet annoté à copier ; syntaxe EDL.
  • references/example_yaris.py : le film Yaris terminé, toutes les fonctionnalités utilisées.
  • references/lessons.md : pièges HDR, audio, coupe et cadrage, avec les corrections qui ont fonctionné.
  • references/teslacam.md : clips Tesla dash-cam / Sentry (HW3) : trouver l'incident dans un événement sauvegardé, et la correction colorimétrique (scripts/teslacam_grade.py).
  • references/youtube.md : description, chapitres, miniature, sous-titres, doublage, écran de fin.
  • references/dubbing.md : pistes audio propres dans la voix clonée de l'utilisateur, et vérifications automatiques des défauts.
  • references/example_make_route.py : carte d'itinéraire animée (tuiles Sentinel-2 + routes OSRM) du film Yaris ; adapte ses constantes (limites, villes, épingles, tronçons) pour un nouveau voyage.

Skills associés