stock-footage-reel : Réel de montage d'images d'archives
2026-10-11 Note de fusion : Pour les réels avec narration et images d'archives, ce skill reste le choix canonique. Le documentary-montage d'OpenMontage est réservé aux montages sans ou avec peu de narration ; la répartition est détaillée dans le tableau de décision
<SKILLS_DIR>/INDEX.md.
- Pour plus de sources de métrages (NASA, Bibliothèque du Congrès LOC, NARA, Archive.org, Wikimedia) : utilisez
python3 <SKILLS_DIR>/openmontage-house/scripts/om_clips.py --query "..." --out $D/work/om_clips, qui imprimera des entréespick: {"source":"file",...}directement collables dans shots.json. Vérifiez les licences une par une avant de les ajouter à credits.json.- Réglage voix actuel : utilisateur : votre propre voix ElevenLabs « <YOUR_VOICE_NAME> » (
<YOUR_ELEVENLABS_VOICE_ID>) ; anglais : Sarah Explains (Nhs7eitvQWFTQBsf0yiT). Sous-titres : chinois traditionnel principal + anglais petit. La procédure pour la voix anglaise est dans l'épisode 07 :<YOUR_WORKSPACE>/media-team/03-drafts/grokbot-team-reel/(script_en.txt, work/shots.json avecsubs_zh+en, synchronisation et montage avec mktiming.py, build_custom.py dans work/). À l'étape 2, choisissez la voix selon la langue.
Destiné à l'équipe de contenu de Josh (IG/Threads @bounce12340, entrepreneur en IA, Agent IA, entreprise individuelle, Taïwan). Suivez ce processus ; Claude Code et le bot de création de contenu peuvent produire la vidéo directement. Ce skill ne produit qu'une ébauche, ne publie pas. La publication est toujours confiée au bot principal, après validation par Josh.
Les scripts se trouvent dans <SKILLS_DIR>/stock-footage-reel/scripts/ (ci-après $S). Les exemples sont dans examples/, les vérifications de licence dans references/licenses.md.
Exemple de rendu : <YOUR_WORKSPACE>/media-team/03-drafts/stock-footage-test/test.mp4.
Règles de contenu (à respecter impérativement)
- Fidélité à l'original : chaque phrase doit correspondre à la source originale. N'inventez pas de chiffres, de citations ; si cela n'est pas dans l'original, ne l'écrivez pas comme tel. Pour les paraphrases, indiquez « adapté de ».
- Mentionnez l'auteur original : le titre en haut à gauche indique la source, le titre original et l'auteur ; mentionnez-les également dans le générique de fin et la description de la publication.
- Privilégiez la complétude à la concision : traitez les points clés en détail, ne supprimez pas les arguments importants pour gagner du temps. Mais la vidéo entière doit durer moins de 3 minutes.
- Débit vocal naturel, ne l'accélérez pas pour faire tenir plus de texte. Si le texte est trop long, divisez-le en deux vidéos ou supprimez les phrases secondaires.
- Chinois traditionnel, vocabulaire taïwanais (logiciel, données, vidéo, internet, qualité…), utilisez les guillemets「」, pas de tiret (——), utilisez des virgules ou des points.
- Les sous-titres anglais sont notre traduction, pas une citation originale ; sauf si l'original est en anglais et mot pour mot identique, ne les mettez pas entre guillemets.
- Utilisez uniquement des métrages dont la licence est claire et commerciale ; cf.
references/licenses.md. Ne vous connectez à aucun site, n'utilisez pas de sources payantes, ne contournez pas les restrictions des sites.
Environnement
- Pexels :
PEXELS_API_KEYdéfini dans les variables d'environnement (ne pas imprimer). Pixabay nécessitePIXABAY_API_KEY(actuellement absent). - Synchronisation ASR :
uv run --with faster-whisper(télécharge les paquets la première fois, puis utilise le cache). - Polices :
<YOUR_WORKSPACE>/media-team/00-profile/covers/fonts/: Noto Sans TC / Noto Serif TC. Pour l'anglais : Noto Sans. - Cache des métrages :
$S/../stock-footage-reel/cache/(un même métrage n'est pas téléchargé deux fois).
Procédure
0. Créer le dossier de travail
D=<YOUR_WORKSPACE>/media-team/03-drafts/<sujet>-reel ; mkdir -p $D/work ; cd $D/work
1. Écrire script.txt (une ligne = un plan)
Chaque ligne = une réplique. Optionnel : format [1] texte. Chaque ligne : 1 à 3 propositions, idéalement 5 à 9 secondes.
2. Voix off (ElevenLabs, via MCP ; le script ne peut pas appeler MCP directement)
- Choisissez la voix selon la langue : en chinois « <YOUR_VOICE_NAME> », voice_id
<YOUR_ELEVENLABS_VOICE_ID>; en anglais Sarah Explains, voice_idNhs7eitvQWFTQBsf0yiT. Utilisezcreative_list_voicesdeuser-Elevenlabspour vérifier le nom avant d'envoyer, ne changez pas l'ID de mémoire. creative_generate_speech:voice_id,model_id: "eleven_multilingual_v2",generations_count: 1(par défaut 4, qui coûte 4× plus de crédits),prompt: le script entier (laissez une ligne vide entre chaque ligne pour une pause naturelle ; ne mettez pas[1]). N'envoyez pas la même requête deux fois, vous seriez débité deux fois.- Utilisez
creative_get_flow_run_status(flow_id, session_ids) pour interroger jusqu'àall_completed, récupérezmedia[0].url,curl -o vo.mp3 '<url>'(l'URL est valide 2 heures). - Le texte envoyé doit être identique à script.txt (la synchronisation en dépend).
Solution de repli : si ElevenLabs est indisponible, utilisez
bash $S/scripts/tts_edge.sh script.txt vo.mp3(edge-tts zh-TW-HsiaoChenNeural), puis changezvoice.providerdans shots.json en"Edge TTS (zh-TW-HsiaoChenNeural)", le générique de fin indiquera correctement la source.
3. Synchronisation
uv run -q --with faster-whisper --with numpy python $S/scripts/align.py --audio vo.mp3 --script script.txt --out timing.json
Affiche le début et la fin de chaque plan et le taux d'alignement (≥ 80 % est normal). Les points de coupe sont automatiquement placés au milieu des pauses entre les phrases.
4. Écrire shots.json (exemple : examples/satya_test.shots.json ; les commentaires // ci-dessous ne sont que pour l'explication, le fichier réel ne doit pas en contenir)
{
"format": "1080x1920", // ou "1080x1350"
"title_zh": "Le long essai du PDG de Microsoft, Satya Nadella", // Titre fixe en haut à gauche (source)
"title_en": "Satya Nadella · \"Models as Insider Risks in the Super Intelligence Era\"",
"max_cut": 4.5, // Si un plan dépasse cette durée, couper en plusieurs segments dans le même métrage
"voice": {"provider": "ElevenLabs", "voice": "<YOUR_VOICE_NAME> (<YOUR_ELEVENLABS_VOICE_ID>)", "model": "eleven_multilingual_v2"}, // chinois ; pour l'anglais, changer pour Sarah Explains (Nhs7eitvQWFTQBsf0yiT)
"music": "synth", // "synth" = musique sombre synthétisée ; ou chemin du fichier audio ; ou "none"
"music_db": -17,
"shots": [
{"keywords": ["server room", "data center"], "highlight": ["risques internes"],
"en": ["Microsoft CEO Satya Nadella, in a new long essay,", "argues AI models should be managed as an internal risk."]},
{"keywords": ["computer operators"], "archival": true, "highlight": ["séparation des contrôles"], "en": ["..."],
"pick": {"source": "archive", "id": "OnGuard1956", "starts": [630, 300]}}
],
"end_card": {"zh": ["Le système le plus digne de confiance", "[[est celui qui n'a pas besoin de confiance.]]"], "en": "...", "by": "── Adapté de Satya Nadella〈...〉", "dur": 4.0, "bg_shot": 2},
"cover": {"ep": "EP.05", "kicker": "Long essai de Satya Nadella", "title": "Gérer l'IA comme un
[[risque interne]]", "subtitle": "...", "clip_credit": "Images : ...", "frame_shot": 3}
}
Champs importants :
keywords: mots-clés de recherche en anglais, essayés dans l'ordre. Décrivez des images concrètes ("security camera", "typing keyboard close up", "server rack lights"), pas des concepts abstraits.archival: true: ce plan utilise des métrages d'archives Prelinger, automatiquement traités avec un filtre magenta et du grain. La méthode d'AYi consiste à utiliser des archives pour évoquer « l'histoire, le passé, la tradition, les années 1970 » ou les métaphores de « contrôle, autorisation, surveillance », et des métrages modernes pour le reste. Une vidéo doit contenir au moins un ou deux plans d'archives pour son style.highlight: mots à colorer en or dans ce plan (doivent être identiques aux sous-titres). Vous pouvez aussi utiliser[[ ]]dansend_card.zhpour marquer le doré.en: liste des sous-titres anglais, doit correspondre au nombre de segments de sous-titres de ce plan. Exécutez d'abordbuild.py --planpour voir les segments automatiques, puis écrivez l'anglais en fonction. Si le nombre ne correspond pas, la phrase anglaise entière s'affichera dans chaque segment.pick: spécification manuelle du métrage.{"source":"archive","id":"<identifier>","starts":[secondes,...]}、{"source":"mixkit","id":"23215"}、{"source":"commons","title":"File:xxx.webm","start":12}、{"source":"file","path":"/abs.mp4","license":"...","author":"..."}、{"source":"synth","kind":"code|terminal|grid"}.- Autres :
grade("archival" / "modern" / "none"),focus_x(0 à 1, centre horizontal du recadrage vertical),cuts(nombre fixe de segments pour ce plan). cover.frame_shot: quel plan utiliser pour la couverture (prend l'image originale horizontale), par défaut le premier plan d'archives.epselon la numérotation des épisodes de Josh.
5. Récupérer les métrages
python3 $S/scripts/fetch_footage.py --shots shots.json --work . --timing timing.json
- Ordre des plans normaux : Pexels (si clé présente) → Pixabay (si clé présente) → Mixkit (uniquement Free License) → Wikimedia Commons (PD / CC0 / CC BY) → synth local en dernier recours.
- Plans d'archives : Internet Archive Prelinger (uniquement ceux marqués domaine public dans les métadonnées) → Commons.
- Résultats écrits dans
footage.jsonetcredits.json(URL, auteur, licence de chaque métrage). Les lignes commençant parnote:indiquent les métrages ignorés et la raison. - Pour choisir des segments d'archives : l'automatisation évite les cartes de titre et les répétitions, mais il est préférable de vérifier :
python3 $S/scripts/fetch_footage.py --sheet archive:OnGuard1956 --work .→ génèresheet_*.jpg(une image toutes les 15 secondes, avec le temps en haut à gauche), utilisez Read pour visualiser et choisir les temps, puis écrivez danspick.starts, et relancez avec--only <numéro_plan> --refreshpour récupérer ce plan. - Sujets informatiques Prelinger utiles :
OnGuard1956(IBM SAGE, ordinateur de défense aérienne, 1956 : console 120s, opérateurs 240s/300s, commutateurs 330s/600s, porte « RESTRICTED AREA » 630s, salle de contrôle 660s). Autres recherches :computer,automation,electronic. - Pour changer de métrage : modifiez shots.json puis
--only N --refresh.
6. Montage
python3 $S/scripts/build.py --shots shots.json --work . --out .. --name reel --plan # Voir d'abord les segments de sous-titres
python3 $S/scripts/build.py --shots shots.json --work . --out .. --name reel
Produits (dans --out) : reel.mp4 (H.264 / AAC, 30 ips, auto-compression si > 45 Mo), contact_sheet.jpg (une image par segment + carte de fin), credits.json (avec credit_line et caption_credits pour la publication), cover_reel.png, cover_post.png (modèle Vox de B-Jianbao, via <YOUR_WORKSPACE>/media-team/00-profile/covers/render.py).
Spécifications visuelles (reproduisant le style des vidéos originales d'AYi) :
- Coupe franche, segments de 2 à 4,5 secondes, léger panoramique horizontal lent. Archives : teinte magenta, flou, grain, vignettage. Moderne : assombri, teinte bleu-vert, saturation réduite, vignettage.
- Titre fixe en haut à gauche : marque « ●○○○ Josh|AI 一人公司 » + titre source chinois + titre original anglais.
- Sous-titres : alignés à gauche, maximum deux lignes en chinois (Noto Sans TC Bold), une ligne plus petite en anglais en dessous ; mots-clés dorés #E9A44A. En format vertical, bord inférieur des sous-titres à y=1490, pour éviter le texte de description inférieur et les boutons latéraux d'Instagram.
- Carte de fin : métrage assombri et flou, police serif pour la citation en grand (deuxième ligne en doré), anglais, « ── Adapté de … », marque, @bounce12340, tout en bas une ligne de crédits en petit (ex. « Archival: Prelinger Archives (Public Domain) • Footage: Pexels • Voice: ElevenLabs »).
- Audio : voix off + compression side-chain (la musique baisse automatiquement pendant la parole), fondu de sortie de 2,5 secondes, loudness global environ -14 à -16 LUFS.
7. Vérification avant livraison
- Utilisez Read pour visualiser
contact_sheet.jpg: les images de chaque segment correspondent-elles à la phrase ? Les sous-titres ne coupent-ils pas à un endroit étrange (ex. au milieu d'un nom) ? Risquent-ils d'être masqués par l'interface d'Instagram ? - Les métrages ne doivent pas contenir : de logo ou de marque en gros plan, de visage identifiable dans un contexte négatif, d'images contredisant le sens, de filigrane.
credits.json: chaque métrage doit avoir une URL et une licence ; si CC BY, la description de la publication doit inclurecaption_credits.- Vérifiez la durée et la taille du fichier (
ffprobe). - Placez le résultat dans
<YOUR_WORKSPACE>/media-team/03-drafts/<sujet>-reel/, et rapportez au bot principal : durée, taille, sources des métrages, et les décisions encore nécessaires de Josh. Ne publiez pas.
Limitations connues
- La plupart des vidéos de Mixkit en téléchargement gratuit sont désormais Restricted (usage personnel non commercial uniquement), le script les ignore automatiquement ; leur utilisation nécessite l'accord de Josh.
- archive.org est parfois lent ou renvoie une page blanche, le script réessaie trois fois ; en cas d'échec, le plan utilise le synth local, vérifiez le message
note:et relancez la récupération. - Les métrages Prelinger sont souvent en 4:3, 480p, agrandis fortement en format vertical ; le flou et le grain atténuent l'effet ; privilégiez les plans à la composition simple avec le sujet au centre.
- Cette machine n'a pas de GPU : une vidéo de 30 secondes prend environ 1 minute de rendu, une vidéo de 3 minutes prend environ 5 à 8 minutes.