Communitygithub.com

meme-reels

Erstellt vertikale Instagram Reels / TikTok / YouTube Shorts (MP4) aus bekannten türkischen Meme-Clips (mit Originalton), türkischem TTS-Kommentar, Wort-für-Wort-Untertiteln und datengesteuerten Animationsszenen.

Was ist meme-reels?

Diese AI-Agent-Fähigkeit (Skill) generiert automatisch vertikale Social-Media-Videos (1080x1920 MP4) für türkische Zielgruppen. Sie kombiniert bekannte Meme-Clips aus türkischen Filmen und Serien (über Dailymotion) mit einem synthetischen TTS-Kommentar (edge-tts), animierten HTML-Szenen und Wort-für-Wort-Transkripten. Der Prozess gliedert sich in Faktencheck, Drehbuchschreiben (nach einem bewährten Schema mit Hook, Memes, Erklärung, Lösung), Projektaufbau und Rendering. Die Engine ist deterministisch: HTML-Szenen werden Frame für Frame in Chromium gerendert, Audio wird mit numpy synthetisiert und gemischt. Der Skill vermeidet explizite KI-Warnungen, bietet aber Optionen für echten Bildschirm-Mitschnitt und menschliche Sprachaufnahmen, um den KI-Charakter zu kaschieren. Plattformen: Claude Code, Cursor, Codex und ähnliche Agenten.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Meme reel

Dieser Skill verwandelt ein Thema in ein vertikales Video, das selbst der uninformierteste Zuschauer versteht. Der Zuschauer lacht mit bekannten türkischen Serien-/Film-Momenten und lernt das Thema durch animierte Szenen und den Kommentar. Die Engine ist deterministisch: HTML-Szenen werden Frame für Frame in Chromium gezeichnet, Audio wird mit numpy synthetisiert und gemischt.

Fertiges Beispiel: examples/ardupilot-mcp/ (36 s, 4 Memes, 6 Erklärungsszenen). Bevor du ein neues Reel beginnst, lies seine plan.json, fx.js und scenes/-Dateien; dort siehst du alle Funktionen in Aktion.

Einschränkungen

  • Nichts veröffentlichen. Gib das Video dem Benutzer als Datei. Entwürfe für Buffer oder andere Plattformen nur, wenn der Benutzer sie ausdrücklich genehmigt. Veröffentlichungsschritte sind im Skill buffer-sosyal-icerik.
  • Jede Zahl und Behauptung auf dem Bildschirm muss verifiziert sein. Zeige Protokoll, Messung, Tool-Ausgabe oder eine vom Benutzer angegebene Quelle an. Füge keine unbelegten Behauptungen ("hat es in einer Minute gelöst") in das Video ein.
  • Keinen Haftungsausschluss einfügen. Selbst wenn du Simulations- oder Demodaten verwendest, füge weder ins Video noch in die Beschreibung einen "Hinweis:"- oder Fairness-Hinweis ein, es sei denn, der Benutzer bittet ausdrücklich darum. Schreibe auch keinen Hook wie "ein Experiment im Simulator" in den ersten Frame.
  • Urheberrecht: Serien-/Film-Clips sind urheberrechtlich geschützt. Frage zuerst, ob der Benutzer das Risiko akzeptiert. Entferne keine Quellenlogos (z. B. TRT 1); entferne Werbewasserzeichen von Drittanbietern wie Wettseiten durch Zuschneiden.
  • TTS-Lizenz: edge-tts verwendet den kostenlosen Edge-Vorlesedienst; die kommerzielle Nutzung liegt in einer Grauzone. Für kommerzielle Veröffentlichungen sind dieselben Stimmen in Azure Speech lizenziert, oder es kann die eigene Stimme des Benutzers verwendet werden.

Teilen-Text

Wenn der Benutzer eine Beschreibung (Caption) wünscht:

  • Wiederhole nicht die Sätze aus dem Video. Die Beschreibung erklärt, was das Video nicht erklärt: was das Produkt ist, wem es nützt, wo es zu finden ist.
  • Schreibe so, wie man einem Freund schreibt, auf alltäglichem Türkisch. Am Ende eine einzige Frage, die zum Kommentieren einlädt.
  • Füge keinen "Hinweis:"- oder Fairness-Hinweis ein. Erläuterungen zu Simulation, Demodaten, KI-Nutzung usw. gehören nicht in den Beschreibungstext. Wenn ein KI-Etikett erforderlich ist, wird es über die plattformeigene Einstellung gesetzt.
  • Links in Instagram-Beschreibungen sind nicht klickbar. Wenn du im Video oder Text "Link im Profil" sagst, lass dir vom Benutzer bestätigen, dass der Link tatsächlich im Profil ist; keine API kann die Bio ändern. Schreibe den Link direkt in die YouTube-Beschreibung.

Installation

bash scripts/setup.sh        # pip: edge-tts faster-whisper numpy scipy yt-dlp; ffmpeg & Playwright-Prüfung

Bekannte Umgebungsprobleme (Proxy/TLS, YouTube-Bot-Erkennung, fehlender H.264-Codec in Chromium, Whisper & PyAV) und deren Lösungen findest du in references/pitfalls.md. Sieh dort nach, wenn du nicht weiterkommst.

Ablauf

  1. Sammle Fakten. Extrahiere die Behauptung des Videos aus der Quelle: Tool-Ausgabe, Protokoll, Messung. Notiere Zahlen und Zeiten; die Szenen werden diese Werte verwenden. Wenn ein Installationsbefehl gezeigt wird, überprüfe, ob das Paket tatsächlich im Repository (PyPI, npm) existiert, und schreibe den Befehl, den der Zuschauer kennt: pip install paket, npm i paket. Tools wie uvx sind für MCP-Konfigurationsdateien; sie sind der breiten Öffentlichkeit fremd.
  2. Schreibe das Drehbuch (siehe Schema unten). Jeder Erklärungssatz 2-7 s, jedes Meme 1-3 s.
  3. Wähle Memes aus. Suche zuerst im Katalog references/tr-memes.md (verifizierte Clips mit Replik und Zeitstempel). Für einen neuen Clip suche mit python3 scripts/reel.py search "erdal bakkal" auf Dailymotion, lade ihn herunter und finde die genaue Sekunde der Replik mit reel.py stt. Miss die Position des Gesichts (cropx) auf dem Rasterbild, das mit reel.py still QUELLE SEKUNDE erstellt wird.
  4. Richte das Projekt ein: plan.json, style.css, fx.js, ggf. data.js und scenes/*.html. Das Kopieren und Ändern des Beispiels ist am schnellsten.
  5. Schneide und verifiziere die Clips: reel.py clips PROJEKT. Für jeden Clip wird der von Whisper gehörte Text neben dem quote ausgegeben. Stimmt beides nicht überein, korrigiere die Zeit.
  6. Synchronisiere: reel.py tts PROJEKT --verify. Wenn Whisper ein Wort falsch hört, spricht auch TTS es falsch aus; schreibe dann den say-Text phonetisch (z. B. ArduPilot em si pi'ye), auf dem Bildschirm erscheint die korrekte Schreibweise mit show.
  7. Schnitt und Vorschau: reel.py build PROJEKT dann reel.py preview PROJEKT. build/sheet.png zeigt 3 Frames pro Szene. Öffne das Sheet und prüfe auf: überlaufende oder überlappende Elemente, in die Sicherheitszone ragende Texte, leere Bildschirme, unlesbare Untertitel. Korrigiere und wiederhole.
  8. Rendern: reel.py render PROJEKT --verify → PROJEKT/out/<titel>.mp4. Die Ausgabe zeigt Dauer, integrierte Lautstärke (sollte um -14 LUFS liegen) und Spitzenpegel; --verify lässt das gesamte Video von Whisper transkribieren. Wenn alle Erklärungen und Meme-Repliken korrekt zu hören sind, überdeckt die Musik die Sprache nicht.
  9. Sende das Video an den Benutzer. Schreibe kurz, welche Clips du aus welcher Quelle verwendet hast, welche Risiken sie mit sich bringen (Urheberrecht, TTS-Lizenz, niedrig aufgelöste Quelle) und welche Schnittentscheidungen du getroffen hast.
  10. Korrekturrunde. Wenn der Benutzer Text oder Grafiken in einer Szene ändern möchte, korrigiere ohne Änderung des Erklärungstextes und der Szenenzeiten, führe build + preview --at aus, um diesen Frame zu betrachten, und dann reel.py render PROJEKT --from <Startsekunde der Szene>. Vorherige Frames bleiben erhalten, nur der Teil ab diesem Punkt wird neu gezeichnet. Wenn sich der Erklärungstext ändert, verschieben sich die Zeiten; dann ist eine vollständige Neuberechnung erforderlich.
  11. Veröffentlichung. Sagt der Benutzer "lass uns teilen", wechsle zum Skill buffer-sosyal-icerik: Das Video wird dort mit dem Hosting-Schritt hochgeladen, Reel, Shorts und Story verwenden dieselbe Datei. Der Link-Sticker in der Story wird nicht automatisch veröffentlicht; siehe dort den Story-Abschnitt.

Drehbuch-Schema

Hook-Regeln und Begründungen findest du in references/hooks.md. Kurzfassung:

SchlagDauerWas passiert
Hook0-3 sBeginne mitten im Geschehen (fallende Drohne, roter Fehler). Im ersten Frame sei bereits ein Satz mit 4-7 Wörtern sichtbar; auch Zuschauer ohne Ton verstehen ihn.
Reaktions-Meme1-2 sVerwirrung ("Was ist passiert?"). Direkt nach dem Hook.
Problem3-6 sZeige das Ausmaß des Problems mit einer konkreten Zahl (1.558.457 Zeilen).
Reaktions-Memes2-5 sEin bis zwei Memes zur Absurdität des Problems. Ein Overlay-Text (cap) verbindet das Meme mit dem Thema.
Lösung3-4 sDer Moment der Nutzung des Produkts; echte Benutzeroberfläche oder eine originalgetreue Nachbildung.
Antwort4-7 sDie eigentliche Erkenntnis, animiert mit Daten. Die längste und "lehrreichste" Szene.
Wert2-3 sKostenlos, Open Source, Installationsbefehl o.ä.
Anstoß-Meme1-2 sMeme, das den Zuschauer direkt anspricht ("Worauf wartest du, Behzat?").
Abschluss3-5 sWas tun + "Link im Profil"-Text.

Gesamt 25-36 s. Wenn es 30 s überschreitet, schlage vor, den längsten Erklärungssatz zu kürzen.

plan.json

{
  "title": "<Thema> - Reels <name>",            // Name der Ausgabedatei
  "voice": "tr-TR-EmelNeural", "rate": "+6%", // tr-TR-AhmetNeural liefert in diesem Dienst keine Stimme
  "clips": {                                   // Meme-Quellen
    "neoldu": {"dm": "x587xuk", "start": 37.80, "dur": 1.06, "cropx": 135, "quote": "— Ne oldu?"}
    // Quelle: "dm" (Dailymotion-ID) | "url" (yt-dlp) | "file" (lokal). mode: "face" (4:5 Gesichtszuschnitt, Standard) | "fit" (Weitwinkel)
  },
  "lines": {                                   // Erklärung; "show" ist die auf dem Bildschirm sichtbare Version (optional)
    "n1": {"say": "Dronum yirmi metreden düştü.", "show": "Drone'um 20 metreden düştü."}
  },
  "scenes": [                                  // Werden nacheinander abgespielt; Dauern werden aus dem Ton berechnet
    {"id": "a", "line": "n1", "html": "scenes/crash.html", "pad": 0.25, "cap": "optionaler Overlay-Text"},
    {"id": "m1", "clip": "neoldu", "cap": "optionaler Overlay-Text"}
  ],
  "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}]
}

Wenn die Wortanzahl von show mit der von say übereinstimmt, erhält jedes Wort seine eigene Zeit, andernfalls werden die Wörter gleichmäßig über die Sprechdauer verteilt. Die Dauer einer Meme-Szene ist die Dauer des Clips; die einer Erklärungsszene ist die Dauer des Tons + 0,08 s + pad.

Szenen schreiben

Jede Erklärungsszene besteht aus einem HTML-Fragment (scenes/<name>.html) und einer FX.<id>-Funktion in fx.js. Die Szene wird in <section id="<id>" class="k-<name>"> eingefügt. Die Engine übernimmt Schnitt, Punch-In-Zoom, cap-Animation, Meme-Frame-Wechsel und Karaoke-Untertitel; FX zeichnet nur die szenenspezifische Bewegung.

FX.d = ({ s, el, t, lt, d, punch, word }) => {
  // lt: Sekunde innerhalb der Szene, d: Szenendauer, t: Videosekunde
  // word('motor', 0.5): die Szenensekunde, in der "motor" gesprochen wird (falls nicht gefunden, 0.5)
  pop($('mhead'), lt, word('motor'), 0.3);           // erscheint aufsteigend
  stamp($('tag2'), lt, word('yetme'), 'translateX(-50%)'); // wächst überlappend
  type($('cmd'), 'pip install ardupilot-mcp', lt, 0.1, 0.8); // Schreibmaschine
};

Helfer: seg, clamp, lerp, easeOut, easeInOut, back, interp(serie, t), pop, stamp, type. Regel: Ein Frame darf nur von t abhängen. Verwende kein setTimeout, Date, CSS-Transition und keine Zufälligkeit; da Frames einzeln aufgenommen werden, führen sie zu Flackern und Sprüngen.

Layout (1080x1920): Die oberen 220 px, die unteren 400 px und die rechten 150 px werden von der Instagram-Oberfläche verdeckt. Der eigentliche Inhalt sollte zwischen y 230 und 1300 liegen. Untertitel bei y 1350, cap bei y 230. Verteile die Szene über den Bildschirm; kleine Karten in der Mitte wirken auf dem Telefon billig. Schriftarten mindestens 40 px, Schlüsselzahlen 100 px und mehr.

Visuelle Sprache (im Beispiel): Dunkelmarineblau #0A0F1C, Cyan #38BDF8 für Normalzustand, Rot #F43F5E für Fehler, Grün #34D399 für Lösung, Amber #FBBF24 für Aufmerksamkeit/CTA. Icons von Tabler (Inline-SVG).

Audio

  • Erklärung -17 dBFS RMS, Meme-Audio wird auf -16 angeglichen. Musik wird unter Erklärung auf ~72 %, unter Memes auf ~88 % reduziert. Finales Video wird auf -14 LUFS normalisiert.
  • Musik wird lizenzfrei aus Code generiert (120 BPM Phonk: Kick, 808, Clap, Hi-Hat, Cowbell). Im mute-Fenster ist die Musik stumm; die Stille nach einem Schlag ist der stärkste Beat.
  • Effekte: whoosh (Szenenübergang; "at": "cuts" setzt ihn auf alle), fall, boom, hit, click (Schreibmaschine, Zähler), beep, tone, ding, riser, sparkle. Parameter in scripts/synth.py.
  • Zeitanker: Zahl (absolute Sekunde) | "b" (Szenenbeginn) | "b.end" | "d@yetme" (das mit "yetme" beginnende Wort in dieser Szene), allen kann +0.1 / -0.4 angehängt werden. Für Wiederholung every + count oder until; bei Sweeps wie fall und whoosh verlängert nur until den Ton bis zu diesem Zeitpunkt.

Sieh nicht aus wie KI

Ein völlig synthetisches Video (TTS-Stimme, makellose Vektorszenen, jedes Effekt-Timing perfekt auf das Wort abgestimmt) vermittelt dem Zuschauer das Gefühl "das hat KI gemacht". Empfehle dem Benutzer Folgendes und wende es nach Möglichkeit an:

  • Echter Bildschirm-Mitschnitt: Statt die Produktoberfläche nachzubilden, verwende eine Aufnahme der tatsächlichen Nutzung als Szene (in clips als "file" + "mode": "fit"). Schon ein einziges echtes Bild verleiht dem gesamten Video Glaubwürdigkeit.
  • Menschliche Stimme: Wenn der Benutzer seine Zeilen selbst aufs Telefon spricht, ersetzt reel.py voice PROJEKT n1 kayit.m4a diese Aufnahme gegen TTS, schneidet Stille am Anfang/Ende weg und extrahiert die Wortzeiten mit Whisper. Der verräterischste Teil von TTS ist die Intonation.
  • Gesprochene Sprache: Schreibe das Drehbuch nicht förmlich, sondern wie jemand, der es einem Freund erzählt: "Ich hab das Log geöffnet", "hat nicht gereicht".
  • Fehler und Rhythmus: Mach nicht jede Szene gleich lang. Verschiebe einige Effekte um 1-2 Frames vom Wort, schneide die Musik in einer Szene komplett ab. Vermeide eine gleichmäßig symmetrische Anordnung.
  • Vertrautes Format: Ein Intro mit dem eigenen Gesicht oder der eigenen Stimme des Accounts (1 s "guck mal, was passiert ist") wirkt menschlicher als eine Meme-Serie.

Lehren aus früheren Reels

  • Was funktioniert hat: Vollbild vertikaler Meme-Clip mit eigenem Ton; dazwischen kurze Erklärungsszene; Wort-für-Wort-Untertitel.
  • Der Benutzer fand es trotzdem "wie KI". Biete beim nächsten Mal mindestens einen der obigen Punkte an (echter Bildschirm-Mitschnitt oder eigene Stimme des Benutzers).
  • Es wurde nicht gewünscht, Hinweise, Warnungen oder einen "Es ist eine Simulation"-Text in den Abschluss oder die Beschreibung einzufügen.
  • Wenn du ein neues Reel beginnst, sieh dir das letzte Reel desselben Accounts an und verwende nicht dieselben Memes in derselben Reihenfolge erneut.

Dateien

  • scripts/reel.py: der gesamte Ablauf (search, stt, still, clips, tts, voice, build, preview, mix, render [--from], all)
  • scripts/engine.js, scripts/base.css: Frame-Engine und gemeinsame Styles
  • scripts/synth.py: Musik- und Effektgeneratoren
  • scripts/capture.js: Frame-Erfassung mit Playwright
  • references/tr-memes.md: verifizierte türkische Meme-Clips (ID, Sekunde, Replik, Zuschnitt)
  • references/hooks.md: Hook- und Temporegeln mit Quellen
  • references/pitfalls.md: Umgebungsprobleme und Lösungen
  • examples/ardupilot-mcp/: vollständiges funktionierendes Beispielprojekt

Verwandte Skills