Yap Video Editor
Roh-Talking-Head-Aufnahmen in ein knappes, gestaltetes Kurzvideo verwandeln. Alles läuft lokal mit ffmpeg + lokalem Whisper; kein API-Key erforderlich (ElevenLabs Scribe ist ein optionaler, besserer Transkribierer).
Synthetisiert aus einer sicherheitsgeprüften Lektüre von: browser-use/video-use, adukhan98/video-edit, chrislema/videoeditor, zyziyun/video-studio, eyadhussain00-hub/Videoediting (nur Ideen), AgriciDaniel/claude-shorts, Barty-Bart/motion-graphics, ZiadAbdelkarim/beat-synced-edit, 6missedcalls/video-editing-skill, haidrrrry/claude-remotion-skill, digitalsamba/claude-code-video-toolkit, blixvip/easyedit (nur Ideen).
Genaue Zahlen befinden sich in references/params.md. Vor dem Erstellen von Filtergraphen lesen. references/pipeline.md ist das kampferprobte Implementierungsmuster aus echten Edits (Schnittplaner, L-Cut-Renderer, Pillow-Overlay, Sticker/Props, 4K-Master): diesem folgen, anstatt etwas neu zu erfinden.
Harte Regeln
- Zuerst planen, dann warten. Nach der Transkription einen einfachen Plan in Klartext zeigen (Hook, was geschnitten wird, Zoom/Untertitel/SFX-Ansatz, Länge, Format) und vor dem Rendern ein „Ja“ einholen. Geschmacksentscheidungen (Hook-Zeile, welche Sätze bleiben, Untertitel-Stil) werden als kurzes Menü mit einer Empfehlung angeboten, niemals automatisch gewählt.
- Nie die Quelle überschreiben. In
<ordner>/edit/schreiben. Zwischenschritte behalten, bis der Benutzer zustimmt, dann Bereinigung anbieten (zuerst Dateien + Größen auflisten; niemals automatisch löschen). - Nie innerhalb eines Wortes schneiden. Kanten aus der Audio-Hüllkurve finden, nicht aus Whispers Wortzeiten (Whisper markiert Starts zu spät und Enden zu früh, was die erste/letzte Silbe abschneidet): vom Wortstart bis zu 0,25 s zurückgehen und vom Wortende bis zu 0,20 s vorwärtsgehen, während die Sprach-Energie über Rauschen + 8 dB bleibt, dann 30 ms auffüllen. 15-30 ms Audio-Fade an jeder Verbindung.
- Schnitte neu kodieren, nie
-c copyfür frame-genaue Dinge (Kopie landet auf Keyframes und verursacht Störungen). - Untertitel zuletzt, nach Zooms und Overlays, damit Zooms sie nie abschneiden.
- Beweisen. Rendern, dann inspizieren: Frames an jedem Schnitt +/-1,5 s, Kontaktbogen,
ebur128-Lautstärke-Ausgabe. Maximal 3 Reparatur-Durchgänge, dann berichten, was übrig bleibt. Zahlen berichten; das Audio kann nicht gehört werden. - Drittanbieter-Medien: nur benutzereigene, CC0/CC-BY oder generierte. Kein Rippen von Filmen/Musik von YouTube. Niemals Claude/Anthropic-Login-Tokens oder andere Anmeldedaten lesen, senden oder wiederverwenden; niemals
.claude/-Hook-Konfigurationen anderer Repos kopieren. - Vor dem Herunterladen fragen von Modellen (whisper ggml-medium ist ~1,5 GB) oder der Installation von Paketen. Name, Quelle, Größe angeben.
Pipeline
0. Erfassung und Briefing
ffprobefür jeden Clip: Auflösung, fps, Dauer, Audio. Ausrichtung erkennen.- Nur das Nötigste fragen (kurzes Menü): Zielplattform/Seitenverhältnis, Ziellänge, Vibe (siehe Vibes), Untertitel-Stil, Musik Ja/Nein, etwaige Muss-bleiben-Zeilen. Wenn der Benutzer „mach einfach“ sagt, Standardwerte: 9:16, 30-60 s, „Creator“-Vibe, fette Untertitel, leichte SFX, keine Musik.
1. Transkribieren (Wort-genau, wörtlich)
- Bevorzugt: mlx-whisper (Apple Silicon) oder faster-whisper
medium.en/distil-large-v3, Wort-Zeitstempel aktiviert. Medium verwenden, nicht small: small lässt Fehlstarts aus. Optional: ElevenLabs Scribe, wenn der Benutzer einen Schlüssel hat (Schlüssel niemals in das Projektverzeichnis schreiben). - Füller im Transkript behalten (wörtlich), damit sie geschnitten werden können. Transkript zwischenspeichern.
- Whisper-Eigenheiten: Lange Pausen werden in einem Wort verschluckt (ein Wort, das Sekunden dauert, ist eine verschluckte Pause; eine RMS-Hüllkurve für echte Sprach-Spannen verwenden), Wörter beginnen 0,2–0,4 s zu spät nach einer Pause und halluzinieren auf stummen Enden. Am Ende des echten Inhalts trimmen. Für Untertitel-Timing pro finalem Segment neu transkribieren.
- Namen/Begriffe Korrektur lesen; eine Korrekturliste anwenden (
chat gpt->ChatGPT).
2. Die Geschichte auswählen (bei langen Yaps)
- Kandidaten-Segmente 0–100 bewerten:
Hook*0,30 + Kohärenz*0,25 + Emotion*0,20 + Wert*0,15 + Auszahlung*0,10. Starke Hooks: kühne/ konträre Behauptung, Neugier-Lücke, konkrete Zahl, Musterbruch. Schwach: „Also heute möchte ich über... sprechen“. Unabhängigkeitstest: kein „wie ich bereits sagte“, keine verweisenden Pronomen. - 15–55 s pro Segment (Sweet Spot 25–40), Punktzahl >= 60, Start an einen Wort-/Satzanfang rasten (1,5 s Fenster) und Ende an ein Satzende (3 s Fenster) + 300 ms Auffüllung.
- Hook wird ZULETZT geschrieben/ausgewählt: ~5-12 nummerierte Kandidaten-Eröffnungen mit Text, Typ und Länge anbieten. Ergebnis-erster oder kühne-Behauptung-Kaltstart schlägt eine langsame Einleitung. Die ersten 1-3 s entscheiden alles.
- Bei Ein-Take-Yaps: Nur umstellen, wenn es den Hook verbessert; sonst die Reihenfolge des Sprechers beibehalten.
3. Schneiden (straffen)
Straffheits-Profile (Pausen-Stauchung; Pausen werden verkürzt, nicht gelöscht):
| Profil | Pausen über | Behalten |
|---|---|---|
| sanft | 0,80 s | 0,35-0,70 s |
| Standard | 0,45 s | 0,18-0,40 s (0,30 nach Satzende) |
| straff (Standard für Yap) | 0,25 s | 0,08-0,20 s |
- Erkennung: RMS-Hüllkurve in 10 ms Schritten, Sprache = Rauschen + 8 dB. Fallback:
silencedetect=noise=-30dB:d=0,5. - Entfernen: Ähms/Ähs, Stottern und Neustarts, wiederholte Wörter, Fehlstarts, Wiederholungen (früherer Durchgang fliegt raus), Klappe/Ende, Räusperer („Also,“, „Im Grunde“). Semantische Füller („sozusagen“, „weißt du“) nur, wenn das Audio sie isoliert. Absichtliche Wiederholung zur Betonung behalten.
- Wenig vertrauenswürdige oder mehrdeutige Schnitte (Wiederholungen, verschmolzene Füller, ASR-Rauschen) werden mit dem Benutzer bestätigt, nicht automatisch angewendet.
- Jede Verbindung überprüfen: ein Fenster über jede Verbindung hinweg neu transkribieren; es muss die beabsichtigten Wörter ergeben. 2-3 Runden erwarten. Nach dem vollständigen Schnitt die Inhaltswörter mit dem Plan abgleichen; fehlschlagen, wenn welche verloren gehen.
- Visuelle Prüfung: Schnittkanten vermeiden, bei denen der Sprecher auf Notizen blickt oder mitten im Blinzeln/Kopfbewegung ist; auf Kopfbewegungskanten mit <=30 ms beenden.
- Frame-genaue Stücke: jedes Stück auf ganze Frames quantisieren (
n = round(dur*fps)) und die Ausgabe-Zeitleiste daraus planen, sonst driften Untertitel (~1 s über 40 Schnitte). - L-Cuts: Bild und Ton getrennt rendern. Bei jeder neuen Zeile (nicht inneren Pausen-Stauchungen) liegt der Bildschnitt 2 Frames nach dem Tonschnitt; innere Stauchungen bleiben harte Schnitte. Glättet Jump Cuts ohne sichtbaren Lippensynchronfehler.
- Auf Notizen hinunterblicken: in Abschnitten, in denen der Sprecher zwischen Phrasen nach unten blickt, härter straffen (Pausen über 0,10 s, je 0,03 s pro Seite behalten). Unterwärtsblicke während des Sprechens können nicht geschnitten werden; mit einem Zoom-In oder einem Sticker/B-Roll verstecken.
- Die menschlichen Momente behalten, die der Benutzer wünscht (ein Lachen, eine Reaktion) als geschützte Bereiche mit rohen Kanten; auf genaue Sekunden kürzen, wenn gewünscht („0:09-0:11 schneiden“).
- Tempo: alle 1,5-4 s ein neues visuelles Ereignis (Zoom, Untertitel-Betonung, Grafik, B-Roll); kein Standbild länger als ~8 s. Optional Beschleunigung 1,1-1,25x auf den Körper (niemals über ~1,3x, klingt unecht; Hook bis zu 1,5x ist die Obergrenze).
4. Zoom (gesichtsgesteuert)
- Das Gesicht verfolgen: OpenCV Haar (
opencv-python-headless<5) oder MediaPipe; alle 0,5 s pro Abschnitt sampeln, den Median nehmen, Detektionen unter 0,6x Medianbreite verwerfen, Totband 2 % der Frame-Breite, niemals innerhalb eines Abschnitts schwenken. Wenn ein Abschnitt weniger als 2 Treffer hat, von einem Nachbarn ausleihen. - Zoom-Leiter pro Abschnitt (3-6 s pro Abschnitt): normal 1,0x, Betonung ~1,15-1,25x, kritisch ~1,3-1,6x (Querformat). Für 9:16 aus 16:9 feste Höhenbrüche 1,0 / 0,92 / 0,85 verwenden (enger wirkt unangenehm).
- Nach Dauer mischen: ~60 % normal / 30 % Betonung / 10 % kritisch. Erster Abschnitt normal. Nie mehr als 2 aufeinanderfolgende Abschnitte auf demselben Level. Betonungs-Zoom höchstens 1 von 4 Sätzen.
- Stil-Auswahl (fragen oder aus Vibe ableiten):
- Hard-Cut-Nahaufnahmen (Standard für Jump-Cut-Yaps): 1,0x und 1,15x über Jump-Cut-Segmente hinweg abwechseln, auf dem Hook gezoomt beginnen, Betonungssätze bei ~1,3x.
- Sanfter Push-In bei Aufbauten:
scale=w='iw*z(t)':h='ih*z(t)':eval=framedann feste Größecrop, kubische Ausblendung (1-(1-t)^3), 0,4-0,5 s hinein. Zuerst an einem 2 s Clip testen; zoompan ist ruckelig. - Punch-and-Stay (1,16x, 0,5 s) 1-2 mal pro Video auf den Pointen.
- Vertikale Rahmung: Gesicht bei ~30 % vom Crop-Oberrand;
cy = min(face_cy - 0.3*ch, head_top - 0.03*ch). - Optionale Hiteffekte nur auf Spitzen: Schütteln, 2-Frame-Weißblitz, RGB-Split, Geschwindigkeitsrampe (siehe Parameter).
5. Untertitel (animiert, Wort-Ebene)
- libass
.assaus Wort-Zeitstempeln generieren (nur statische Schriftinstanzen; variable Schriften hängen libass auf). Pro Segment neu transkribieren für genaues Timing. - Standard: 1-3 Wörter pro Stichwort (<=18 Zeichen), bei Satzzeichen und Pausen >=0,3 s brechen, min Stichwort 0,35 s (auf 3 Wörter wachsen anstatt zu blinken), 0,12 s nach letztem Wort halten. Schrift ~4,6 % der 1920-Canvas-Höhe (~88 px), ExtraBold, dicker Umriss oder weicher Schatten.
- Looks (3 auf einem echten Frame als Raster rendern und vom Benutzer auswählen lassen):
- Fett: Montserrat 800, GROSSBUCHSTABEN, weiß, aktives Wort gelb
#FFD700, 3 px schwarzer Umriss, Feder-Pop-In. - Bounce: Display-Schrift, 1-2 Wörter, rotierende Akzentfarben, Überschwingen 0,7 -> 1,2 -> 1,0.
- Clean: Inter 700, natürliche Groß-/Kleinschreibung, 3-5 Wörter, weicher Fade.
- Hormozi-lite (Fallback): weiß mit schwarzem Umriss, zentriert.
- Fett: Montserrat 800, GROSSBUCHSTABEN, weiß, aktives Wort gelb
- Betonung: ~1 Schlüsselwort in 4 Wörtern erhält Farbe/Skalierung 112 %; Zahlen/Geld automatisch farbig (z. B.
#3CE07A); ein Schlüsselwort pro Untertitelgruppe erhält 2-4x Größenbehandlung im „designten“ Vibe. Pop auf gesprochenem Wort: Skalierung 108-112 %, in ~110 ms zurückgenommen. - Platzierung: Plattform-Sicherheitszonen respektieren (universeller 9:16-Safe-Bereich x60-940, y285-1480). Reels-Untertitel y~1360, TikTok ~1400, Shorts ~1440. Niemals über dem Mund/Kinn. Zeilen nie mehr als 4 Wörter, ausbalancierte Stapelung.
- Keine komprimierten Display-Schriften als Standard für Körper-Untertitel (wirkt beengt).
Creator-Typ-System (an echten Edits bewährt; Benutzer sagte „echter Content-Creator-Scheiß, aber sauber“):
- Körper: Gotham Narrow Black (oder Montserrat 800), GROSSBUCHSTABEN, weiß, ~70 px bei 1080 w, dunkler Strich + weicher, verschwommener Schlagschatten. Wörter erscheinen, während sie gesprochen werden; nur das neueste Wort ist aktiv (gelb + 112% Pop, der über 3 Frames zurückgenommen wird). Niemals zwei hervorgehobene Wörter gleichzeitig.
- Keine Satzzeichen in Untertiteln (Apostrophe und zensierte Schimpfwörter wie
sh*t,f***ingbehalten). - Schlüsselwörter (Produkt, Namen, Zahlen, das Thema): komprimiert Ultra (Gotham XNarrow Ultra), 1,5x, gelb, inline auf der Grundlinie.
- Schrift-Akzent (SignPainter / eine Pinselschrift), creme, ~6 Grad geneigt, für maximal 4-6 emotionale Wörter pro Video.
- Große Beats (Pointe, These, Produkt-Enthüllung): komprimiert Ultra Slam 1,28 -> 1,0 über 4 Frames, Wort für Wort, 200-250 px, unterhalb des Mundes (prüfen, ob der Punch-In-Zoom das Gesicht nach unten verschiebt).
- Moment-Karten: Text, den der Sprecher nicht gesagt hat, den der Moment aber verdient (z. B. „lacht in reich“ in Schrift über einem Lachen).
- Reihen-/Titelaufbau: Jede Titelzeile erscheint mit ihrem gesprochenen Wort (komprimierte Display-Zeile / Schrift-Zeile / Markenfarb-Zeile / nachgeführte Kapitälchen), unterhalb des Kinns platziert, niemals über dem Mund.
- Schimpfwörter in Untertiteln nur auf Wunsch zensieren; Audio bleibt wie aufgenommen.
- Vor dem Hinzufügen dauerhafter Labels (Tageszähler, Serien-Tags) fragen; Ersteller bevorzugen sie oft ausgeschaltet.
5b. Requisiten, Aufkleber und Ausschnitte (optional, hohe Wirkung)
- Echte Personen-/Marken-Referenzen (z. B. „Bruce Wayne“, „Alfred“, ein Auto): EINMAL bei erster Erwähnung als weiß umrandeter Aufkleber-Ausschnitt zeigen (alpha MaxFilter ~19 px unter dem Ausschnitt), mit Überschwingen einblenden (0 -> 1,12 -> 1,0 in 0,22 s), sanftes Wackeln (+/-2,5 deg), ~1,9 s, ausblenden; oben links/rechts neben dem Kopf platzieren, niemals über dem Gesicht. Paaren mit einem SFX (Whoosh oder ein thematisches: Service-Klingel-Klingeln für einen Butler).
- Objekte können sich bewegen: z. B. ein Auto-Ausschnitt, der auf seinem gesprochenen Wort über den unteren Rand fährt (Smoothstep über ~2 s, kleiner Sprung, 2 Geschwindigkeits-Geist-Kopien bei 18 %/32 % Alpha), mit einem Motor-Vorbeifahrt-SFX.
- Quellen: zuerst Benutzer-Assets; für echte Personen offen lizenzierte Fotos verwenden (Wikimedia Commons CC BY / CC BY-SA / PD) und dem Benutzer die Credit-Zeile nennen; Hintergründe mit einem verfügbaren Tool (z. B. einer Hintergrundentfernungs-API oder rembg) nach Absprache entfernen. Nur für den persönlichen/sozialen Gebrauch, es sei denn, der Benutzer klärt die Rechte.
6. Sounddesign
Reihenfolge der Arbeit: zuerst Musik (falls vorhanden), dann Bild, zuletzt SFX.
- Cues: Whoosh bei Layout-/Szenenwechseln und großen Kamerafahrten (2 Frames früher beginnen; beginnen nach Angriffszeit vor dem Kontakt-Frame); Pop bei Grafik-/Wort-Pop-Eingabe; Impact/Sub-Drop EINMAL auf dem Hook oder der Enthüllung; Riser, der auf dem nächsten Hit ENDET; Tick/Flick sparsam auf Highlights; Tippen = Tasten.
- Zurückhaltung (am wichtigsten): SFX markieren Wechsel, nicht jedes Wort. Nichts auf Füller. Etwa 8 in 18 s wirkt designed; etwa 20 wirkt generisch. Dichte-Kappe: 2 pro 2 s Fenster für Talking-Head. Gleiches SFX innerhalb von 1,5 s wechselt Variante und reduziert sich um 1,5 dB pro Wiederholung. Intensitäts-Leiter: lockerer Yap = spärlich; Hype-Reel = Sound auf den meisten Beats; Corporate = fast keins.
- Quellen: Benutzerbibliothek oder generieren (ElevenLabs sound-effects/generated pack) oder synthetischer Kit-Ansatz (Whoosh/Pop/Tick/Impact/Riser mit numpy/ffmpeg gebaut; keine Downloads). Platzieren per transientem Peak, +/-1 Frame.
- Musik: optional. Bett um 10-15 dB unter Sprache geduckt (
sidechaincompress=threshold=0.02:ratio=8:attack=20:release=350), Musik-Gain bei etwa -18 dB bei Ducking. Für Beat-Cut-Vibes: Beats erkennen (librosa), jeden Beat / 2 Beats / Takt schneiden, überprüfen, ob Schnitte innerhalb von 3 Frames landen. - Sprachkette, Mix, Limiter und Lautstärke-Ziele sind in
references/params.md.
7. Look
- Nur leichte Grading-Voreinstellung: warmer Punch-Preset oder automatischer Grading begrenzt auf +/-8 %. Keine Unschärfe bei statischen Talking Heads (sieht unecht aus). Optionales Korn 3-6 % und subtile Vignette für den „designten“ Vibe.
- Log-Material (DJI Osmo Pocket 3 D-Log M, 10-Bit HEVC; Kamera taggt es als bt709, obwohl es Log ist): zuerst mit dem DJI D-Log M -> Rec.709 LUT konvertieren, dann darüber gradieren. In 16-Bit arbeiten:
format=rgb48le,lut3d=file='<lut>.cube':interp=tetrahedral. Die LUT verdunkelt Mitten; bei Low-Key-Aufnahmen dunklerer Haut in Innenräumen Mitten anheben, anstatt zu quetschen. Getesteter Startpunkt (Look: satte Schwarztöne, leicht kühler Raum, natürliche Haut):curves=master='0/0 0.04/0.025 0.25/0.31 0.6/0.70 0.9/0.92 1/0.98',colorbalance=rs=-0.025:bs=0.04:rm=0.03:bm=-0.015,eq=saturation=1.06,unsharp=5:5:0.3. Vor dem Batch-Rendering immer Rohbild | LUT | Grading auf 2 Frames nebeneinander rendern und ansehen. Shots einzeln gradieren, wenn sich die Beleuchtung ändert; die Quell-Bildrate beibehalten (24000/1001). - Pocket 3 vertikale Clips sind 1728x3072 (oder 2160x3840): genug Kopffreiheit für 1,15-1,3x Punch-Ins. Bei Auswahl eines 4:3-Crops die horizontale Mitte verwenden; den vertikalen Versatz auf Basis des Gesichtsverfolgers einstellen; in der Vorschau prüfen, dass Arme/Handgesten nicht abgeschnitten werden.
8. Master und Export
- Auflösung: Zielseitenverhältnis (9:16 oder 16:9) mit min. 1080p; skalieren, dann auf das Zielseitenverhältnis zuschneiden. Codec:
libx264CRF 18 oderlibx265CRF 22 (bei HEVC bevorzugt, wenn der Benutzer keine Kompatibilitätsprobleme erwartet). Audio: AAC 192 kbps,loudnorm=I=-14:LRA=2:TP=-1.5(oderebur128auf I=-14 ±0,5 LU und TP <= -1,5 dBFS überwachen). - Metadaten: den Dateinamen mit einem relevanten, von der KI generierten Titel und Datum versehen; keine EXIF- oder Kamerametadaten in der endgültigen Datei (für Datenschutz).
- Bereitstellungs-Kopie: eine separate Datei mit Standard-Beschreibung/Hashtags/Thumbnail-Vorschlag erzeugen. Dem Benutzer Angebot machen, die Datei dorthin zu verschieben, wo sie veröffentlicht werden soll.
Werkzeuge (ffmpeg + Python)
Skripte unter scripts/ – Pfade sind relativ zum Projektstamm:
| Skript | Zweck |
|---|---|
transcribe.py | Wörtliches Transkript + Wort-Start-/Endzeiten als JSON ausgeben |
cut.py | Schnittentscheidungen aus Schnittliste anwenden (übernimmt start, end Paare aus JSON) |
zoom.py | Einen einzelnen gesichtsgesteuerten Zoom auf ein Segment anwenden |
captions.py | Eine Untertitel-Spur (ASS) aus dem JSON des Transkripts zusammenbauen und mit ffmpeg brennen |
sound_design.py | SFX aus dem Kit oder einer Bibliothek auf den Schnitt anwenden, Pegel und Ducking einstellen |
master.py | All-in-One: transkribieren, schneiden, zoomen, untertiteln, Sound-Design, Master-Export |
qa.py | Ausgabe-Inspektion: Bild-Frames an jedem Schnitt, Lautstärke, Kontaktbogen |
Führe Skripte immer vom Projektstamm aus:
python scripts/transcribe.py <video> <output_json>
python scripts/cut.py <video> <cuts_json> <output_video>
Qualitätssicherung (QA)
Nach jedem Rendern: python scripts/qa.py <output_video> ausführen. Es gibt aus:
- Frames an jedem Schnitt +/-1,5 s (zur visuellen Inspektion).
ebur128-Lautstärke-Ausgabe (integrierte LUFS, LRA, Spitzenpegel).- Kontaktbogen (eine Seite mit jedem 10. Frame im Ausgabe-Video).
Wenn der Benutzer nach 3 Reparatur-Durchgängen nicht zufrieden ist, das Problem melden, nicht weiter optimieren.
Referenzen
references/params.md– Erklärte Farben, Zoom-Dauer, Schriftgrößen, Lautstärke-Ziele.references/pipeline.md– Das bewährte Pipeline-Muster (Schnittplaner, L-Cut-Renderer usw.).references/sfx/– Synthetisches Kit (Whoosh, Pop, Tick, Impact, Riser), generiert mit numpy/ffmpeg.
Lass uns eine Yap bearbeiten. Gib eine Videodatei an (oder einen Ordner mit Clips) und ich erstelle einen Edit-Plan für deine Freigabe.