Was macht Geschmacksdestillation?
Dieses eigenständige Skill liefert seine Implementierung in scripts/ aus. Verwende taste-application für die anschließende generierte oder lokale Bearbeitung. Jedes benannte Genre bleibt in einem eigenen Paket. Messungen von Flash Ethereal dürfen nicht stillschweigend für Fluid Sketch oder 3D Cyber Glitch wiederverwendet werden. Eine gemessene Null ist ein gültiger Datenpunkt; unterscheide sie von einem fehlenden Feld.
Lokale Abhängigkeiten befinden sich in scripts/requirements.txt. Separate autorisierte Provider-Arbeiten benötigen ebenfalls scripts/requirements-live.txt, Anmeldedaten und explizit TASTE_FORGE_ALLOW_LIVE=1. --dry-run liest keine Anmeldedaten und sendet keine Aufträge. Gehe nie davon aus, dass ein Workflow von einem lokalen Endpunktnamen gespeichert wurde; verwende die tatsächlichen Provider-seitigen Workflow- oder Anfragedaten.
Verwandle Referenzvideos in ein Style-Pack: einen Ordner mit Messungen und Assets, die spätere Schritte deterministisch verarbeiten.
Wann zu aktivieren
- "Halte den Look dieser Clips fest" / "Destilliere den Vibe" / "Mach das reproduzierbar"
- Der Benutzer hat Referenzmaterial und möchte eine LUT, eine Gradierung oder passendes Timing
- Aufbau einer Look-Bibliothek, aufgeteilt nach Genres
- Jede Anfrage, deren Antwort sonst "Beschreibe den Stil in einem Prompt" wäre
Die Kern-Erkenntnis
Ein Prompt liefert keine Gradierung. Messung schon.
Gemessen an echtem Filmmaterial: Drei bezahlte Generationen mit zunehmender Farbrichtung bewegten den Mittelton a* von +1,9 → +2,8 → +0,3 gegenüber einem +24,9 Zielwert, und der Kontrast verließ niemals ~19 gegenüber einem 34,7 Zielwert. Die Anwendung eines gemessenen Pakets auf dasselbe Material erzielte in einem deterministischen Durchlauf einen Chroma-MAE von 1,88 und einen Kontrast von 33,7, kostenlos.
Die Aufteilung ist also: Das Modell liefert Inhalt, Bewegung und Lichtstruktur; das Paket liefert den Look. Farbwörter in einem Generierungsprompt sind schlimmer als nutzlos – sie kosten Geld und treiben das Rendering von der neutralen Basis weg, die die LUT wünscht. Sage dies explizit im Prompt: "Farbe: keine. Neutral rendern. Gradierung wird nachträglich angewendet."
Was ein Paket enthält
stylepacks/<genre>/
grade.json gemessene Farbstatistiken (siehe unten)
cadence.json jede erkannte Schnittgrenze + die abgeleitete Verteilung
look.cube 33^3 LUT, direkt in Resolve als Knoten-LUT einfügbar
spec.json VLM-Beschreibung, basierend auf den Messungen
grounding.txt die gemessenen Fakten, die dem VLM übergeben wurden
stills/ Vollauflösungs-Frames der längsten Einstellungen (Konditionierungsbilder)
plates/ Screen-Blend-Overlay-Elemente, auf Schwarz gehoben
props/ gemünzte GLB-Meshes
pack.json Manifest
Ausführung
python mint.py --genre <name> --refs a.mov b.mov c.mov # offline, kein API-Key
python distill.py --genre <name> # ein VLM-Aufruf
mint.py ist eine rein numerische Analyse – kein Netzwerk, kein Schlüssel, deterministisch, sodass ein Paket neu erzeugt statt gesichert werden kann.
Die relevanten Messungen
Chroma nach Leuchtdichte-Zone, nicht global
Eine Farbidentität lebt normalerweise in einem Leuchtdichteband. Ein globaler a*/b*-Offset mathematisch unmöglich Split-Toning abbilden. Miss Chroma innerhalb von Zonen (L* Kanten [0,15,35,55,75,100]).
Ein echtes Merkmal: Violett bei L25 (a +24,9, b* −17,5), nahezu neutral an beiden Enden. Die Angabe nur der dunkelsten und hellsten Zonen nennt das "einheitlichen Stich" – drucke immer die ganze Kurve.
Median + MAD, niemals Mittelwert + Std
Chroma ist in echten Referenzsets stark rechtsschief. Bei einem gemessenen Band lag der mittlere Mittelton-Chroma bei 36,9 gegenüber einem Median von 17,5 – daher drückte eine mittelwertbasierte LUT die Farbe etwa 3x stärker als das Material rechtfertigte.
Kontrast ist std(L*), nicht Weiß minus Schwarz
Die Weiß−Schwarz-Spanne liegt bei fast jedem echten Filmmaterial bei ~100 und diskriminiert nichts.
Hintergrundanteil ist eine Statistik erster Klasse
Erfasse den Anteil der Pixel unter L*10. Kein Moment der Verteilung kann das sehen: ein Clip kann den richtigen Mittelwert, die richtige Std und das richtige Chroma haben, während seine Schwarztöne zu Grau angehoben wurden. Genau so erzielte eine Gradierung einmal MAE 1,88 / Kontrast 33,7, während das tatsächliche Bild ein matschiges lila Durcheinander war.
Maskiere die Benutzeroberfläche vor der Messung
Bildschirmaufgezeichnete Referenzen tragen statische Möbel – Letterbox-Balken, eine Statusleiste, ein Like-Icon, Untertiteltext. All das landet in den Statistiken, als wäre es der Look: schwarze Balken blähen den Schattenanteil auf, ein rotes Herz verschiebt a* in Richtung Magenta. Temporale Varianz trennt sie sauber – das Filmmaterial bewegt sich, die Oberfläche nicht – daher ist kein manuell eingestellter Zuschnitt nötig. Bei echtem Material bleiben so ~65 % der Pixel erhalten.
Kadenz benötigt eine adaptive Schwelle
Der richtige Content-Detector-Schwellwert ist materialabhängig: Ein kontrastreicher Action-Referenzschneidet hart genug für 30, ein stimmungsvoller versteckt seine Schnitte darunter. Durchlaufe absteigende Schwellwerte und nimm den höchsten, der immer noch ≥90 % der von der empfindlichsten Einstellung gefundenen Einstellungen wiederherstellt – das tendiert zu echten Schnitten statt Rauschen. Lehne Schwellwerte ab, die eine absurde Schnittrate (>100/min) implizieren; kontinuierliche Kamerabewegungen lösen den Detektor bei jedem Frame aus.
Führe den gesamten Durchlauf in einem Dekodierungsdurchlauf mit einem gemeinsamen StatsManager durch. Die naive Version dekodiert für jeden Schwellwert neu, was bei einer 60fps-Quelle den Unterschied zwischen Sekunden und Minuten ausmacht.
Overlay-Platten: Assets, keine Screenshots
Ein Standbild ist ein ganzer Frame – Compositing fügt nur ein zweites Bild darüber. Eine Platte ist das grafische Vokabular der Referenz (Flares, Streaks, Glitch-Fragmente), auf Schwarz gehoben, sodass es als Screen-Blend ohne Keying überlagert werden kann.
Zwei Fallstricke, beide an echtem Material aufgetreten:
- Absolute Schwellwerte versagen. Bei einer hellen Referenz nimmt eine Auswahl von
L>55 AND chroma>12~90 % des Frames ein, und die "Platte" ist das Bild – einschließlich eines erkennbaren Gesichts. Wähle nach Perzentil (~top 3 %) aus und lehne jede Platte ab, die mehr als ~22 % des Frames bedeckt. - Sortiere nach Trennung, nicht nach Helligkeit. "Anteil heller, gesättigter Pixel" reiht ein ausgewaschenes Bild ganz oben und ein schwarzes Bild mit einem intensiven Flare – die eigentliche Signatur – ganz unten ein. Punktzahl:
p99.5(energie) / median(energie).
Maskiere auch vor der Bewertung: eingebrannte Typografie ist hell, gesättigt und kontrastreich, daher ergibt eine unmaskierte Ausführung eine perfekte Platte der Titelcard von jemand anderem.
Grundierung des VLM
Füttere die Messungen in den System-Prompt ein, bevor du eine Beschreibung anforderst. Ungrounded meldet ein VLM "Keine offensichtliche Farbkorrektur, neutral" bei Filmmaterial mit einem +24,9 a*-Stich. Grounded beschreibt es den Stich korrekt und leitet unabhängig den sekundären Akzent ab.
Verbiete Hedging-Wörter (variiert, gemischt, dynamisch, etwas, oft, neutral, oder) – ein Modell kann "variierte Beleuchtung" nicht rendern. Erzwinge das Verbot im Code, nicht nur im Prompt: es wurde etwa in einem von drei Durchläufen verletzt. Frage feldweise erneut an, behalte die am wenigsten gehedgte Antwort nach N Versuchen, anstatt zu scheitern.
Einschränkung, die dem Benutzer mitgeteilt werden sollte: Sobald die Vorgabe in den Messungen verankert ist, ist sie keine unabhängige Überprüfung mehr.
LUT-Baking-Fallstricke
- Eine LUT kann nur eine Pixel-für-Pixel-RGB-Funktion codieren. Alles Verteilungsabhängige (Histogramm-Matching, Perzentilanker) muss vor dem Baking auf eine Konstante reduziert werden, sonst misst es stillschweigend das gleichmäßige LUT-Gitter anstelle des Filmmaterials.
cv2.cvtColor(LAB2RGB)clamped intern, daher meldet ein Out-of-Gamut-Test mit dieser Funktion 0 %. Konvertiere Lab→lineares sRGB von Hand; eine echte Messung ergab 83,3 % OOG.- Verschiebe Chroma per Offset, nicht affin. Affin teilt durch die Quell-σ und überschießt – bei echtem Material drehte es b* auf +11,6 gegenüber einem −17,5 Ziel. Offset senkte den MAE von 6,23 auf 2,13.
- Gamut-Kompression kostete 3,8x Laufzeit für identischen MAE. Mach es opt-in.
Anti-Patterns
| Nicht tun | Warum |
|---|---|
| Gegen synthetisches Testmaterial optimieren | Kostete vier separate Fehlschlüsse in einem Projekt; echtes Filmmaterial widerlegte jeden einzelnen |
| MAE allein vertrauen | 1,88 MAE wirkte wie Erfolg bei einem sichtbar kaputten Frame |
| Mittelwert/Std für Chroma verwenden | Rechtsschief; drückt ~3x zu stark |
| Nur Endpunktzonen vergleichen | Beide Enden sind konstruktionsbedingt nahezu neutral |
| Den Look beschreiben und aufhören | Die Vorgabe ist für Inhalt und Struktur; das Paket ist für den Look |
Übergabe
Das Paket ist die Schnittstelle. Sobald es existiert, verwende das Skill taste-application, um dagegen zu generieren und zu montieren, oder übergebe look.cube direkt an einen Coloristen.
Gebündelter Code
scripts/ in diesem Skill ist eine funktionierende Implementierung, kein Pseudocode. Es enthält keine projektspezifischen Annahmen: Richte es auf beliebige Referenzvideos und es erzeugt ein Paket.
pip install -r scripts/requirements.txt
export FAL_KEY=... # nur für die Phasen nötig, die fal aufrufen
Jeder Netzwerkaufruf ist unter TASTE_FORGE_DRY_RUN=1 oder --dry-run gestubbt, sodass der Plan, die Prompts, das Track-Layout und das Manifest ohne Kosten inspiziert werden können.