Was macht Papier-Schnitt (Paper edit)?
Rohe Kameradateien rein, zusammengesetzter Grobschnitt in Resolve raus. Im ersten echten Testvideo: Roh 14:17, raus 10:16, im Vergleich zum eigenen Handschnitt des Erstellers von 10:32.
Die Aufgabenteilung: Claude macht den Grobschnitt, der Ersteller den Feinschliff. Versuche nicht, einen fertigen Schnitt auszuliefern, und sei nicht so zurückhaltend, dass der Ersteller offensichtliche Teile neu machen muss.
Einrichtung: diese ausfüllen
| Platzhalter | Bedeutung | Beispiel |
|---|---|---|
<FOOTAGE_DRIVE> | Wo das Rohmaterial liegt, ein Ordner pro Video | /Volumes/MyWorkDrive |
<LUT_PATH> | Optionaler LUT, relativ zum LUT-Ordner von Resolve | MyLuts/SLog3-to-709.cube |
WHISPER_MODEL (env) | whisper.cpp Modelldatei | Standard ~/.cache/whisper-models/ggml-small.en.bin |
RESOLVE_APP (env, optional) | Resolve-App-Pfad bei Abweichung | Standard /Applications/DaVinci Resolve/DaVinci Resolve.app |
Voraussetzungen: ffmpeg, ffprobe, whisper-cli (whisper.cpp), Python 3, DaVinci Resolve mit einem Resolve MCP Server, der execute_resolve_code bereitstellt.
Ausführung
Arbeitsverzeichnis: das Sitzungs-Scratchpad, z.B. <scratchpad>/paperedit. Das Skill-Verzeichnis unten ist .claude/skills/paper-edit.
1. Das Material finden
Das Material liegt auf <FOOTAGE_DRIVE>, ein Ordner pro Video, oft lose benannt.
find "<FOOTAGE_DRIVE>" -maxdepth 4 -iname "*<keyword>*" -not -path "*/.*"
Bestätige den Ordner mit dem Benutzer, wenn mehr als einer gefunden wird. Kopiere die Dateien nicht; Resolve verlinkt auf sie auf dem Laufwerk.
2. Jeden Clip transkribieren
bash <skill>/scripts/transcribe.sh "<FOOTAGE_DRIVE>/<folder>" "<work>"
Schreibt <clip>.json (Wort-Ebene), <clip>.wav und clips.ndjson mit Dauern. Ungefähr 90s für 15 Minuten Material. Überspringt bereits fertige Clips, also kann es gefahrlos erneut ausgeführt werden.
3. Das Transkript selbst lesen
python3 <skill>/scripts/sentences.py "<work>"
Lies alles davon. Dies ist der Teil, der nicht automatisiert werden kann. Ein Detektor für wiederholte Phrasen wurde ausprobiert und scheiterte kläglich: Er wollte 428 von 737 Sekunden schneiden, weil Lehrer Phrasen absichtlich wiederholen („hier ist, was funktioniert, hier ist, was nicht funktioniert“).
4. Die Schnittliste schreiben
<work>/cuts.json, ein Objekt pro Entfernung, Zeiten in Sekunden ab Beginn des Clips:
[{"clip":"C0002","start":32.58,"end":39.76,"why":"Stolperer: 'was mir klar wurde, war sogar manchmal...'"}]
Schneide diese:
- Nebenbemerkungen und Kameragespräche: „das war ziemlich gut, kein Scherz“, „diese Kamera ist gleich tot“, „das wird wahrscheinlich ein Sieben-Minuten-Video“
- Fehlstarts, behalte den letzten Versuch. Sprecher wiederholen oft einen Satz zweimal, beim zweiten Mal besser.
- Fehlgeschlagene Takes des CTAs. Es gibt oft 3-4 am Ende; behalte den letzten.
- Lange Stille zwischen Abschnitten, eingeklammerte Geräusche (
[BLANK_AUDIO],(Tastaturklicken),(Rascheln)) - Mitten im Gedanken abgebrochene und neu aufgebaute Sätze („der Grund, warum ich das früher nicht gemacht habe, war, weil ich Angst hatte, und...“)
- Kurze Neustarts innerhalb eines Satzes, markiert durch ein Komma und einen wiederholten Satzteil: „alles, worum ich im Gegenzug bat, ist eine einfache Bewertung und das ist, und das Hinzufügen des Bewertungsteils...“ Schneide vom abgebrochenen Satzteil bis zum Neustart. Diese sind 1-2s und leicht überlesbar.
- Whisper-Wortzeitmarkierungen driften um etwa 0,5s. Bei einem Fehlstart, der dieselben Wörter wiederholt („ich liebe es, anzubieten, ich liebe es, anzufangen“), beende den Schnitt beim Start des zweiten „ich liebe es“, nicht am Ende des ersten Versuchs, sonst überlebt ein einzelnes Wort.
- Beginne einen Schnitt beim Offset
todes behaltenen Wortes, niemals bei seinemfrom. In einem Test begann ein Schnitt bei 40.30, während das behaltene Wort 40.19-40.92 lief, so dass das letzte Wort des Aufhängers abgeschnitten wurde und von Hand zurückgezogen werden musste. Gib die Offsets mitfrom|tofür das Wort vor jedem Schnitt aus. - Nach einer langen
[BLANK_AUDIO]-Passage sind die Zeitangaben unzuverlässig. Whisper drückte die Wörter des ersten CTA-Takes nach 30s Stille zusammen, und der Schnitt hinterließ ein Wortfragment als allererste Sekunde des Videos. Wenn ein Take nach toter Luft beginnt, überprüfe den Audiopegel (ffmpegastats), um zu finden, wo die Sprache wirklich beginnt, anstatt den Wort-Offsets zu vertrauen.
Behalte:
- Bewusste Wiederholung für den Lehrrhythmus
- Abschweifungen, die trotzdem etwas lehren, es sei denn, der Benutzer sagt etwas anderes
- Alles, bei dem du dir unsicher bist. Markiere es in deiner Zusammenfassung anstatt es zu schneiden.
5. Die Segmente bauen
python3 <skill>/scripts/segments.py "<work>"
Erzeugt segments-v1.json (nur Urteilschnitte), segments-v2.json (kürzt auch Pausen über 0,50s auf 0,22s) und cutlist.txt. Einstellbar über Umgebungsvariablen: MIN_GAP, KEEP_PAUSE, NOISE_DB.
Es entfernt auch No-Speech-Blip: v2-Segmente unter 1s ohne Sprache auf Sprechniveau. Es sind Mausklicks und Blicke auf einen Laptop, die als Inseln zwischen gekürzten Pausen übrig bleiben. Einstellbar: BLIP_MAX, SPEECH_DB.
Lies jede join:-Zeile in cutlist.txt, bevor du sie dem Benutzer zeigst. Sie zeigt, wie der Satz über jeden Schnitt hinweg gelesen wird. Wenn dieselbe Phrase auf beiden Seiten des | erscheint, ist der Schnitt zu kurz.
Beide Durchgänge sind wichtig. Mit nur den Urteilschnitten war das Feedback: „es gibt große Pausen durchgehend, besonders am Anfang.“ Die Pausenkürzung ist das, was 11:32 auf 10:16 gebracht hat. Senke KEEP_PAUSE nicht unter ~0,20s; es fängt an, gehetzt zu klingen.
6. Die Schnittliste vor dem Bau anzeigen
Füge die Zusammenfassung ein: Rohdauer, v1, v2, Anzahl der Schnitte und die bemerkenswerten Schnitte mit Gründen. Der Benutzer legt per Veto fest, was er möchte.
7. In Resolve bauen
Erfordert Preferences > System > General > External scripting using: Local (einmal setzen, bleibt erhalten). Bitte den Benutzer nicht, Resolve zu öffnen. Führe zuerst dies aus; es startet Resolve, falls es geschlossen ist, und wartet, bis die API antwortet:
bash <skill>/scripts/ensure_resolve.sh
Wenn es mit laufendem Resolve eine Zeitüberschreitung gibt, ist das Scripting deaktiviert; das ist die eine Sache, bei der du den Benutzer bitten musst, es zu beheben.
Schreibe <work>/params.json:
{"project":"<Video Name> - YYYY-MM-DD","work":"<work>",
"files":["<FOOTAGE_DRIVE>/<folder>/C0001.MP4","..."],
"fps":23.976,"width":1920,"height":1080}
Dann ein execute_resolve_code-Aufruf:
PARAMS = "<work>/params.json"
exec(open("<skill>/scripts/resolve_build.py").read())
Mehrere Videos: baue sie nacheinander, niemals als parallele Tool-Aufrufe. Resolve hat ein aktuelles Projekt, also kollidieren zwei Bauvorgänge gleichzeitig. Einmal liefen zwei Bauvorgänge zusammen und eine v2 kam leer heraus, obwohl das Skript meldete, jedes Element sei hinzugefügt worden. Überprüfe nach jedem Bau selbst die Elementanzahl jeder Timeline.
Benenne das Projekt <Video> - YYYY-MM-DD, damit gleichnamige Projekte nie verwechselt werden. Es erstellt ein neues Projekt, importiert die Clips und baut Paper Edit v1 und Paper Edit v2 (tight). Nichts Bestehendes wird berührt. Dies ist eine sanktionierte Verwendung von execute_resolve_code; append_to_timeline kann keine Ein-/Aus-Punkte übernehmen, es gibt also kein alternatives Tool. Zeige dem Benutzer den Code beim ersten Mal in einer Sitzung.
Fallback, wenn Resolve nicht erreichbar ist (Cloud/geplanter Lauf oder ensure_resolve.sh fehlgeschlagen): schreibe ein FCPXML mit asset-clip-Elementen, eines pro Segment, mit start und duration in frames*1001/24000s, und lasse den Benutzer es importieren. Gleiches Ergebnis, ein zusätzlicher Klick.
8. Übergabe
Teile dem Benutzer mit, dass beide Timelines existieren, welche er zuerst ansehen soll (v2), und dass v1 das Sicherheitsnetz ist, falls sich v2 abgehackt anfühlt. Frage dann, ob der Schnitt gesperrt ist, denn Overlays kommen danach (siehe video-overlays, falls du es hast).
9. Punch-ins (optionale dritte Timeline)
Statische Bildausschnittsvariation macht einen Talking-Head sehenswert. Resolves API hat keinen Keyframe-Zugriff, also sind langsame Zoom-Fahrten unmöglich zu automatisieren; statische Clip-für-Clip-Bildausschnitte („ab und zu ist einer der Clips ein bisschen mehr hereingezoomt“) sind das, was du tun kannst.
Binde jede Änderung an das Transkript, niemals an einen Timer. Eine timerbasierte Version fühlte sich zufällig an. Zoome auf die schweren Sätze oder dort, wo ein neues Thema beginnt, sodass es Sinn ergibt.
Schreibe <work>/framing.json:
[{"clip":"C0002","at":361.40,"framing":"med","why":"TIP 3"},
{"clip":"C0002","at":371.80,"framing":"close","why":"'das ist der Teil, der zählt'"}]
at ist der Satzanfang aus sentences.py. Dann python3 <skill>/scripts/punchins.py "<work>" und setze "punchins": true in params.json. Es teilt ein Segment, wo immer eine Markierung hineinfällt, am leisesten Punkt nahe dem Satzanfang, weil Talking-Heads oft lange ohne Pause laufen und die Änderung sonst zu spät kommt.
Wenn der Benutzer v2 in Resolve von Hand nachbearbeitet hat, ist seine Timeline der Schnitt. Lese dessen Elemente (GetLeftOffset/GetDuration, Frames x 1.001/24 = Sekunden) in segments-locked.json, führe mit SEGMENTS=segments-locked.json aus und füge nur v3 zum bestehenden Projekt mit "timelines": ["v3"] hinzu. Ziel: eine Änderung alle ~20-40s: Weit bei jedem neuen Thema, Mittel für Lehre, Nah auf der schweren Zeile. Der Builder setzt bei jeder Änderung einen blauen Marker mit dem Grund, damit die Logik sichtbar ist.
Bildausschnitte: wide 1,00, med 1,11 (Neigung -12), close 1,21 (Neigung -24).
Wenn der Benutzer v2 beim Trimmen farblich angepasst hat, wird v3 von Grund auf nur mit dem LUT gebaut, also kopiere die v2-Korrektur direkt nach dem Bau auf v3:
src = v2.GetItemListInTrack("video", 1)[5] # ein beliebiges farblich angepasstes v2-Element
src.CopyGrades(v3.GetItemListInTrack("video", 1)) # funktioniert Timeline-übergreifend; Zoom/Neigung überleben
Überprüfe mit GetNodeGraph().GetToolsInNode(1) auf jedem v3-Element. Verwende nicht den Gallery-Weg (GrabStill + ExportStills nach .drx): Der Export gibt über die API False zurück. Wenn GrabStill verwendet wurde, lösche das Still, damit die Gallery sauber bleibt.
Lesen einer gesperrten v2: GetLeftOffset() und GetDuration() liefern Quell-Frames. Das erste Segment verrät dir, ob der Aufhänger getrimmt wurde. Vergleiche die gesperrten Segmente mit segments-v2.json und notiere, was sich geändert hat, um den nächsten Schnitt zu kalibrieren.
10. Farbkorrektur
Setze "lut": "<LUT_PATH>" in params.json, um es auf jeden Clip auf Node 1 anzuwenden. Wenn die Kamera ein Log-Profil aufzeichnet (z.B. S-Log3), sieht unbearbeitetes Material flach und grau aus, also ist ein LUT sinnvoll. Die API kann keinen zweiten Node hinzufügen; für eine Multi-Node-Korrektur korrigiere einen Clip von Hand und verteile sie mit CopyGrades.
11. Fotos über dem Gespräch (optional)
Wenn der Sprecher über etwas spricht, wovon er Standbilder hat, lege sie auf V2 von v3, auf einem weißen Hintergrund.
- Karten, keine Diashow. Rendere 1920x1080 PNGs auf reinem Weiß: drei Porträts nebeneinander (skaliert auf h840, 50px Abstände), zwei Porträts (h880, 60px Abstand) oder ein Querformat (h900). Gruppiere Fotos nach dem, was gesagt wird.
- Timing jeder Karte auf einen Satzanfang aus dem gesperrten Transkript, wechsle die Karten beim nächsten Satz. Etwa 2-5s pro Karte. Bleibe auf den Fotos nur, während sie beschrieben werden.
- Importiere sie als exakt lange ProRes .mov, nicht als Standbilder. Standbilder kommen in Resolve mit einer festen 2s und überlappen sich. Nummerierte Namen (
card1.png,card2.png) werden als einzelne Bildsequenz importiert, verwende also Wortnamen. Rendere mitffmpeg -loop 1 -framerate 24000/1001 -i x.png -frames:v N -c:v prores_ks -profile:v 3. - Für ein .mov benötigt
AppendToTimelineendFrame= die Framzahl (nicht count-1), sonst landet jede Karte einen Frame zu kurz und der Sprecher erscheint zwischen den Karten. Übergib"mediaType": 1, damit kein Audio mitkommt. - Nenne die Spur „ Fotos“, lege die Karten in ihren eigenen Media-Pool-Ordner und lege niemals den LUT darauf (sie sind bereits korrigiert).
- Zeige dem Benutzer vor dem Platzieren ein Kontaktblatt der Karten im Chat.
Wissenswerte Fakten
- Kalibrierung von echten Schnitten: nach einer v2 entfernt der Ersteller typischerweise 10-20s von Hand bei einem ~10-minütigen Schnitt. Meistens sind es frame-genaue Anpassungen an Segmentkanten, plus neu formulierte Zeilen, wo ein Punkt gesagt und dann innerhalb weniger Sekunden besser wiederholt wird. Wenn ein Satz den vorhergehenden neu formuliert, schneide die erste Version. Dies unterscheidet sich von bewusster pädagogischer Wiederholung, die eine Phrase über Abschnitte hinweg wiederholt, nicht hintereinander. Wenn ein Punkt weit auseinander zweimal gemacht wird, markiere die schwächere Aufnahme als möglichen Schnitt.
- Die übliche Sorge ist, zu viel zu schneiden, so dass Dinge wieder hinzugefügt werden müssen, also straffe nur bei Beweisen, niemals aus dem Bauch heraus.
- Beispiel-Quellformat: 4K 23.976 MP4 mit 48 kHz Audio; Ausgabe-Timeline 1920x1080 23.976, beginnend bei 01:00:00:00. Passe
fps/width/heightinparams.jsonan dein Material an. - Timecode bei 23.976 zählt 24 Frames pro Timecode-Sekunde:
frames = round(seconds / 1.001 * 24). AppendToTimelinebehandeltendFrameals exklusiv: übergib den Frame nach dem letzten, den du haben möchtest. Eine „inklusiv, minus 1“-Regel lässt einen Frame aus jedem Segment fallen (etwa 4s über eine 10-minütige Timeline, und jedes 1-Frame-Segment verschwindet).- Manche Sprecher verwenden fast keine Füllwörter; überprüfe dies, bevor du auf Füllwortentfernung setzt.
- Ungefähr 20% des rohen Talking-Head-Materials ist entfernbar, und etwa drei Viertel davon sind Urteilssache (Takes und Neustarts), ein Viertel ist tote Luft.
- Whisper-Modell:
ggml-small.en.binist genau genug; es hört einige Wörter falsch, was für Schnittpunkte keine Rolle spielt, aber sehr wohl, wenn du den Sprecher zitierst.
Verwandtes
video-overlays: animierte Grafiken, ausführen nachdem der Schnitt gesperrt ist (falls installiert)video-reels: vertikale Ausschnitte aus demselben Material (falls installiert)video-thumbnails: Thumbnails und Titel (falls installiert)lapel-sync: zuerst ausführen, wenn Audio auf einem separaten Ansteckmikrofon/Recorder aufgezeichnet wurde