Add cutter report and auto-regen on each match

- New CUTTER_REPORT.md: per-beat hand-off table for the video editor doing
  the manual recut. Per beat: trailer SMPTE in/out, source SMPTE in/out,
  scene id, score, status (OK / ? / MAN.), and a one-line phase
  description from the cached vision text.
- New scripts/generate_cutter_report.py: pure renderer that reads the
  current cache (match_results.json + trailer_beats.json + optional
  vision_descriptions.json) and writes CUTTER_REPORT.md. No side effects on
  the cache.
- cli.py: after every successful match the cutter report is regenerated
  automatically (best-effort; failures are logged and do not abort).
- README.md: new top-section "Fuer den Cutter" describing exactly what the
  editor needs (which two files to look at, how the status flag works,
  the recommended NLE workflow). The technical algorithm description
  follows below.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Melbar
2026-05-04 13:09:16 +02:00
parent 06a2326bf1
commit 97a8f9e305
4 changed files with 390 additions and 25 deletions
+51 -15
View File
@@ -1,27 +1,63 @@
# AI Trailer Generator v2
**Frame-accurate trailer reconstruction via pure Computer Vision**
**Frame-genaues Nachbauen eines Trailers aus dem Quellfilm.**
> Gibt einen Reference Trailer und den dazugehörigen Quellfilm hinein — bekommt eine fertige FCPXML/EDL heraus, die den Trailer Frame-genau aus dem Quellfilm nachbaut.
Du gibst zwei Videos rein — einen Referenz-Trailer und den dazugehörigen
Spielfilm — und bekommst eine fertige FCPXML/EDL für deinen Schnittplatz, die
den Trailer Beat für Beat aus dem Quellfilm nachbaut.
---
## Das Kernprinzip
## Für den Cutter — was du wirklich brauchst
Standardmäßig kein LLM für visuelles Matching. Optional kann ein Vision-Layer
gecachte 3-Frame-Beschreibungen als zusätzliche Suchanker liefern; der finale
Match bleibt aber CV-verifiziert.
Du musst dieses Tool **nicht selbst bedienen** und musst **kein Python können**.
Was du bekommst sind zwei Dateien, mit denen du arbeitest:
| Phase | Was passiert | Technologie |
|-------|-------------|-------------|
| **0 — Prep** | Reference Trailer analysieren & Beats extrahieren | PySceneDetect + OpenCV |
| **1 — Global Scan**| Gesamten Quellfilm via FFmpeg-Stream (2 FPS) gegen alle Beats scannen | FFmpeg Pipe + Luma-Histogramm |
| **1b — Optional Vision Seeds** | Unsichere Top-K Szenen mit 3-Frame-Beschreibungen cachen | OpenAI-kompatibles Vision-LLM |
| **2 — Refine** | Beste Treffer auf Frame-Ebene präzisieren | OpenCV `matchTemplate` |
| **3 — Dramaturgie** | Narrative BeatType-Klassifikation aus Dialog-Text | OpenRouter LLM |
| **4 — Export** | Timeline → FCPXML 1.10 oder CMX 3600 EDL | xml.etree + eigener Timecode-Layer |
1. **`CUTTER_REPORT.md`** — die Tabelle für die manuelle Kontrolle und das
Nachschneiden. Pro Beat steht drin:
- der Trailer-Zeitcode (h:mm:ss:ff),
- der vorgeschlagene Source-Zeitcode aus dem Spielfilm,
- ein Status: `OK` (kann übernommen werden), `?` (bitte sichten) oder
`MAN.` (kein Treffer, manuell setzen),
- eine kurze Beschreibung, was im Trailer-Beat zu sehen ist (damit du
die richtige Stelle im Source schneller findest).
2. **`output/*.fcpxml`** und **`output/*.edl`** — die fertige Timeline für
FCP / Premiere / Avid / Resolve. Beats mit Status `OK` sind dort schon
richtig gesetzt; `?` und `MAN.` musst du im NLE prüfen bzw. selbst setzen.
**Text-Safe Crop:** Obere 15% und untere 30% des Frames werden vor jedem Vergleich ausgeblendet, um Title Cards, Logos und Letterbox zu ignorieren.
**Workflow-Empfehlung:**
1. Öffne `CUTTER_REPORT.md` und arbeite die Tabelle von oben nach unten ab.
2. Importiere die FCPXML/EDL ins NLE, lade Trailer und Spielfilm dazu.
3. Bei `OK`-Beats nur stichprobenartig sichten.
4. Bei `?`-Beats den Vorschauclip aus dem Report-HTML (siehe unten) prüfen
und im NLE den Source-In um wenige Frames vor/zurück verschieben, bis die
Bewegungsphase exakt zum Trailer passt.
5. Bei `MAN.`-Beats selbst die passende Stelle im Spielfilm suchen — die
Beschreibung im Report sagt dir was du suchst.
Alles andere unten ist Hintergrund für den Tool-Verantwortlichen.
---
## Wie das Tool die Treffer findet (Kurzfassung)
| Phase | Was passiert |
|-------|--------------|
| **0** | Trailer in Beats zerlegen (PySceneDetect). |
| **1** | Schneller Vibe-Check: für jeden Beat die Top-K ähnlichsten Szenen aus dem Spielfilm vorauswählen (Histogramm + pHash). |
| **2** | Optional: Vision-LLM beschreibt unsichere Szenen mit 3-Frame-Samples; die Beschreibungen liegen gecached vor. |
| **3** | Frame-genaue Verfeinerung pro Beat (OpenCV-Templatematching, Bewegungsphasen-Vergleich). |
| **4** | Phasen-Reparatur: bei segmentierten Beats wird die Bewegungsphase im Source mit der sichtbaren Trailerphase abgeglichen. |
| **5** | Recovery: Beats ohne Treffer werden via Vision-Phasensuche in den Top-K Szenen nochmal probiert. |
| **6** | Export als FCPXML 1.10 oder CMX-3600-EDL plus `CUTTER_REPORT.md`. |
**Text-Safe Crop:** Obere 15 % und untere 30 % jedes Frames werden vor dem
Vergleich ausgeblendet, damit Title-Cards, Logos und Letterbox die Treffer
nicht verfälschen.
**Wichtig:** Auch wenn Vision aktiviert ist — der finale Match bleibt
CV-verifiziert. Das LLM liefert nur zusätzliche Suchanker.
---