cut-rough
Mechanische Straffung: tote Pausen, Füllwörter, Versprecher, Schnitthygiene. Alles hier ist umkehrbar und jede Entscheidung trägt eine Herkunft (Provenance).
Argument $project ist der Slug; die vollständige Anfrage in $ARGUMENTS. Ein leerer
$-Platzhalter bedeutet, dass die Fähigkeit automatisch ausgelöst wurde und nicht per
Schrägstrich aufgerufen: Nimm das Projekt aus PIPELINE_STATE im Sitzungskontext und
sag, welches du ausgewählt hast. Die Verbnamen folgen dem Build-Vertrag;
python engine/ve.py --help gewinnt bei Konflikten.
Vorbedingungen und warum sie streng sind
Führe zuerst cut-story aus. Wenn story.blocks fehlt, sag das und biete cut-story an,
statt fortzufahren – mechanisches Schneiden an Material, das bald komplett verworfen wird,
verschwendet Zeit mit Versprecher- und Füllworterkennung, die niemand hören wird.
Wenn der Benutzer explizit einen mechanischen Durchlauf über alles möchte („einfach nur die Ähms raus“), ist das legitim. Tu es und sag, dass keine Inhaltsauswahl stattgefunden hat.
Die Frame-Regel
Schnittpunkte rasten auf ganze Frames ein. Das ist keine Ordnungsliebe – Schnittpunkte außerhalb des Frame-Rasters lassen den Concat-Filter pro Schnitt 8,33 ms A/V-Drift akkumulieren, 1250 ms bei 150 Schnitten. Eingefasst driften dieselben 150 Schnitte um genau 0 Samples.
in_frame = floor(t_in * fps + 0.5) # Aufrunden bei 0,5 -> Bindungen landen später
out_frame = ceil(t_out * fps - 0.5) # Abrunden bei 0,5 -> Bindungen landen früher
if out_frame <= in_frame: out_frame = in_frame + 1
out ist exklusiv – ffmpeg implementiert trim=end als striktes <, und halboffene
[in, out)-Intervalle machen die Verkettung exakt. Wenn die OUT-Rundung falsch ist, wird
jedes Segment einen Frame lang; 200 Schnitte ergeben 6,7 s Drift und hörbar kaputten Sync.
Führe diese Arithmetik niemals von Hand aus. vedit/timebase.py ist dafür zuständig:
snap_in / snap_out.
Schritt 1 – Die Durchläufe ausführen
python engine/ve.py cut $project
Vier Durchläufe über die abgeflachte Wortliste, dann das Einrasten:
- Stille-Staffelung. Lücken unter
min_gapwerden nie geschnitten. Darüber skaliert die beibehaltene Pause mit der Interpunktion des vorangehenden Wortes:.?!x1,5 (Minimum 0,40 s),,;:x1,0, Mittel-Nebensatz x0,7 (Minimum 0,20 s), Themenwechsel x2,0 (Minimum 0,60 s). Eine gleichmäßige Pausenlänge ist das erkennbarste Zeichen einer maschinellen Bearbeitung – das Ohr erwartet einen längeren Atemzug nach einem Punkt. - Füllwort-Staffelung. Siehe unten.
- Versprechererkennung. Wiederholte N-Gramme, bei denen die spätere Aufnahme die frühere ersetzt.
- Schnitthygiene. Padding, Überblendungen, Nullpunkt-Snap, Schnittdichte-Begrenzung.
Schritt 2 – Füllwort-Ebenen und die eine, die nicht automatisiert werden darf
- Ebene A – nicht-lexikalisch (
äh ähm hm mh uh um er): Automatisch entfernen. Niemand will diese. - Ebene B – lexikalische Füllwörter (
weißt du, sozusagen, quasi, im Prinzip, you know, I mean): Automatisch entfernen mit Schutzmaßnahmen – nicht am Satzanfang, nicht wenn die Entfernung ein Fragment untermin_cliphinterlässt. - Ebene C – Modalpartikel:
also halt eben ja mal doch schon eigentlich genauund englischelike just well right so basically actually. Nur kennzeichnen. Niemals automatisch entfernen.
Ebene C ist der Punkt, an dem automatisierte Editoren die deutsche Sprache ruinieren.
doch, eben, halt und ja tragen Haltung und Diskursstruktur; sie zu entfernen lässt
den Sprecher nicht straffer klingen, sondern wie eine Übersetzung. Wenn der Benutzer
sie trotzdem entfernen möchte, tu es – aber sag einmal, was es kostet, und erwähne es
dann nicht mehr.
Erkennungsreihenfolge: lexikalischer Treffer, dann Dauer/Zeichen >= 0,12 s, dann
umgebende Lücke >= 0,10 s, dann Energie innerhalb von 6 dB der umgebenden Sprache.
Verwende niemals WhisperX score als Füllwortsignal. Es misst die Ausrichtung, nicht
Zögern. Niedrige Scores cluster auf seltenen Wörtern und Eigennamen – das Gegenteil von
Füllwörtern. Verwende es nur als Zeitstempel-Zuverlässigkeits-Flag: score < 0,35
vergrößert das Padding um 60 ms und verbietet einen Schnitt innerhalb dieses Wortes.
Schritt 3 – Die Standardwerte und ihr Status
| Parameter | Standard | Hinweis |
|---|---|---|
pad_in | 0,08 s | Plosivverschluss vor /p t k b d g/ |
pad_out | 0,10 s | /t k s/-Auslaute laufen über das end des Aligners hinaus |
keep_pause | 0,18 s Minimum | Der Atemzugschlitz, der anstelle toter Luft bleibt |
min_gap | 0,55 s | Darunter nie schneiden |
min_removal | 0,20 s | Kürzere Entfernungen sind keinen Schnitt wert |
max_cut_density | 1 pro 1,5 s | Jump-Cut-Ermüdung |
min_clip | 0,35 s | Kürzere beibehaltene Clips werden mit einem Nachbarn verschmolzen |
| Überblendung | 20 ms (10 min, 40 max) | curve=tri gleiche Aufnahme, qsin über Aufnahmen hinweg |
| Nullpunktsuche | +/-5 ms (240 Samples) | Nur Audio, niemals Video verschieben |
Diese Werte sind forschungsbasiert, nicht perzeptuell getestet. Solange project.json
"calibrated": false enthält, sag das immer, wenn du einen Schnitt verteidigst. Präsentiere
keine nicht kalibrierte Schwelle als justierte. Der Sitzungshaken zeigt dieses Flag aus
diesem Grund in jeder Sitzung an.
Der Nullpunkt-Snap ist wichtig zu verstehen: Ein harter Schnitt bei einem Nicht-Nulldurchgang erzeugt einen Sample-Sprung, der 29,5x größer ist als das natürliche Maximum des Signals – ein hörbarer Klick. Sowohl ein Nullpunkt-Snap als auch eine 20-ms-Überblendung bringen ihn auf das Ausgangsniveau zurück. Verwende beide. Der Snap bewegt nur Audio, niemals Video; eine sub-Frame-Videoverschiebung ist nicht darstellbar.
Schritt 4 – J/L-Schnitte
4–12 Frames ist der nutzbare Bereich; Standard 6.
Lehne jeden J/L-Schnitt ab, bei dem beide Seiten dieselbe source_id teilen und keine
mit B-Roll oder einem Vollbild-Overlay abgedeckt ist. Bei einem sichtbaren Mund, der
kein J-Schnitt ist, handelt es sich um einen Lippensynchronfehler, der als technischer
Fehler und nicht als Schnitt gelesen wird.
Schritt 5 – Segmente schreiben
Segmente werden in segments[] geschrieben, mit src_in_frames (inklusive) und
src_out_frames (exklusiv) als einziger Autorität. Außerdem erforderlich für jedes
Segment:
enabled– Abgelehntes Material istfalsemit einem Grund, niemals entfernt. Jede automatische Entscheidung muss durch Umlegen eines Booleans umkehrbar sein. Diese Eigenschaft macht einen aggressiven Standard sicher.order– Explizite Ausgabereihenfolge, dicht über aktivierte Segmente.provenance–stage(contentfür Story-Ebene-Drops,silence,filler,retake),rule,confidence,applied_by, und der gemessene Wert, der es ausgelöst hat (original_gap_s). Provenance ist es, das dem Benutzer erlaubt, „alle Ebene-B-Entfernungen rückgängig zu machen“.word_rangeund denormalisiertertext. Der Text dient nur zum Lesen und ist niemals autoritativ – wenn er mitword_rangein Konflikt steht, gewinnt der Wortbereich.
Zeitachsenpositionen sind abgeleitet, niemals gespeichert. Sie sind eine laufende Summe
über aktivierte Segmente, die beim Laden in _computed geschrieben wird. Schreibe niemals
_computed von Hand.
Setze stage auf "rough_cut".
Schritt 6 – Berichte wie ein Redakteur, nicht wie ein Skript
Berichte: Quellendauer, geschnittene Dauer, entfernter Prozentsatz, Schnittanzahl,
Schnittdichte (Schnitte pro Minute) und die Anzahl pro Provenance-Regel. Markiere dann
alles, was wie ein Überschnitt wirkt: einen Bereich mit mehr als einem Schnitt pro 1,5 s,
jeden beibehaltenen Clip nahe min_clip und die Anzahl der gekennzeichneten, aber nicht
entfernten Ebene-C-Füllwörter.
Biete drei nächste Schritte an: einen Bereich als Vorschau anzeigen, einen Schwellenwert anpassen oder zu Grafiken/Untertiteln übergehen.
Fehlermodi
| Symptom | Ursache | Behebung |
|---|---|---|
| Jedes Segment ist 1 Frame | OUT aufgerundet statt abgerundet | Verwende snap_out; niemals die Mathematik inline |
| Hörbare Klicks an Schnitten | Nullpunkt-Snap übersprungen | Snap plus eine 20-ms-Überblendung |
| Sprache klingt abgehackt und atemlos | Einheitliche beibehaltene Pause | Wende die interpunktionsskalierte Tabelle an |
| Sprecher klingt roboterhaft und undeutsch | Ebene C entfernt | Ebene C ist nur kennzeichnen; stelle per Provenance wieder her |
| Schnitte landen mitten im Wort | Transkript ist Stufe 3 (BPE-Token) | Neu transkribieren; Token-Zeitstempel können nicht geschnitten werden |
| A/V-Drift wächst über das Video | Schnittpunkte nicht Frame-gesnappt | Jeden Schnittpunkt snapen, dann QC-Prüfung (a) erneut ausführen |