Reel mème
Cette compétence transforme un sujet en une vidéo verticale que même le spectateur le moins informé comprendra. Le spectateur rit avec des moments célèbres de séries/films turcs, tout en apprenant le sujet grâce aux scènes animées et à la narration intermédiaires. Le moteur est déterministe : les scènes HTML sont dessinées image par image dans Chromium, le son est synthétisé et mixé avec numpy.
Exemple prêt : examples/ardupilot-mcp/ (36 s, 4 mèmes, 6 scènes narratives). Avant de commencer un nouveau reel, lis ses fichiers plan.json, fx.js et scenes/ ; tu y verras toutes les fonctionnalités en action.
Limites
- Ne publie rien. Donne la vidéo à l'utilisateur sous forme de fichier. Ne la mets même pas en brouillon dans une plateforme ou un tampon, sauf si l'utilisateur donne son accord explicite à ce moment-là. Les étapes de publication sont dans la compétence
buffer-sosyal-icerik. - Chaque chiffre et affirmation à l'écran doit être vérifié. Cite une source : log, mesure, sortie d'outil ou donnée fournie par l'utilisateur. Ne mets pas d'affirmation non vérifiable (ex : "résolu en 1 minute") dans la vidéo.
- N'ajoute pas de ligne de mention. Même si tu utilises des données de simulation ou de démonstration, n'ajoute pas de ligne "Note :" ou de clause de transparence à la vidéo ou à la description, sauf si l'utilisateur le demande explicitement. N'écris pas de crochet comme "une expérience en simulateur" sur la première image.
- Droits d'auteur : Les clips de séries/films sont protégés. Si l'utilisateur n'a pas accepté le risque, demande d'abord. Ne supprime pas le logo de la source (ex : TRT 1) ; supprime les filigranes publicitaires tiers (comme les sites de paris) en les rognant.
- Licence TTS :
edge-ttsutilise le service gratuit de synthèse vocale Edge, dont l'utilisation commerciale est dans une zone grise. Pour une diffusion commerciale, les mêmes voix sont disponibles sous licence sur Azure Speech, ou la propre voix de l'utilisateur peut être utilisée.
Texte de partage
Si l'utilisateur demande une description (caption) :
- Ne répète pas les phrases de la vidéo. La description raconte ce que la vidéo n'explique pas : de quoi il s'agit, à quoi ça sert, où le trouver.
- Écris comme si tu écrivais à un ami, en turc courant. Termine par une seule question qui invite au commentaire.
- N'ajoute pas de "Note :" ni de clause de transparence. Les mentions de simulation, de données de démonstration, d'utilisation de l'IA n'entrent pas dans le texte de la description. Si un label IA est requis, il est apposé via le réglage propre à la plateforme.
- Les liens dans la description Instagram ne sont pas cliquables. Si tu dis "Lien dans le profil" dans la vidéo ou le texte, assure-toi que l'utilisateur confirme que le lien est bien dans le profil ; aucune API ne peut modifier la bio. Pour YouTube, écris le lien directement dans la description.
Installation
bash scripts/setup.sh # pip : edge-tts faster-whisper numpy scipy yt-dlp ; vérification ffmpeg et Playwright
Les problèmes connus liés à l'environnement (proxy/TLS, contrôle bot YouTube, absence de H.264 dans Chromium, Whisper et PyAV) et leurs solutions se trouvent dans references/pitfalls.md. Consulte-le en cas de blocage.
Flux
- Collecte les faits. Extrais l'affirmation de la vidéo de sa source : sortie d'outil, log, mesure. Note les chiffres et les durées ; les scènes utiliseront ces valeurs. Si une commande d'installation apparaît à l'écran, vérifie que le paquet existe bien dans le registre (PyPI, npm) et écris la commande familière :
pip install paquet,npm i paquet. Des outils commeuvxsont pour les fichiers de configuration MCP ; ils sont étrangers au grand public. - Écris le scénario (voir le modèle ci-dessous). Chaque phrase narrative dure 2 à 7 s, chaque mème 1 à 3 s.
- Choisis le mème. Consulte d'abord le catalogue
references/tr-memes.md(clips vérifiés avec réplique et timestamp). Pour un nouveau clip, cherche sur Dailymotion avecpython3 scripts/reel.py search "erdal bakkal", télécharge-le, puis trouve la seconde exacte de la réplique avecreel.py stt. Mesure la position du visage dans l'image quadrillée avecreel.py still SOURCE SECONDE(cropx). - Configure le projet :
plan.json,style.css,fx.js, si besoindata.jsetscenes/*.html. Le plus rapide est de copier et modifier l'exemple. - Coupe et vérifie les clips :
reel.py clips PROJET. Pour chaque clip, le texte entendu par Whisper est affiché côte à côte avecquote. S'il y a discordance, corrige le timestamp. - Synthétise la voix :
reel.py tts PROJET --verify. Si Whisper entend mal un mot, le TTS le lira aussi mal ; écris le textesayphonétiquement (ex :ArduPilot em si pi'ye), le bon texte s'affiche à l'écran viashow. - Montage et prévisualisation :
reel.py build PROJETpuisreel.py preview PROJET.build/sheet.pngmontre 3 images de chaque scène. Ouvre le sheet et vérifie : éléments débordants ou superposés, texte entrant dans la zone de sécurité, écran vide, sous-titres illisibles. Corrige, répète. - Rendu :
reel.py render PROJET --verify→PROJET/out/<titre>.mp4. La sortie indique la durée, le niveau sonore intégré (doit être autour de -14 LUFS) et le pic ;--verifypasse toute la vidéo dans Whisper. Si toutes les narrations et répliques de mèmes sont correctement entendues, la musique ne couvre pas la parole. - Envoie la vidéo à l'utilisateur. Résume brièvement les clips utilisés, leurs sources, les risques associés (droits d'auteur, licence TTS, source basse résolution) et les décisions de montage que tu contestes.
- Tour de correction. Si l'utilisateur demande une modification de texte ou d'image dans une scène, corrige sans changer la narration ni les durées de scène, exécute
build+preview --atpour voir cette image, puis lancereel.py render PROJET --from <seconde de début de la scène>. Les images précédentes sont conservées, seul le reste est redessiné. Si la narration change, les durées se décalent ; un rendu complet est alors nécessaire. - Publication. Si l'utilisateur dit "publions", passe à la compétence
buffer-sosyal-icerik: la vidéo est téléchargée via l'étape d'hébergement là-bas, Reel, Shorts et story partent du même fichier. Le lien dans la story n'est pas publié automatiquement ; consulte la section story de cette compétence.
Modèle de scénario
Les règles d'accroche et leurs justifications sont dans references/hooks.md. Version courte :
| Étape | Durée | Ce qui se passe |
|---|---|---|
| Accroche | 0-3 s | Commence par le milieu de l'action (drone qui tombe, erreur rouge). Que la première image montre déjà une phrase de 4 à 7 mots ; même sans son, le spectateur comprend. |
| Mème de réaction | 1-2 s | Surprise ("Quoi ?"). Juste après l'accroche. |
| Problème | 3-6 s | Montre l'ampleur du problème avec un chiffre concret (1 558 457 lignes). |
| Mèmes de réaction | 2-5 s | Un ou deux mèmes sur l'absurdité du problème. Un texte superposé (cap) relie le mème au sujet. |
| Solution | 3-4 s | Moment d'utilisation du produit ; interface réelle ou imitation fidèle. |
| Réponse | 4-7 s | Principal résultat, animé avec des données. La scène la plus longue et la plus "éducative". |
| Valeur | 2-3 s | Gratuit, open source, commande d'installation, etc. |
| Mème d'incitation | 1-2 s | Mème qui interpelle le spectateur ("Qu'est-ce que tu attends, Behzat ?"). |
| Clôture | 3-5 s | Que faire + lecture "Lien dans le profil". |
Durée totale : 25-36 s. Si la vidéo dépasse 30 s, propose de raccourcir la phrase narrative la plus longue.
plan.json
{
"title": "<Sujet> - Reels <nom>", // nom du fichier de sortie
"voice": "tr-TR-EmelNeural", "rate": "+6%", // tr-TR-AhmetNeural ne renvoie pas de son sur ce service
"clips": { // sources des mèmes
"neoldu": {"dm": "x587xuk", "start": 37.80, "dur": 1.06, "cropx": 135, "quote": "— Ne oldu?"}
// source : "dm" (id Dailymotion) | "url" (yt-dlp) | "file" (local). mode : "face" (recadrage visage 4:5, par défaut) | "fit" (plan large)
},
"lines": { // narration ; "show" est le texte affiché à l'écran (optionnel)
"n1": {"say": "Dronum yirmi metreden düştü.", "show": "Drone'um 20 metreden düştü."}
},
"scenes": [ // jouées dans l'ordre ; les durées sont calculées à partir du son
{"id": "a", "line": "n1", "html": "scenes/crash.html", "pad": 0.25, "cap": "texte superposé optionnel"},
{"id": "m1", "clip": "neoldu", "cap": "texte superposé optionnel"}
],
"music": {"style": "phonk", "bpm": 120, "level": 0.42, "mute": [["a@düştü+0.05", "b"]], "light": []},
"sfx": [{"fx": "boom", "at": "a@düştü+0.1", "gain": 1.0}]
}
Si le nombre de mots de show est égal à celui de say, chaque mot prend son propre temps ; sinon, les mots sont répartis uniformément sur la durée de la parole. La durée d'une scène mème est celle du clip ; celle d'une scène narrative est la durée de la parole + 0,08 s + pad.
Écrire une scène
Chaque scène narrative est un fragment HTML (scenes/<nom>.html) et une fonction FX.<id> dans fx.js.
La scène est placée dans <section id="<id>" class="k-<nom>">. Le moteur gère le fondu, le punch-in zoom, l'animation cap, le changement d'image mème et le sous-titrage karaoké ; FX ne dessine que le mouvement propre à la scène.
FX.d = ({ s, el, t, lt, d, punch, word }) => {
// lt : secondes dans la scène, d : durée de la scène, t : secondes de la vidéo
// word('motor', 0.5) : seconde dans la scène où le mot "motor" est prononcé (0.5 si non trouvé)
pop($('mhead'), lt, word('motor'), 0.3); // apparaît en montant
stamp($('tag2'), lt, word('yetme'), 'translateX(-50%)'); // grandit en débordant
type($('cmd'), 'pip install ardupilot-mcp', lt, 0.1, 0.8); // machine à écrire
};
Aides : seg, clamp, lerp, easeOut, easeInOut, back, interp(series, t), pop, stamp, type.
Règle : l'image ne doit dépendre que de t. N'utilise pas setTimeout, Date, de transition CSS ni d'aléatoire ; les images étant capturées une par une, cela provoquerait des tremblements et des sauts.
Mise en page (1080x1920) : les 220 px du haut, 400 px du bas et 150 px de droite sont masqués par l'interface Instagram. Le contenu principal doit se situer entre y 230 et 1300. Les sous-titres sont à y 1350, le cap à y 230. Étale la scène sur tout l'écran ; les petites cartes centrées avec de l'espace autour paraissent bon marché sur mobile. Les textes font au moins 40 px, les chiffres clés 100 px et plus.
Langage visuel (exemple) : fond bleu foncé #0A0F1C, cyan #38BDF8 pour état normal, rouge #F43F5E pour panne, vert #34D399 pour solution, ambre #FBBF24 pour attention/CTA. Icônes Tabler (SVG inline).
Son
- Narration à -17 dBFS RMS, sons des mèmes égalisés à -16. La musique est réduite d'environ 72 % sous la narration et d'environ 88 % sous les mèmes. La vidéo finale est normalisée à -14 LUFS.
- Musique libre de droits, générée par code (phonk 120 BPM : kick, 808, clap, hi-hat, cowbell). Dans la fenêtre
mute, la musique s'arrête ; le silence après l'impact est le coup le plus fort. - Effets :
whoosh(transition de scène ;"at": "cuts"les applique à toutes),fall,boom,hit,click(machine à écrire, compteur),beep,tone,ding,riser,sparkle. Paramètres dansscripts/synth.py. - Ancres temporelles : nombre (seconde absolue) |
"b"(début de scène) |"b.end"|"d@yetme"(mot commençant par "yetme" dans cette scène), toutes pouvant être suivies de+0.1/-0.4. Pour les répétitions :every+countouuntil; pour les balayages commefalletwhoosh, donner uniquementuntilprolonge le son jusqu'à ce moment.
Que ça n'ait pas l'air fait par IA
Une vidéo entièrement synthétique (voix TTS, scènes vectorielles parfaites, chaque effet calé au mot près) donne au spectateur l'impression "c'est fait par IA". Propose ce qui suit à l'utilisateur, applique selon les moyens disponibles :
- Capture d'écran réelle : Au lieu d'imiter l'interface du produit, mets une vraie vidéo d'utilisation dans la scène (
"file"+"mode": "fit"dansclips). Une seule vraie image donne de la crédibilité à toute la vidéo. - Voix humaine : Si l'utilisateur enregistre ses répliques sur son téléphone,
reel.py voice PROJET n1 kayit.m4aremplace le TTS par cet enregistrement, coupe les silences de début/fin et extrait les timings des mots avec Whisper. La partie la plus trahissante du TTS est l'intonation. - Langage parlé : Écris le scénario comme quelqu'un qui raconte à son ami, pas comme un discours corporate : "J'ai ouvert le log", "ça n'a pas suffi".
- Imperfection et rythme : Ne fais pas toutes les scènes de la même longueur. Décale certains effets de 1 à 2 images par rapport au mot, coupe complètement la musique sur une scène. Évite la mise en page parfaitement symétrique.
- Format familier : Une introduction avec le visage ou la voix du compte (1 s "regardez ce qui s'est passé") est plus humaine qu'une série de mèmes.
Leçons tirées des reels précédents
- Ce qui fonctionne : clip mème vertical plein écran avec son original ; courte scène narrative entre les mèmes ; sous-titres mot à mot.
- L'utilisateur a tout de même trouvé ça "fait par IA". Propose au moins un des éléments ci-dessus (capture d'écran réelle ou voix de l'utilisateur) pour le prochain.
- Il n'a pas été souhaité d'ajouter des notes, des avertissements ou des lignes "simulation" à la clôture ou à la description.
- En commençant un nouveau reel, regarde le dernier reel du même compte, ne réutilise pas les mêmes mèmes dans le même ordre.
Fichiers
scripts/reel.py: tout le flux (search, stt, still, clips, tts, voice, build, preview, mix, render [--from], all)scripts/engine.js,scripts/base.css: moteur d'image et styles communsscripts/synth.py: générateurs de musique et d'effetsscripts/capture.js: capture d'image avec Playwrightreferences/tr-memes.md: clips mèmes turcs vérifiés (id, seconde, réplique, recadrage)references/hooks.md: règles et sources des accroches et du temporeferences/pitfalls.md: problèmes d'environnement et solutionsexamples/ardupilot-mcp/: exemple de projet complet