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-ttsverwendet 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
- 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 wieuvxsind für MCP-Konfigurationsdateien; sie sind der breiten Öffentlichkeit fremd. - Schreibe das Drehbuch (siehe Schema unten). Jeder Erklärungssatz 2-7 s, jedes Meme 1-3 s.
- Wähle Memes aus. Suche zuerst im Katalog
references/tr-memes.md(verifizierte Clips mit Replik und Zeitstempel). Für einen neuen Clip suche mitpython3 scripts/reel.py search "erdal bakkal"auf Dailymotion, lade ihn herunter und finde die genaue Sekunde der Replik mitreel.py stt. Miss die Position des Gesichts (cropx) auf dem Rasterbild, das mitreel.py still QUELLE SEKUNDEerstellt wird. - Richte das Projekt ein:
plan.json,style.css,fx.js, ggf.data.jsundscenes/*.html. Das Kopieren und Ändern des Beispiels ist am schnellsten. - Schneide und verifiziere die Clips:
reel.py clips PROJEKT. Für jeden Clip wird der von Whisper gehörte Text neben demquoteausgegeben. Stimmt beides nicht überein, korrigiere die Zeit. - Synchronisiere:
reel.py tts PROJEKT --verify. Wenn Whisper ein Wort falsch hört, spricht auch TTS es falsch aus; schreibe dann densay-Text phonetisch (z. B.ArduPilot em si pi'ye), auf dem Bildschirm erscheint die korrekte Schreibweise mitshow. - Schnitt und Vorschau:
reel.py build PROJEKTdannreel.py preview PROJEKT.build/sheet.pngzeigt 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. - Rendern:
reel.py render PROJEKT --verify→PROJEKT/out/<titel>.mp4. Die Ausgabe zeigt Dauer, integrierte Lautstärke (sollte um -14 LUFS liegen) und Spitzenpegel;--verifylä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. - 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.
- 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 --ataus, um diesen Frame zu betrachten, und dannreel.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. - 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:
| Schlag | Dauer | Was passiert |
|---|---|---|
| Hook | 0-3 s | Beginne 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-Meme | 1-2 s | Verwirrung ("Was ist passiert?"). Direkt nach dem Hook. |
| Problem | 3-6 s | Zeige das Ausmaß des Problems mit einer konkreten Zahl (1.558.457 Zeilen). |
| Reaktions-Memes | 2-5 s | Ein bis zwei Memes zur Absurdität des Problems. Ein Overlay-Text (cap) verbindet das Meme mit dem Thema. |
| Lösung | 3-4 s | Der Moment der Nutzung des Produkts; echte Benutzeroberfläche oder eine originalgetreue Nachbildung. |
| Antwort | 4-7 s | Die eigentliche Erkenntnis, animiert mit Daten. Die längste und "lehrreichste" Szene. |
| Wert | 2-3 s | Kostenlos, Open Source, Installationsbefehl o.ä. |
| Anstoß-Meme | 1-2 s | Meme, das den Zuschauer direkt anspricht ("Worauf wartest du, Behzat?"). |
| Abschluss | 3-5 s | Was 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 inscripts/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.4angehängt werden. Für Wiederholungevery+countoderuntil; bei Sweeps wiefallundwhooshverlängert nuruntilden 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
clipsals"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.m4adiese 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 Stylesscripts/synth.py: Musik- und Effektgeneratorenscripts/capture.js: Frame-Erfassung mit Playwrightreferences/tr-memes.md: verifizierte türkische Meme-Clips (ID, Sekunde, Replik, Zuschnitt)references/hooks.md: Hook- und Temporegeln mit Quellenreferences/pitfalls.md: Umgebungsprobleme und Lösungenexamples/ardupilot-mcp/: vollständiges funktionierendes Beispielprojekt