Faceless Shorts
Vous créez une courte vidéo verticale finie à partir d'un sujet : script, voix, sous-titres synchronisés, plans animés, son et musique, rendue en MP4. Tout est code : dessin sur canvas, capture Chrome headless, ffmpeg, une voix Kokoro locale, Whisper local pour le timing des mots, numpy pour le son. Pas d'images ou de vidéos générées par IA, pas de clés API, pas de crédits.
SKILL = le dossier où se trouve ce fichier. Les projets se trouvent dans ~/faceless-shorts/<nom-court>/.
| style | ce qu'il crée | durée · format |
|---|---|---|
Deep Dive 3D deep-dive | le fleuron, façon Zack D. Films : personnages 3D sculptés dans des décors ensoleillés, corps x-ray lumineux, voyages de caméra dans les vaisseaux sanguins, faible profondeur de champ. « Que se passe-t-il si… ? » corps et sciences | 30-45 s · 9:16 |
Night File 3D night-file | mystères non résolus / true crime : lieux 3D sombres avec une seule lumière, personnes sans visage (le sujet brille en rouge), dates à la machine à écrire, inserts de dossiers d'enquête | 30-45 s · 9:16 |
Inside Out inside-out | explicateur 2D plat « Que se passe-t-il si… ? » : un héros simple, coupes radiographiques, légendes en gras de 1 à 3 mots, montage percutant | 25-40 s · 9:16 |
Stick Story stick-story | étapes de survie « Que feriez-vous si… ? » : personnages bâtonnets avec des yeux expressifs, pièces plates jour/nuit, cartes d'étape dorées | 30-45 s · 9:16 |
Paper Atlas paper-atlas | histoire en papier découpé : cartes parchemin, routes cramoisies, rubans de date dorés, figures d'époque | 30-45 s · 9:16 |
Tall Tale 3D tall-tale | histoires drôles vraies : personnages dessin animé 2D plats (grosses têtes rondes, contours à l'encre) agissant dans un monde 3D ensoleillé de petite ville, caméra toujours en mouvement, légendes d'un seul mot | 40-60 s · 9:16 |
Quel style : corps / santé / sciences « que se passe-t-il si » → Deep Dive 3D (ou Inside Out pour un look 2D plus léger et rapide) · flippant, inexpliqué, true crime, « ça s'est passé en 1971 » → Night File 3D · survie, astuces de vie, « voici ce qu'il faut faire » → Stick Story · un événement historique, « comment X s'est produit » → Paper Atlas · une histoire vraie drôle ou intelligente, une arnaque, une faille, « ce type a fait X » → Tall Tale 3D. Si ce n'est pas évident, demandez une fois.
Chaque style = styles/<style>/style-sheet.png (l'apparence en une image, dessinée par le code du style) + STYLE.md (les règles + le manuel du moteur) +
example/ (un projet complet qui se rend tel quel). Lisez le STYLE.md du style en entier avant de planifier.
0. Première utilisation sur un ordinateur
bash SKILL/scripts/setup.sh jusqu'à ce qu'il affiche All set (vérifie Node 22+, ffmpeg, Chrome ; construit ~/.faceless-shorts/venv ;
télécharge la voix Kokoro ~340 Mo et Whisper small.en ~0,5 Go). Installez tout ce qui manque de manière officielle et gratuite, et demandez
avant tout ce qui nécessite un mot de passe. Ensuite bash SKILL/scripts/selftest.sh doit afficher SELFTEST PASSED : ouvrez la
planche contact et clip ses noms et regardez-les.
1. Prise en charge (UN message, valeurs par défaut remplies)
Ne demandez que ce qui est inconnu, tout à la fois : sujet (ou « tu choisis 3 idées »), un lien vers une courte vidéo dont ils aiment le format (optionnel),
durée (par défaut ~30 s), voix (SKILL/scripts/py SKILL/scripts/voice.py --list ; par défaut am_michael), mode voix off :
Voix IA (par défaut) · Leur propre enregistrement (ils enregistrent après avoir vu le script ; words.py --audio) ·
Sous-titres seulement (pas encore de voix ; estimate.py), musique (fond intégré · aucun · leur propre fichier libre de droits), ligne de fin / pseudo.
« Vas-y » = les valeurs par défaut.
2. Le plan (UN écran, puis attendez)
Montrez : titre · la narration complète, une ligne par coupe, avec ses blocs de légende (ET SI *TU | AVAIS *DU CHEWING-GUM ?) · la liste des plans,
une ligne chacun (ce qu'on voit, ce qui bouge, sur quel mot il atterrit) · les nouveaux composants que vous ajouterez au kit, le cas échéant · les faits et
leurs sources. Demandez « On construit ? » et attendez.
Règles du script. Écrivez-le comme une personne parle réellement à un ami : des phrases complètes et fluides avec des mots de liaison
(« Eh bien, », « où », « mais », « donc », « ce qui signifie »), pas une liste de courtes déclarations ressemblant à des légendes. ~90-110 mots pour 35 s.
Une ligne est une COUPE, pas une phrase : divisez chaque phrase en 1-3 lignes aux pauses naturelles (virgules, « et », « où »), pour que
l'image change toutes les 1,5-3,5 s tandis que la voix continue de couler (voice.py prononce chaque phrase entière en une seule fois).
Forme : question accrocheuse, puis escalade, un mythe ou une surprise, une torsion (« mais si tu… »), une dernière ligne percutante qui boucle.
Écrivez les nombres comme ils sont prononcés (« sept »). Lisez-le à haute voix dans votre tête : si ça ressemble à des légendes, réécrivez-le.
Écriture originale uniquement : prenez un format que vous aimez, jamais le script ou les plans d'un autre créateur. Chaque fait est vérifié par rapport à une source
fiable (listez-les dans script.json « sources »). Sujets de santé : précis, pas de sang, pas de désinformation effrayante.
3. Construction
bash SKILL/scripts/new_video.sh <style> <nom-court>copie l'exemple dans~/faceless-shorts/<nom-court>/.- Écrivez
script.json(lignes + légendes + espaces ; voir STYLE.md). - Timing :
SKILL/scripts/py SKILL/scripts/voice.py <proj>puisSKILL/scripts/py SKILL/scripts/words.py <proj>(propre enregistrement :words.py <proj> --audio their.m4a; sous-titres seulement :estimate.py <proj>). - Réécrivez
src/shots.js: un plan par ligne (ou deux pour les longues lignes), chacun placé aveccut(i)et ses moments clés sur les mots avecWd('mot', ligne). Réutilisez le kit (src/core/kit.js) ; ajoutez de nouveaux composants là, dans l'apparence du style. - Dans le projet :
node tools/capture.mjs check(doit dire CHECK OK) →node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA (section 4) →node tools/capture.mjs video renders/<nom>.mp4. Itérer sur un plan :node tools/capture.mjs frames review/f "4.2,4.6"et regardez.
4. QA : ne montrez jamais une image que vous n'avez pas regardée
node tools/capture.mjs sheet review/all.jpg 0.5 10 (une image toutes les 0,5 s, avec horodatage) et lisez la feuille entière, puis les images
clés en pleine taille. Pour chaque image demandez :
- Est-ce que ça a du sens ? Un mode visuel par plan : si le corps est en rayons X, TOUT le corps est en rayons X (pas de manches de chemise sur un corps en rayons X). Les accessoires bougent avec ce qui les tient (le chewing-gum reste dans la main jusqu'à ce que la main atteigne la bouche). Rien n'apparaît avant sa cause.
- Correspond-il à la narration à ce moment-là ? L'image change juste avant sa ligne ; les révélations atterrissent sur leur mot.
- Y a-t-il des collisions ? Les choses en mouvement ne croisent jamais les étiquettes, les pilules, la zone de légende (y 1250-1550) ni les autres par accident.
- Légendes : 1-3 mots, exactement un mot jaune, orthographié correctement, sur le mot prononcé, lisible sur un téléphone.
- Feuille de style : seulement la palette, les formes plates, les vues aux rayons X en cyan, le danger en rouge.
- Son : voix claire par-dessus la musique ; effets doux (pas de tiques ou de bips durs). Corrigez, re-rendez la feuille, revérifiez. Dites à l'utilisateur ce que vous avez attrapé et corrigé.
5. Livraison
Ouvrez le MP4 pour l'utilisateur. Donnez aussi : une copie de partage si > 35 Mo (ffmpeg -i in.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 160k -movflags +faststart share.mp4), la meilleure image de couverture (capture.mjs frames), un titre, une légende et 5-8 hashtags.
Pour le mode propre enregistrement, donnez-leur aussi le script avec le timing de chaque ligne à lire en parallèle. Proposez un tour de modifications précises
et re-rendez seulement ce qui a changé.
5b. Publier sur YouTube via Zapier (uniquement quand l'utilisateur demande à télécharger)
Tous les appels sont des outils en mode Code : exécutez-les dans execute en tant que tools.zapier.* (ne les appelez pas comme des outils normaux). Validé une fois dans un téléchargement réel ; les valeurs ci-dessous sont exactes.
- Connecter. Si
list_zapier_skillsa une compétence enregistrée pour le téléchargement, utilisez-la. Sinon, assurez-vous que l'application YouTube est activée :discover_zapier_actions({ app: "YouTube" })→enable_zapier_action({ selected_api: "YouTubeV4CLIAPI", app_display_name: "YouTube", action: "upload_video" }). S'il n'existe pas encore de connexion,manage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" })renvoie une URL de connexion pour l'utilisateur. - Héberger le fichier. Les paramètres
video/thumbnailde l'action nécessitent une URL que les serveurs de Zapier peuvent récupérer ; un chemin local est silencieusement erroné. Mettez le MP4 sur un hébergement temporaire, dans cet ordre (tous testés le 2026-11-03 ; sur Windows utilisezcurl.exe) :- a. litterbox (expiration de 1 h à 72 h, jusqu'à 1 Go) :
curl -F "reqtype=fileupload" -F "time=1h" -F "fileToUpload=@renders/<nom>.mp4" https://litterbox.catbox.moe/resources/internals/api.php→ renvoie l'URL directe en texte brut. - b. uguu.se (expiration d'environ 3 h, bon pour les courtes vidéos de moins de 35 Mo) :
curl -F "files[]=@renders/<nom>.mp4" https://uguu.se/upload→ renvoie du JSON ; utilisezfiles[0].url(le liend.uguu.se/...). - c. catbox (permanent, sans expiration) : même appel que (a) sans
-F "time=1h". Public pour toujours, donc seulement avec l'accord de l'utilisateur. - Ignorez ces (vérifiés cassés le 2026-11-03, ne perdez pas de tentatives) : 0x0.st (téléchargements désactivés), tmpfiles.org (le lien est une page de visualisation, pas le fichier brut), gofile.io (le téléchargement brut nécessite un jeton de compte), file.io (l'API curl redirige vers son application web), bashupload.com, temp.sh (mort).
- Toujours vérifier l'URL avant de l'utiliser :
curl -sSI <url>doit renvoyer 200/206 avec un type de contenu vidéo. Ne faites jamais confiance au JSON d'un hébergeur sans vérifier. - Dites à l'utilisateur que cela place sa vidéo sur un hébergeur temporaire public qui expire tout seul.
- a. litterbox (expiration de 1 h à 72 h, jusqu'à 1 Go) :
- Confirmer d'abord. Cela écrit sur la chaîne réelle de l'utilisateur, donc confirmez avant d'exécuter : titre, visibilité (privée / non listée / publique) et catégorie.
Résolvez
category_idavecinspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" })si nécessaire. Comédie = 23 (suggestion par défaut pour Tall Tale et Deep Dive), Éducation = 27, Animaux & Animaux = 15. - Télécharger.
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<URL temporaire>", title, description (terminez-la par #shorts), tags: [5-8 hashtags sans #], category_id: "23", privacy_status, made_for_kids: false, embeddable: true, notify_subscribers: true, default_language: "en", license: "youtube" } }) - Rapporter. Le résultat contient
id; le lien esthttps://www.youtube.com/watch?v=<id>. Une vidéo verticale de 60 s ou moins devient un Short automatiquement (pas de champ supplémentaire). Ouvrez le fichier local pour l'utilisateur (tools.browser.preview({ path: "renders/<nom>.mp4" })) et donnez l'URL YouTube en texte. Le navigateur intégré à l'application échoue souvent à charger youtube.com avec ERR_ABORTED ; ce n'est pas un échec de téléchargement. - Miniatures. Les téléchargements non listés n'acceptent pas de miniature personnalisée via cette action ; proposez l'image de couverture enregistrée si l'utilisateur rend ensuite la vidéo publique.
Ajouter un nouveau style (quand l'utilisateur le demande)
Faites styles/<nouveau-style>/ avec style-sheet.png, STYLE.md (mêmes sections que Inside Out : règles d'apparence, palette, format,
carte moteur/kit, composants, anatomie du plan, types de repère, pièges de QA) et un example/ complet. Copiez les
tools/, index.html, src/main.js, src/core/{lib,timing,captions}.js de Inside Out, puis construisez le kit et les plans du nouveau look. Les
scripts partagés (voice, words, estimate, new_video, selftest) fonctionnent sans modification. Ajoutez une ligne au tableau ci-dessus et exécutez
selftest.sh jusqu'à ce que chaque style réussisse.
Styles 3D (Deep Dive, Night File, Tall Tale)
Ils rendent de la 3D réelle avec three.js dans Chrome headless. Avec une carte graphique, c'est rapide et de pleine qualité. Sans
(un portable sans accélération GPU, un bac à sable cloud) rendez avec SOFTWARE_GL=1 QS='&res=0.6&aa=0&shadow=1024' FPS=24 devant node tools/capture.mjs ... (≈2 s par image ; dites à l'utilisateur le temps de rendu à l'avance, exécutez-le en
arrière-plan, et faites la QA avec sheet review/all.jpg 1 10 d'abord). Leurs fichiers STYLE.md listent l'API 3D.
Jamais
Générez des images ou des vidéos avec de l'IA ; dépensez l'argent ou les crédits de l'utilisateur ; téléchargez sur YouTube ou tout hébergeur sans que l'utilisateur ne demande et confirme ; copiez le script, les plans ou les images d'un autre créateur ; écrasez le projet d'un utilisateur sans demander ; livrez une image que vous n'avez pas regardée.