Schnitt von vertikalen Talking-Head-Kurzvideos (Windows + Codex + Jianying)
Anwendungsfall: Sie haben nur vorhandenes Material (Talking-Head + B-Roll) und möchten daraus ein 30–50 Sekunden langes, 1080×1920 vertikales Kurzvideo schneiden – der Cutter kann es dann in Jianying finalisieren oder direkt ausliefern.
Die harten (unveränderlichen) Regeln finden Sie in references/AGENTS_rules.md. Fügen Sie diese vor Arbeitsbeginn in Ihr AGENTS.md ein. Diese Datei beschreibt nur den Ablauf.
Eingabe
- Materialverzeichnis (nur lesend – die Originale werden nie verändert; kopieren Sie alles zuerst in ein Arbeitsverzeichnis).
- Die persönlichen Stil-Vorlieben des Cutters (falls vorhanden). Die vom Cutter genannten Gewohnheiten gelten als harte Standards; Referenzvideos dienen nur als Inspirationsquelle – Techniken übernehmen, aber keine Parameter – bei Konflikten zählt der Cutter.
- Optional: Referenzvideos, Position des Markenlogos, CTA-Text für das Ende (keine ungeprüften Telefonnummern oder Adressen schreiben).
Ausgabe
spec.json(Shot-Liste – die einzige Schnittgrundlage), Rohschnitt oder fertiges MP4,.srt, QC-Bildkollage pro Sekunde, QC-Bericht.- Route A zusätzlich: Jianying-Entwurf; Route B zusätzlich: Transparente Overlays als ProRes 4444
.mov.
Schritt 0: Umgebungsprüfung (ohne Bestätigung kein Start)
Führen Sie die Prüfung gemäß references/windows_env.md durch: ffmpeg Vollversion (mit zscale, tonemap, prores_ks), Python 3.10/3.11, faster-whisper + whisperX, Playwright + Chromium + die benötigte chinesische Schriftart, optional demucs / RVM; das Jianying-Entwurfsverzeichnis muss in der Konfiguration eingetragen und zu writable_roots hinzugefügt sein. Die Codex-Sandbox ist standardmäßig offline – Modelle und Abhängigkeiten müssen vorab installiert sein. Wenn etwas fehlt, melden Sie es – führen Sie keine Schritte ohne Voraussetzungen aus. Die genauen Befehle für jeden Schritt finden Sie in references/windows_commands.md.
Schritt 1: Materialerfassung
- ffprobe für jede Datei: Auflösung, Bildrate (variabel?), Rotation, Dauer, Farbübertragung (HLG/PQ = HDR). Als
inventory.csvablegen. - Keine SDR-Zwischendateien exportieren: Konvertierung bei jedem Frame-Zugriff in der Filterkette. Allen Materialien
fps=30hinzufügen; bei HDR-Material beginnt die Frame-Lese-Filterkette mit HDR->SDR-Konvertierung – sonst wirkt das Bild grau – gilt auch für Cover-Frames (Befehle inwindows_commands.mdAbschnitt 2). - Von jedem Clip ein Thumbnail erstellen und mit Tags versehen (Inhalt, Personen, nutzbare Intervalle, Überblendungen/Schwarz/Start-Dunkelheit, fremde Marken). Nicht nutzbare Clips und Intervalle markieren.
- Prüfen: Jeder Clip hat Tags; bei Clips mit Farbübertragung arib-std-b67 oder smpte2084 beginnt die Frame-Lese-Filterkette mit HDR-Konvertierung.
Schritt 2: Transkription und Korrektur
- faster-whisper grobes Transkript:
medium-Modell,device='cpu',compute_type='int8',language='zh',vad_filter=True,word_timestamps=True,initial_promptmit Fachvokabular. VAD überspringt Sätze – daher einen zweiten Durchlauf ohne VAD, mitcondition_on_previous_text=False. - Manuell das gesamte Transkript mit dem Audio abgleichen: Fachbegriffe, Zahlen, gleichklingende falsche Zeichen; Whisper erfindet manchmal Sätze, die nie gesprochen wurden – löschen. Unverständliche Wörter direkt aus dem Audio entfernen – nicht raten.
- Vor dem Transkribieren zuerst mit ffmpeg auf 16 kHz mono WAV konvertieren, dann an whisper übergeben. Danach das korrigierte Transkript mit whisperX für erzwungene Alignierung verwenden (Ergebnis in das
align-Feld von spec schreiben), um wortgenaue Startpunkte zu erhalten (Toleranz 0–3 Frames). Die Endzeiten von whisperX sind unzuverlässig – Endpunkte mit Energieerkennung bestimmen.
- Prüfen: Keine ungeprüften Fachbegriffe oder Zahlen im Transkript; jeder Satz hat einen wortgenauen Startpunkt.
Schritt 3: Narrative Neustrukturierung (erst die Story, dann die Effekte)
- Die erste Sekunde muss ein Hook sein: „Kontrast + Ergebnis“ – mit Originalzitat. Keine B-Roll oder Logos am Anfang.
- Der Hook kann zwei nicht aufeinanderfolgende Originalzitate kombinieren – jeder Teil muss
src_thaben; die Bedeutung darf nicht verändert werden. - Zwei Optionen für den Ton (in spec festhalten): Der erste Satz startet normal, der große Text liegt darüber; oder der Ergebnissatz (≤3 Sekunden) wird als Cold Open nach vorne gezogen, dann normal weiter.
- Der Hook kann zwei nicht aufeinanderfolgende Originalzitate kombinieren – jeder Teil muss
- Sätze löschen, die die Geschichte nicht voranbringen (Slogans, Vorbereitungen, wiederholte Aussagen). Ziel: 30–50 Sekunden.
- 3–4 narrative Wendepunkte markieren (Anfangshook / Szenenwechsel / Höhepunkt-Ergebnis / Abschluss-Kernaussage). Highlights nur an diesen Stellen setzen; der Höhepunkt bekommt die stärkste Wirkung, der Anfang die zweitstärkste. Zwei Highlights mindestens 6 Sekunden auseinander; bei ca. 30 Sekunden 3 Highlights, bei ca. 50 Sekunden 4.
- Prüfen: Jeder Text auf dem Bildschirm ist im Transkript mit Originalzitat und Timestamp auffindbar – Kontext prüfen (dasselbe Wort kann in verschiedenen Sätzen unterschiedliche Bedeutung haben).
Schritt 4: Shot-Liste spec.json schreiben – vom Benutzer bestätigen lassen
Felddefinitionen in references/spec_schema.md, Beispiel-Schlüsselwortkategorien in references/kw_class.example.json (Die Wörter dort stammen aus einem bestimmten Projekt – bei neuen Projekten neu schreiben). Jeder Abschnitt enthält: Quellmaterial mit In/Out-Punkten, Layout, Untertitel, kw_class, Effektvoreinstellungen, B-Roll, Soundeffekte, Musikabschnitte, src_t (Original-Timestamps). Vor dem Rendern die Shot-Liste dem Benutzer zur Bestätigung vorlegen.
Schritt 5: Schnitt
- In/Out-Punkte mit 10-ms-Frame-RMS-Energieerkennung (nicht Whisper-Endzeiten). Atemgeräusche sauber entfernen: Einatmungen, Füllwörter – nichts bleibt.
- Bewährte Methode: Nach Energie schneiden, Schwellwert max(10. Perzentil + 14 dB, −48 dBFS). 3 aufeinanderfolgende 10-ms-Fenster gelten als Sprachbeginn, 0,10 s Vorlauf, 0,14 s Nachlauf; dann manuell nachjustieren. Prüfen: Die kumulierte Dauer von Abschnitten unter −42 dBFS auf beiden Seiten eines Schnitts soll ≤90 ms betragen.
- Cutter-Gewohnheit als Ziel: Vor jedem Wortanfang nur 1–2 Frames (≤67 ms) – noch nicht getestet (ausstehend). Testmethode: Mit demucs die Stimme isolieren, vom Schnittpunkt bis zum Start von 3 aufeinanderfolgenden 10-ms-Fenstern über −42 dBFS messen; jeder Schnittpunkt ≤67 ms, der erste Konsonant wird nicht abgeschnitten, der geschnittene Abschnitt erneut durch ASR laufen lassen – ohne abgeschnittene Wörter; erst dann als Standard übernehmen.
- Optional: Eine Vergleichsversion mit 2–3 Frames Pause zwischen Sätzen für den Cutter erstellen.
- Framegenauer Export jedes Segments:
-ssvor-i,-vfmitfps=30,-frames:v nffür feste Länge (nf = round((Aus − Ein) × 30)),libx264 -preset veryfast -crf 12, mit BT.709 Farbkennzeichnung drei Parameter; Audio sampelgenau zusammenfügen, jedes Segment 8 ms Einblendung / 15 ms Ausblendung gegen Knackgeräusche. - Bei Jump Cuts derselben Kameraposition 1,08× Zoom-in/out; beim Wechsel zu B-Roll Kameraruckler + horizontales Blur.
- B-Roll nur dort einfügen, wo das Originalzitat den entsprechenden Inhalt erwähnt – nicht zur Temposteigerung.
Schritt 6: Untertitel-Effekte (zwei Stufen)
Standard-Stufe: Alle 1,5–2 Sekunden ein Effekt, maximaler Abstand ≤3 Sekunden, zurückhaltend.
- Untere Bildschirmuntertitel: Weißer Text mit schwarzem Rand, eine Zeile ≤12 Zeichen, ganzer Satz erscheint (ob Schlüsselwörter farbig hervorgehoben werden – als Parameter – entscheidet der Cutter).
- Hervorhebung als mittlere goldene große Schrift (Schlüsselwörter 1,75×, Zahlen 2×), zeichenweises Einblenden 115%→100%, 6–8 Frames; optional handgezeichnete Unterstreichungen/Kreise, Papierstruktur, weicher Schatten.
- Optionale Techniken: Zahlen-Scrollen, reale Objekt-Overlays mit passenden Soundeffekten, auflistende Checklisten (Schriftgröße ≥ 1,2× Basisuntertitel, nach Zusammenführung vergrößern), vertikale parallele goldene Kernsätze (bei Erscheinen den gleichen Untertitel unten ausblenden), Identitäts-Tag am Anfang (nur einmal, mit Hinweis „nicht Originalzitat“).
Highlight-Stufe: 3–4 pro Video, in die Gesamtdichte eingerechnet – jede voll ausgestattet:
- Große Schrift 75–85% der Bildbreite (85% ist Maximum, Sicherheitszone beachten); innerhalb 4 Frames auf 1,15–1,25 zoomen; 2–3 Frames Kamera-Wackeln mit Bewegungsunschärfe; Hintergrund um 6–30% abdunkeln, angemessen entsättigen (Parameter – Ziel: auf dem Handy bleibt die Person klar erkennbar) – Personenebene nicht farbkorrigieren; vorbereiteter komplexer Heavy-Hit-Soundeffekt (zählt als 1).
- Intensitätsstufen: Der stärkste Zoom 1,25×, Wackeln 3 Frames; alle anderen Zoom 1,15×, Wackeln 2 Frames.
- Dieselbe Technik nur einmal pro Video: Schrift hinter Person (Keying) / Text-Masken-Übergang / Vollbild-Zahlen-Scrollen + roter Stempel / vertikaler goldener Satz mit Sweep-Licht.
- Schrift hinter Person: Schrift oberhalb der Schulterlinie platzieren – Hände und Gegenstände vermeiden; der Kopf muss die Schrift zu 25–30% überdecken (<15% auf dem Handy unsichtbar); vor dem weißen Rand zuerst versehentlich mitkeyte Objekte (z. B. Stuhl) aus der Maske entfernen.
- Roter Stempel: Die einzige rote Farbe im ganzen Video, 30–40% der Bildbreite, innerhalb 3 Frames 150%→100% fallen + 2 Frames Wackeln.
- Standbild: Nur in einer natürlichen Pause nach einem Satz (Stimme < −45 dB), den Frame mit dem am nächsten geschlossenen Mund wählen, ≤0,4 Sekunden, maximal eine Stelle im gesamten Video – der Heavy-Hit-Soundeffekt liegt am Standbild-Start. Dies ist die einzige Ausnahme von der Regel „keine Atempause“.
- Alle Einblend-Animationen 1 Frame früher beginnen.
Schritt 7: Audio
- Stimme: Hochpass 80 Hz → Rauschunterdrückung → leichtes EQ → Kompression.
- Musik: Pro Kapitel wechselnd (Cutter-Gewohnheit), Überblendung 300–600 ms; Sidechain-Ducking während Sprache. Nur lizenzierte oder selbst erstellte Musik verwenden.
- Soundeffekte: Im gesamten Video ca. 0,5 pro Sekunde, gleichmäßig verteilt. In jedem 4-Sekunden-Fenster 1–3 Effekte, mindestens 0,25 s Abstand zwischen zwei Effekten. Lautstärke: Standardmäßig 14 dB leiser als die Stimme (RMS) (
db=-14); inhaltlich passende Soundeffekte bevorzugen vor generischen Pop-Geräuschen. - Lautheit: Erster Durchlauf
loudnorm=I=-14:TP=-1.5:LRA=11messen; zweiter Durchlauf mit Messwerten undlinear=true, danach festaresample=48000,alimiter=limit=0.7:attack=1:release=30:level=false; abschließend mit ebur128 nachmessen, Verstärkung um g = min(−14 − I, −2.9 − Peak) ergänzen. Ziel: −14 LUFS, True Peak ≤ −1 dBTP.
Schritt 8: Rendern und Auslieferung (eine der beiden Routen oder Kombination)
- Route A: Jianying-Entwurf (Standard, wenn der Cutter nur Jianying verwendet). Codex erstellt Rohschnitt, Untertitel, Soundeffekte und Musik-Timing; mit pyJianYingDraft einen neuen Entwurf anlegen – der Cutter öffnet ihn in Jianying für Verpackung und Export. Einschränkungen und Hinweise in
references/jianying_route.md. Die gesamte Route auf einer echten Windows-Maschine validieren. - Route B: Overlays (zwingend für Highlights). Effektebene mit HTML/Canvas, Playwright steuert das systemweit installierte Chrome zur framegenauen Erfassung transparenter PNGs: Viewport 1080×1920,
device_scale_factor=1, Startparameter--font-render-hinting=none, vor Screenshot aufwindow.READYunddocument.fonts.readywarten,omit_background=True; alle Animationen als reine Funktionen der Zeit t. PNG-Sequenz mit-framerate 30einlesen, als ProRes 4444 encodieren (-alpha_bits 16), dann mit ffmpeg overlay zusammensetzen. Die Overlay-Spur als Videospur in den Jianying-Entwurf legen: nicht getestet, ausstehend. ffmpeg drawtext kann kein zeichenweises Einblenden oder Schrift hinter Person. - Fallback-Auslieferung: Rohschnitt-MP4 + SRT + Shot-Liste – Verpackung erfolgt durch den Cutter in Jianying.
- Vor dem Overlay das Hintergrundvideo leicht farbkorrigieren:
eq=contrast=1.04:saturation=1.07. - Finales Encoding:
libx264 -profile:v high -preset slow -crf 17 -maxrate 16M -bufsize 24M -g 60 -r 30 -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709, AAC 192k,-movflags +faststart.
Schritt 9: Qualitätskontrolle (nur ausliefern, wenn alles bestanden)
Punkt für Punkt gemäß references/qc_checklist.md. Im Bericht nur das notieren, was durch Stichproben-Frames und Audio-Überprüfung bestätigt wurde – jede Angabe mit Zahl und Einheit; bei nicht Messbarem „nicht gemessen“ schreiben.
Cover
- Arbeitsteilung: Der Redakteur erstellt Textvorschlag und Kandidaten-Frames (in das
cover-Feld von spec schreiben), der Cutter Layout und Export (1080×1920 und 3:4). - Haupttitel aus Originalzitat kondensiert, Wortstellung anpassbar (z. B. „Eineinhalb Monate Schrauben drehen“) – keine Fakten hinzufügen, die nicht im Originalzitat stehen; ≤7 Zeichen, maximal 2 Zeilen. Unterer Tag: Ergebnis-Zahlen, 2–3 Sticker.
- Titel und Gesicht im mittleren Bereich 1080×1440 (y 240–1680) platzieren – auf Douyin-Homepage wird das Raster auf 3:4 zugeschnitten.
- Mindestens 3 Kandidaten-Frames mit Timestamp und Begründung – Skizze mit Hinweis „nicht endgültig“.
- Den gesamten Clip in 0,5-Sekunden-Schritten nach Seitenprofil oder Gesichtsausdrücken scannen; Blickrichtung bestimmt das Layout (Person schaut nach links oben → Person unten rechts, Titel oben links); wenn Kleidung oder Hintergrund Text enthalten – kein Spiegelbild.
Erfolgskriterien
- Dauer 30–50 Sekunden, die erste Sekunde ist ein Hook aus Originalzitat; jeder Text auf dem Bildschirm ist 100% auf das Originalzitat rückverfolgbar.
- Standardeffekte maximaler Abstand ≤3 Sekunden; Highlights 3–4 mit abgestufter Intensität und einmaligen Techniken.
- Soundeffekte ≈0,5 pro Sekunde, keine gleichzeitigen Überlagerungen; Timing-Treffer ≤2 Frames; −14 LUFS ±1, True Peak ≤ −1 dBTP.
- Sicherheitszone: keine Überschreitungen; keine unerwarteten schwarzen Frames / eingefrorenen Frames; Text überdeckt keine Gesichter oder Markenlogos.
- Der Benutzer hat die Shot-Liste bestätigt; alle Liefergegenstände vollständig.
Häufige Fallstricke → Gegenmaßnahmen
| Fallstrick | Gegenmaßnahme |
|---|---|
| HLG-Material wirkt grau | zscale + tonemap=hable zu SDR konvertieren, Gamma etwa 1.12 |
| Whisper-Wort-Timings zu früh / Endzeit ragt in Stille | Startpunkt mit whisperX Align, Endpunkt mit Energieerkennung |
| VAD überspringt Sätze | Einen zweiten Durchlauf ohne VAD laufen lassen |
| Text auf Bildschirm ist nicht Originalzitat / falscher Kontext | Jeder Eintrag hat src_t, QC prüft einzeln gegen Transkript |
| Alle Effekte gleich intensiv – wirkt langweilig | Aufteilen in Standard- und Highlight-Stufe, Highlight voll ausgestattet |
| Schrift hinter Person nicht sichtbar | Überdeckungsanteil messen – Kopf überdeckt 25–30% |
| Stuhl wird mit in die Person keyed | Schrift oberhalb Schulterlinie; vor dem weißen Rand entfernen |
| Timing-Treffer falsch gemessen | Vom „ersten sichtbaren Frame“ messen; Einblend-Animationen 1 Frame früher starten |
| Zischlaute werden als Soundeffekte erkannt | Nach demucs-Stimmtreinnung nur auf der Begleitspur messen |
| Soundeffekte gehäuft | Pro 4-Sekunden-Fenster 1–3, komplexe Sequenz zählt als 1 |
| Kapitel oder große Schrift gelangt in den Douyin-Button-Bereich | Rechte Grenze ≤ x 930 |
| Standbild während Sprache – Lippenbewegung passt nicht | Standbild nur in Stille, ≤0,4 Sekunden |
| Animation gleitet ins Bild und überdeckt Gesicht oder Bildrand | Stattdessen: an Ort und Stelle ausblenden + an Zielposition vergrößert einblenden |
| Prüfwerkzeug zeigt veraltete Bilder basierend auf Pfad-Cache | Jedes Prüfungsbild mit neuem Dateinamen versehen |
| Chinesische Pfade oder Leerzeichen lassen Befehle fehlschlagen | Python subprocess mit Parameterliste verwenden; Dateizugriffe explizit utf-8 |
| Whisper halluziniert nie gesprochene Sätze | Vor dem Align das gesamte Transkript manuell mit Audio abgleichen |
| Alternative Render-Lösung (z. B. Remotion) ausprobieren wollen | Nicht validiert – nicht selbst ersetzen; Effektebene nur HTML/Canvas + Playwright |
| Neuer Entwurf wird nicht in Jianying-Liste angezeigt / falsche Schrift | In vorhandenen Entwurf wechseln oder Jianying neustarten; Entwurf zweimal öffnen |