Was macht Geschmacks-Destillation?
Diese eigenständige Fertigkeit bringt ihre Implementierung in scripts/ mit. Verwende taste-application für die anschließende generierte oder lokale Bearbeitung. Behalte jedes benannte Genre in einem eigenen Paket. Messungen von „Flash Ethereal“ dürfen nicht stillschweigend für „Fluid Sketch“ oder „3D Cyber Glitch“ wiederverwendet werden. Ein gemessener Nullwert sind gültige Daten; unterscheide ihn von einem fehlenden Feld.
Lokale Abhängigkeiten befinden sich in scripts/requirements.txt. Für separat autorisierte Anbieter-Arbeiten werden außerdem scripts/requirements-live.txt, Anmeldeinformationen und der explizite Schalter TASTE_FORGE_ALLOW_LIVE=1 benötigt. --dry-run liest keine Anmeldeinformationen und sendet keine Aufträge ab. Leite niemals daraus ab, dass ein Workflow von einem lokalen Endpunkt-Namen gespeichert wurde; verwende stattdessen den tatsächlichen anbieterseitigen Workflow oder Anfragebelege.
Wandle Referenzvideos in ein Stilpaket um: einen Ordner mit Messungen und Assets, die von späteren Phasen deterministisch konsumiert werden.
Aktivierungsbedingungen
- „Erfasse den Look dieser Clips“ / „Destilliere die Stimmung“ / „Mach dies wiederholbar“
- Der Nutzer hat Referenzmaterial und möchte eine LUT, eine Gradierung oder eine passende Kadenz
- Aufbau einer Bibliothek von Looks, aufgeteilt nach Genre
- Jede Anfrage, deren Antwort andernfalls „Beschreibe den Stil in einem Prompt“ wäre
Die Kern-Erkenntnis
Ein Prompt kann keine Gradierung liefern. Messung kann das.
Gemessen an echtem Filmmaterial: Drei kostenpflichtige Render-Durchgänge mit zunehmender Farbsteuerung bewegten das Mittelton-a* von +1,9 → +2,8 → +0,3 gegenüber einem +24,9 Zielwert, und der Kontrast verließ nie ~19 gegenüber einem 34,7 Zielwert. Die Anwendung eines gemessenen Pakets auf dasselbe Filmmaterial erzielte einen Chroma-MAE von 1,88 und einen Kontrast von 33,7 in einem einzigen deterministischen Durchlauf – kostenlos.
Die Aufteilung ist also: Das Modell liefert Inhalt, Bewegung und Lichtstruktur; das Paket liefert den Look. Farbwörter in einem Generierungs-Prompt sind schlimmer als nutzlos – sie kosten Geld und treiben den Render vom neutralen Basisbild weg, das die LUT benötigt. Sage dies explizit im Prompt: „Farbe: keine. Neutral darstellen. Die Gradierung erfolgt nachträglich.“
Inhalt eines Pakets
stylepacks/<genre>/
grade.json gemessene Farbstatistiken (siehe unten)
cadence.json jede erkannte Einstellungsgrenze + die daraus abgeleitete Verteilung
look.cube 33^3 LUT, direkt in Resolve als Node-LUT ladbar
spec.json VLM-Beschreibung, fundiert durch die Messungen
grounding.txt die gemessenen Fakten, die dem VLM übergeben wurden
stills/ Vollauflösungsframes aus den längsten Einstellungen (Conditioning-Bilder)
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-Schlüssel
python distill.py --genre <name> # ein VLM-Aufruf
mint.py ist reine numerische Analyse – kein Netzwerk, kein Schlüssel, deterministisch, sodass ein Paket neu generiert statt gesichert werden kann.
Die relevanten Messungen
Chroma nach Luminanzzonen, nicht global
Die Farbidentität lebt normalerweise in einem Luminanzband. Ein globaler a*/b*-Offset kann Splittoning mathematisch nicht darstellen. Miss Chroma innerhalb von Zonen (L*-Grenzen [0,15,35,55,75,100]).
Ein echtes Signatur: Violett bei L25 (a +24,9, b* −17,5), nahezu neutral an beiden Enden. Nur die hellsten und dunkelsten Zonen zu melden, bezeichnet das als „gleichmäßigen Farbstich“ – drucke immer die gesamte Kurve.
Median + MAD, niemals Mittelwert + Std
Die Chroma in echten Referenzmengen ist stark rechtsschief. In einem gemessenen Filmstreifen lag der mittlere Mittelton-Chroma bei 36,9 gegenüber einem Median von 17,5, sodass eine mittelwertbasierte LUT die Farbe etwa 3x stärker drückte, als das Material rechtfertigte.
Kontrast ist std(L*), nicht Weiß minus Schwarz
Der Weiß−Schwarz-Bereich liegt bei fast jedem echten Filmmaterial bei ~100 und unterscheidet nichts.
Der Hintergrundanteil ist eine erstklassige Statistik
Erfasse den Anteil der Pixel unter L*10. Kein Moment der Verteilung kann dies erkennen: Ein Clip kann den richtigen Mittelwert, die richtige Std und das richtige Chroma aufweisen, während seine Schwarzwerte ins Graue gehoben wurden. Genau so erreichte eine Gradierung einst MAE 1,88 / Kontrast 33,7, während das tatsächliche Bild eine matschige lila Katastrophe war.
Maskiere die Benutzeroberfläche vor der Messung
Bildschirmaufgezeichnete Referenzen tragen statische Möbel – Letterbox-Balken, eine Statusleiste, ein Like-Symbol, Untertiteltext. All das landet in den Statistiken, als wäre es der Look: Schwarze Balken blähen das Schattengewicht auf, ein rotes Herz verzerrt a* in Richtung Magenta. Temporale Varianz trennt sie sauber – das Filmmaterial bewegt sich, die Benutzeroberfläche nicht –, sodass kein manueller Zuschnitt nötig ist. Bei echtem Material bleiben so ~65 % der Pixel erhalten.
Kadenz benötigt einen adaptiven Schwellenwert
Der richtige Content-Detektor-Schwellenwert ist materialabhängig: Ein kontrastreicher Action-Referenzclip schneidet hart genug für 30, ein stimmungsvoller versteckt seine Schnitte darunter. Durchlaufe absteigende Schwellenwerte und nimm den höchsten, der immer noch ≥90 % der Einstellungen wiederfindet, die die empfindlichste Einstellung findet – das begünstigt echte Schnitte gegenüber Rauschen. Verwerfe Schwellenwerte, die eine absurde Schnittrate (>100/Minute) implizieren; kontinuierliche Kamerafahrten lösen den Detektor in jedem Bild aus.
Führe den gesamten Durchlauf in einem Dekodierungs-Durchgang mit einem gemeinsamen StatsManager aus. Die naive Version dekodiert pro Schwellenwert neu, was bei 60fps-Quelle den Unterschied zwischen Sekunden und Minuten ausmacht.
Overlay-Platten: Assets, Keine Screenshots
Ein Standbild ist ein vollständiger Frame – das Compositing eines solchen legt nur ein zweites Bild darüber. Eine Platte ist das grafische Vokabular des Referenzmaterials (Flächen, Streifen, Glitch-Fragmente), das auf Schwarz gehoben wurde, sodass es ohne Keying per Screen-Blend mischt.
Zwei Fallstricke, beide an echtem Material getroffen:
- Absolute Schwellenwerte versagen. Bei einer hellen Referenz erfasst eine
L>55 AND chroma>12-Auswahl ~90 % des Frames, und die „Platte“ ist das Bild – inklusive eines erkennbaren Gesichts. Wähle nach Perzentil (~obere 3 %) und lehne jede Platte ab, die mehr als ~22 % des Frames bedeckt. - Sortiere nach Trennung, nicht nach Helligkeit. „Anteil heller, gesättigter Pixel“ setzt ein verwaschenes Bild an die Spitze und ein schwarzes Bild mit einer intensiven Fläche – der eigentlichen Signatur – ans Ende. Bewerte
p99.5(Energie) / median(Energie).
Maskiere außerdem vor der Bewertung: Eingebrannte Typografie ist hell, gesättigt und kontrastreich, daher liefert ein unmaskierter Durchlauf eine perfekte Platte der Titelkarte eines anderen.
Fundierung des VLM
Füge die Messungen in den System-Prompt ein, bevor du eine Beschreibung anforderst. Unfundiert meldet ein VLM „keine offensichtliche Farbkorrektur, neutral“ für Filmmaterial mit einem a*-Farbstich von +24,9. Fundiert beschreibt es den Farbstich korrekt und leitet die sekundäre Akzentfarbe unabhängig ab.
Verbiete abschwächende Wörter (unterschiedlich, gemischt, dynamisch, etwas, oft, neutral, oder) – ein Modell kann „unterschiedliche Beleuchtung“ nicht rendern. Setze das Verbot im Code durch, nicht nur im Prompt: es wurde in etwa jedem dritten Durchlauf verletzt. Frage feldweise erneut an und behalte nach N Versuchen die am wenigsten abgeschwächte Antwort, anstatt zu scheitern.
Einschränkung, die dem Nutzer mitgeteilt werden sollte: Sobald die Spezifikation auf den Messungen basiert, ist sie keine unabhängige Prüfung dieser Messungen mehr.
LUT-Baking-Fallstricke
- Eine LUT kann nur eine per-Pixel-RGB-Funktion kodieren. Alles, was von der Verteilung abhängt (Histogramm-Matching, Perzentil-Anker), 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, der dies verwendet, 0 %. Konvertiere Lab→lineares sRGB von Hand; eine echte Messung ergab 83,3 % OOG.- Versetze Chroma per Offset, nicht affin. Affin dividiert durch die Quell-σ und überschießt – bei echtem Filmmaterial kehrte es b* auf +11,6 gegenüber einem Ziel von −17,5. Offset senkte den MAE von 6,23 auf 2,13.
- Gamut-Kompression kostete 3,8x Laufzeit bei identischem MAE. Mach es opt-in.
Anti-Patterns
| Mach das nicht | Warum |
|---|---|
| Gegen synthetisches Testmaterial optimieren | Kostete vier separate Fehlschlüsse in einem Projekt; echtes Filmmaterial widerlegte jeden |
| MAE allein vertrauen | 1,88 MAE sah wie ein Erfolg aus, bei einem sichtbar defekten Frame |
| Mittelwert/Std für Chroma verwenden | Rechtsschief; drückt ~3x zu stark |
| Nur Endpunkt-Zonen vergleichen | Beide Enden sind konstruktionsbedingt nahezu neutral |
| Den Look beschreiben und aufhören | Die Spezifikation ist für Inhalt und Struktur; das Paket für die Farbe |
Übergabe
Das Paket ist die Schnittstelle. Sobald es existiert, verwende die Fertigkeit taste-application, um darauf basierend zu generieren und zu montieren, oder übergib look.cube direkt an einen Coloristen.
Gebündelter Code
scripts/ in dieser Fertigkeit ist eine funktionierende Implementierung, kein Pseudocode. Sie enthält keine projektspezifischen Annahmen: Richte sie auf beliebige Referenzvideos und sie erzeugt ein Paket.
pip install -r scripts/requirements.txt
export FAL_KEY=... # nur für die Phasen benötigt, die fal aufrufen
Jeder Netzwerkaufruf wird unter TASTE_FORGE_DRY_RUN=1 oder --dry-run stubbed, sodass der Plan, die Prompts, das Track-Layout und das Manifest ohne Kosten inspiziert werden können.