Communitygithub.com

furkanisikay/meme-reels

Génère des vidéos verticales 1080x1920 (Instagram Reels / TikTok / YouTube Shorts) en combinant des clips mèmes turcs populaires, une narration TTS en turc, des sous-titres mot à mot et des scènes animées basées sur des données.

Qu'est-ce que meme-reels ?

Cette compétence permet de créer automatiquement des vidéos verticales courtes de type Reels/TikTok/Shorts, mêlant humour et information. Elle utilise des clips mèmes célèbres de films ou séries turcs, une narration vocale générée par TTS (edge-tts), des sous-titres synchronisés mot à mot, et des scènes animées vectorielles pour expliquer un produit, une fonctionnalité, un bug ou une histoire. Le moteur de production est déterministe : chaque scène HTML est rendue image par image via Chromium, le son est synthétisé ou mixé avec des fichiers audio réels. La compétence supporte les plateformes de développement d'agents comme Claude Code, Cursor, Codex et Windsurf, et s'intègre parfaitement aux workflows de création de contenu social. Son flux inclut la collecte de faits vérifiés, la rédaction d'un scénario structuré (accroche, réaction, problème, solution, valeur, appel à l'action), le montage des mèmes, la génération TTS, et le rendu final vidéo. Un fichier plan.json centralise tous les paramètres (voix, clips, scènes, musique, effets). L'outil évite délibérément l'aspect « fait par IA » en proposant des vidéos réelles, des voix humaines, et un langage naturel.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/furkanisikay/meme-reels/tree/HEAD/skills/meme-reel

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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-tts utilise 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

  1. 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 comme uvx sont pour les fichiers de configuration MCP ; ils sont étrangers au grand public.
  2. Écris le scénario (voir le modèle ci-dessous). Chaque phrase narrative dure 2 à 7 s, chaque mème 1 à 3 s.
  3. 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 avec python3 scripts/reel.py search "erdal bakkal", télécharge-le, puis trouve la seconde exacte de la réplique avec reel.py stt. Mesure la position du visage dans l'image quadrillée avec reel.py still SOURCE SECONDE (cropx).
  4. Configure le projet : plan.json, style.css, fx.js, si besoin data.js et scenes/*.html. Le plus rapide est de copier et modifier l'exemple.
  5. Coupe et vérifie les clips : reel.py clips PROJET. Pour chaque clip, le texte entendu par Whisper est affiché côte à côte avec quote. S'il y a discordance, corrige le timestamp.
  6. Synthétise la voix : reel.py tts PROJET --verify. Si Whisper entend mal un mot, le TTS le lira aussi mal ; écris le texte say phonétiquement (ex : ArduPilot em si pi'ye), le bon texte s'affiche à l'écran via show.
  7. Montage et prévisualisation : reel.py build PROJET puis reel.py preview PROJET. build/sheet.png montre 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.
  8. 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 ; --verify passe 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.
  9. 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.
  10. 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 --at pour voir cette image, puis lance reel.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.
  11. 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 :

ÉtapeDuréeCe qui se passe
Accroche0-3 sCommence 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éaction1-2 sSurprise ("Quoi ?"). Juste après l'accroche.
Problème3-6 sMontre l'ampleur du problème avec un chiffre concret (1 558 457 lignes).
Mèmes de réaction2-5 sUn ou deux mèmes sur l'absurdité du problème. Un texte superposé (cap) relie le mème au sujet.
Solution3-4 sMoment d'utilisation du produit ; interface réelle ou imitation fidèle.
Réponse4-7 sPrincipal résultat, animé avec des données. La scène la plus longue et la plus "éducative".
Valeur2-3 sGratuit, open source, commande d'installation, etc.
Mème d'incitation1-2 sMème qui interpelle le spectateur ("Qu'est-ce que tu attends, Behzat ?").
Clôture3-5 sQue 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 dans scripts/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 + count ou until ; pour les balayages comme fall et whoosh, donner uniquement until prolonge 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" dans clips). 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.m4a remplace 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 communs
  • scripts/synth.py : générateurs de musique et d'effets
  • scripts/capture.js : capture d'image avec Playwright
  • references/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 tempo
  • references/pitfalls.md : problèmes d'environnement et solutions
  • examples/ardupilot-mcp/ : exemple de projet complet

Skills associés