Communitygithub.com

Papier-Schnitt (Paper edit)

Verwandle rohes Talking-Head-Material in einen zusammengesetzten Grobschnitt in DaVinci Resolve. Extrahiert Clips von deinem Laufwerk, transkribiert sie lokal, entfernt fehlgeschlagene Takes, Nebenbemerkungen und tote Luft und erstellt ein neues Resolve-Projekt mit zwei Timeline-Entwürfen für den Feinschnitt.

Was ist Papier-Schnitt (Paper edit)?

Diese Skill automatisiert den ersten großen Schnitt eines Talking-Head-Videos, indem sie rohe Kameradateien analysiert, lokal transkribiert und einen Grobschnitt in DaVinci Resolve erstellt. Sie ist ideal für YouTuber: Claude übernimmt die grobe Auswahl (fehlgeschlagene Takes, falsche Starts, Nebenbemerkungen und tote Luft entfernen), während der Ersteller den Feinschliff macht. Die Skill unterstützt macOS mit ffmpeg, whisper.cpp und einem Resolve MCP Server. Nach der Transkription erstellt sie zwei Timelines: „Paper Edit v1“ (nur Urteilschnitte) und „Paper Edit v2“ (zusätzlich Pausenverkürzung). Optionale dritte Timeline für „Punch-ins“ (statische Einzoomen) und Overlays wie Fotos. Die Skill passt sich an Schnittänderungen des Erstellers an und kopiert Farbkorrekturen auf die neue Timeline.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beachyphotoandfilm-arch/video-skills/tree/HEAD/skills/paper-edit

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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

PlatzhalterBedeutungBeispiel
<FOOTAGE_DRIVE>Wo das Rohmaterial liegt, ein Ordner pro Video/Volumes/MyWorkDrive
<LUT_PATH>Optionaler LUT, relativ zum LUT-Ordner von ResolveMyLuts/SLog3-to-709.cube
WHISPER_MODEL (env)whisper.cpp ModelldateiStandard ~/.cache/whisper-models/ggml-small.en.bin
RESOLVE_APP (env, optional)Resolve-App-Pfad bei AbweichungStandard /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 to des behaltenen Wortes, niemals bei seinem from. 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 mit from|to fü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 (ffmpeg astats), 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 mit ffmpeg -loop 1 -framerate 24000/1001 -i x.png -frames:v N -c:v prores_ks -profile:v 3.
  • Für ein .mov benötigt AppendToTimeline endFrame = 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/height in params.json an dein Material an.
  • Timecode bei 23.976 zählt 24 Frames pro Timecode-Sekunde: frames = round(seconds / 1.001 * 24).
  • AppendToTimeline behandelt endFrame als 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.bin ist 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

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

beachyphotoandfilm-arch/video-skills

Sync camera footage to a separate lapel or field-recorder track (e.g. Tascam DR-10L and similar) and lay it up in DaVinci Resolve. Stitches the recorder's split files, finds each clip's exact place in the audio by matching words then waveforms, cuts one lapel slice per clip so every later skill works unchanged, checks for clipping, and builds a synced timeline in a new Resolve project. Trigger on "sync the lapel", "sync my audio", "line up the recorder", "I used a lav", or any shoot with a separate audio folder (live talks, events, workshops). Run it before paper-edit or video-reels.

beachyphotoandfilm-arch/video-skills

Design a unique Instagram cover for each reel in your house style. Reads what the reel is about, writes a short hook headline, picks one of your own photos from a tagged photo library, lays it out like your existing covers, and proofs it in grid view at phone size. Renders locally, never with AI image generation. Can be called by a scheduling skill before reels are scheduled. Trigger on "make covers", "reel covers", "cover photo for this reel", "design the IG covers".

beachyphotoandfilm-arch/video-skills

Render finished reels out of DaVinci Resolve, write captions in the creator's voice, attach a custom Instagram cover from reel-covers, and schedule them to Instagram, TikTok and YouTube Shorts through Metricool. Handles the Drive upload hop, collision checks against the existing calendar, and cleanup. Trigger on "schedule the reels", "post these", "put these on the calendar", or after reels are approved.

beachyphotoandfilm-arch/video-skills

Build animated brand overlays (motion graphics) for a talking-head video, timed to the speaker's exact words, plus a DaVinci Resolve import file. House style is in-scene type (text beside and behind the speaker's head) plus diagrams. Transcribes the rough cut locally, picks the moments, renders transparent .mov clips, and writes an FCPXML that drops every clip onto the timeline already in position. Trigger on "make animations for this video", "add overlays/motion graphics", "animate this", "b-roll graphics for my YouTube video", or when the user shares a rough cut and asks for graphics.

beachyphotoandfilm-arch/video-skills

Cut vertical Instagram reels out of a long-form talking-head video, hook first. Picks the strongest standalone moments from the transcript, opens each reel on its punchiest line, builds vertical timelines in DaVinci Resolve framed on the speaker's face with the LUT applied, and finishes them: a hook (a held text card, or a word-by-word "build" hook with punch-in) and burned-look captions on V3; this-or-that reels get product graphics and a comment-keyword CTA card. You trim and render, nothing to import. Trigger on "make reels", "clip this for Instagram", "cut some verticals", or after a YouTube video is cut.

beachyphotoandfilm-arch/video-skills

Design YouTube thumbnails and titles for a talking-head video. Pulls graded full-res frames out of the raw footage, renders brand-styled variants in two proven layouts, and proofs them at phone size where the click actually gets decided. Trigger on "make thumbnails", "thumbnail for this video", "title and thumbnail", or after a video is cut.

beachyphotoandfilm-arch/video-skills

Run the whole YouTube video pipeline end to end, one stage at a time, stopping for the creator's approval at every gate. Paper edit, punch-ins, reels, reel covers, scheduling the reels, overlays, thumbnail and title, then scheduling the long-form video, all through Metricool. Keeps state per video so you can stop anywhere and pick up later. Trigger on "/youtube", "let's do the whole video", "run the video pipeline", "continue the <name> video", or when handed raw footage for a YouTube video.

Verwandte Skills