Communitygithub.com

Ryuki0x1/faceless-shorts

Créez des YouTube Shorts / TikToks / Reels sans visage, entièrement en code sur votre ordinateur, avec une voix IA locale gratuite et des sous-titres synchronisés, pour 0€. Six styles disponibles.

Qu'est-ce que faceless-shorts ?

Faceless Shorts est un outil puissant permettant de générer des vidéos courtes sans visage (YouTube Shorts, TikTok, Reels) entièrement par le code, localement sur l'ordinateur de l'utilisateur, sans aucun coût. Il utilise une voix IA locale (Kokoro), la reconnaissance vocale (Whisper) pour les sous-titres synchronisés, et des techniques de rendu comme le dessin sur canvas, Chrome headless, ffmpeg et numpy. L'outil propose six styles distincts : Deep Dive 3D (explications scientifiques façon Zack D. Films), Night File 3D (mystères non résolus et true crime), Inside Out (explications 2D aux rayons X), Stick Story (histoires de survie en bâtonnets), Paper Atlas (histoire en papier découpé avec cartes) et Tall Tale 3D (histoires drôles avec personnages 2D dans un monde 3D ensoleillé). L'utilisateur n'a qu'à fournir un sujet, et l'outil génère le script, la voix, les sous-titres, les plans animés, le son et la musique, le tout en local. Il peut également publier la vidéo finale sur YouTube via Zapier sur demande. Ce système est conçu pour les développeurs et créateurs de contenu qui souhaitent produire des vidéos courtes de manière automatisée, sans dépendre de services cloud ni de crédits.

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

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>/.

stylece qu'il créedurée · format
Deep Dive 3D deep-divele 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 sciences30-45 s · 9:16
Night File 3D night-filemystè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ête30-45 s · 9:16
Inside Out inside-outexplicateur 2D plat « Que se passe-t-il si… ? » : un héros simple, coupes radiographiques, légendes en gras de 1 à 3 mots, montage percutant25-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ées30-45 s · 9:16
Paper Atlas paper-atlashistoire en papier découpé : cartes parchemin, routes cramoisies, rubans de date dorés, figures d'époque30-45 s · 9:16
Tall Tale 3D tall-talehistoires 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 mot40-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

  1. bash SKILL/scripts/new_video.sh <style> <nom-court> copie l'exemple dans ~/faceless-shorts/<nom-court>/.
  2. Écrivez script.json (lignes + légendes + espaces ; voir STYLE.md).
  3. Timing : SKILL/scripts/py SKILL/scripts/voice.py <proj> puis SKILL/scripts/py SKILL/scripts/words.py <proj> (propre enregistrement : words.py <proj> --audio their.m4a ; sous-titres seulement : estimate.py <proj>).
  4. Réécrivez src/shots.js : un plan par ligne (ou deux pour les longues lignes), chacun placé avec cut(i) et ses moments clés sur les mots avec Wd('mot', ligne). Réutilisez le kit (src/core/kit.js) ; ajoutez de nouveaux composants là, dans l'apparence du style.
  5. 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.

  1. Connecter. Si list_zapier_skills a 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.
  2. Héberger le fichier. Les paramètres video / thumbnail de 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 utilisez curl.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 ; utilisez files[0].url (le lien d.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.
  3. 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_id avec inspect_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.
  4. 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" } })
  5. Rapporter. Le résultat contient id ; le lien est https://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.
  6. 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.

Skills associés