Distillation de Goût
Cette compétence autonome livre son implémentation dans scripts/ ; utilisez
taste-application pour l'édition générée ou locale qui suit. Gardez chaque
genre nommé dans son propre pack. Les mesures d'Éclat Flash ne doivent pas être
réutilisées en silence pour Esquisse Fluide ou Glitch Cyber 3D. Une mesure nulle
est une donnée valide ; distinguez-la d'un champ absent.
Les dépendances locales se trouvent dans scripts/requirements.txt. Le travail
fournisseur autorisé séparément nécessite également scripts/requirements-live.txt,
des identifiants et explicitement TASTE_FORGE_ALLOW_LIVE=1. --dry-run ne lit
pas les identifiants ni ne soumet de travaux. Ne déduisez jamais qu'un workflow
a été sauvegardé à partir d'un nom de point de terminaison local ; utilisez la
preuve du workflow ou de la demande du côté du fournisseur.
Transformez des vidéos de référence en un pack de style : un dossier de mesures et d'actifs consommés de manière déterministe par les étapes ultérieures.
Quand Activer
- "capturer l'apparence de ces clips" / "distiller l'ambiance" / "rendre cela reproductible"
- L'utilisateur a des séquences de référence et veut une LUT, un étalonnage ou un rythme correspondant
- Construire une bibliothèque de looks partitionnés par genre
- Toute demande dont la réponse serait sinon "décrire le style dans un prompt"
La Découverte Fondamentale
Le prompt ne peut pas fournir un étalonnage. La mesure le peut.
Mesuré sur des séquences réelles : trois générations payantes avec une direction couleur croissante ont déplacé le a* des tons moyens de +1,9 → +2,8 → +0,3 contre une cible de +24,9, et le contraste n'a jamais quitté ~19 contre une cible de 34,7. L'application d'un pack mesuré aux mêmes séquences a atteint une MAE chroma de 1,88 et un contraste de 33,7 en un seul passage déterministe, gratuitement.
Donc la séparation est : le modèle fournit le contenu, le mouvement et la structure d'éclairage ; le pack fournit le look. Les mots de couleur dans un prompt de génération sont pires qu'inutiles — ils coûtent de l'argent et éloignent le rendu de la base neutre souhaitée par la LUT. Dites-le explicitement dans le prompt : "Couleur : aucune. Rendu neutre. L'étalonnage est appliqué après."
Ce que Contient un Pack
stylepacks/<genre>/
grade.json statistiques couleur mesurées (voir ci-dessous)
cadence.json chaque coupure de plan détectée + la distribution dérivée
look.cube LUT 33^3, glissez directement dans Resolve comme LUT de nœud
spec.json description VLM, basée sur les mesures
grounding.txt les faits mesurés fournis au VLM
stills/ images pleine résolution des plans les plus longs (images de conditionnement)
plates/ calques de fusion d'écran extraits sur fond noir
props/ maillages GLB frappés
pack.json manifeste
Exécution
python mint.py --genre <nom> --refs a.mov b.mov c.mov # hors ligne, pas de clé API
python distill.py --genre <nom> # un appel VLM
mint.py est une analyse numérique pure — pas de réseau, pas de clé,
déterministe, donc un pack peut être régénéré plutôt que sauvegardé.
Les Mesures Qui Comptent
Chroma par zone de luminance, pas globalement
L'identité couleur vit généralement dans une bande de luminance. Un décalage
global a*/b* ne peut mathématiquement pas représenter un split-toning. Mesurez
la chroma à l'intérieur de zones (bords L* [0,15,35,55,75,100]).
Une signature réelle : violet à L25 (a +24,9, b* −17,5), presque neutre aux deux extrémités. Ne rapporter que les zones les plus sombres et les plus claires appelle cela "teinte uniforme" — imprimez toujours la courbe entière.
Médiane + MAD, jamais moyenne + écart type
La chroma dans les ensembles de référence réels est fortement asymétrique à droite. Sur une bobine mesurée, la chroma moyenne des tons moyens était de 36,9 contre une médiane de 17,5, donc une LUT basée sur la moyenne poussait la couleur ~3 fois plus fort que ce que le matériau justifiait.
Le contraste est l'écart type (L*), pas le blanc moins le noir
La plage blanc−noir est d'environ 100 sur presque toutes les séquences réelles et ne discrimine rien.
La part d'arrière-plan est une statistique de première classe
Enregistrez la part des pixels en dessous de L*10. Aucun moment de la distribution ne peut la voir : un clip peut avoir la bonne moyenne, le bon écart type et la bonne chroma alors que ses noirs ont été relevés vers le gris. C'est exactement ainsi qu'un étalonnage a un jour obtenu une MAE de 1,88 / un contraste de 33,7 alors que l'image réelle était un désordre violet boueux.
Masquez l'interface avant de mesurer
Les références capturées depuis l'écran portent des éléments d'interface statiques — barres de lettrage, une barre de statut, une icône de like, du texte de légende. Tout cela atterrit dans les statistiques comme si c'était le look : les barres noires gonflent le poids des ombres, un cœur rouge dévie a* vers le magenta. La variance temporelle les sépare proprement — la séquence bouge, l'interface non — donc aucun recadrage manuel n'est nécessaire. Sur du matériel réel, cela conserve environ 65% des pixels.
La cadence nécessite un seuil adaptatif
Le bon seuil du détecteur de contenu dépend du matériau : une référence d'action à fort contraste coupe assez fort pour un seuil de 30, une référence maussade cache ses coupes en dessous. Parcourez les seuils descendants et prenez le plus élevé qui récupère encore ≥90% des plans que le réglage le plus sensible trouve — cela favorise les vraies coupes par rapport au bruit. Rejetez les seuils impliquant un taux de coupe absurde (>100/min) ; les mouvements de caméra continus déclenchent le détecteur à chaque image.
Exécutez tout le balayage en un seul passage de décodage avec un
StatsManager partagé. La version naïve re-décode par seuil, ce qui sur une
source à 60 ips fait la différence entre quelques secondes et plusieurs minutes.
Calques de Fusion : Actifs, Pas des Captures d'Écran
Une image fixe est une image entière — la composer ne fait que mettre une deuxième image par-dessus. Un calque est le vocabulaire graphique de la référence (reflets, traînées, fragments de glitch) extrait sur fond noir afin qu'il se fonde par écran sans keying.
Deux pièges, tous deux rencontrés sur du matériel réel :
- Les seuils absolus échouent. Sur une référence lumineuse, une sélection
L>55 ET chroma>12prend environ 90% de l'image, et le "calque" est l'image — y compris un visage reconnaissable. Sélectionnez par centile (~top 3%) et rejetez tout calque couvrant plus d'environ 22% de l'image. - Classez par séparation, pas par luminosité. "Part de pixels saturés
lumineux" classe une image délavée en haut et une image noire avec un seul
reflet intense — la signature réelle — près du bas. Notez
p99.5(énergie) / médiane(énergie).
Masquez également avant de noter : la typographie incrustée est lumineuse, saturée et à fort contraste, donc une exécution non masquée donne un calque parfait du titre de quelqu'un d'autre.
Ancrage du VLM
Introduisez les mesures dans le prompt système avant de demander une description. Sans ancrage, un VLM rapportera "aucun étalonnage apparent, neutre" sur une séquence avec une dominante a* de +24,9. Ancré, il décrit correctement la dominante et déduit l'accent secondaire indépendamment.
Interdisez les mots de modulation (varié, mixte, dynamique, certain,
souvent, neutre, ou) — un modèle ne peut pas rendre "éclairage varié".
Appliquez l'interdiction dans le code, pas seulement dans le prompt : elle
était violée environ une fois sur trois exécutions. Re-demander champ par
champ, gardez la réponse la moins modulée après N tentatives plutôt que
d'échouer.
Mise en garde à mentionner à l'utilisateur : une fois le cahier des charges ancré dans les mesures, il ne constitue plus une vérification indépendante de celles-ci.
Pièges de la Cuisson LUT
- Une LUT ne peut encoder qu'une fonction RVB par pixel. Tout ce qui dépend de la distribution (matching d'histogramme, ancres de centile) doit être réduit à une constante avant la cuisson, sinon cela mesure silencieusement la grille LUT uniforme au lieu de la séquence.
cv2.cvtColor(LAB2RGB)écrète en interne, donc un test hors gamme l'utilisant rapporte 0%. Convertissez Lab→sRGB linéaire à la main ; une mesure réelle était à 83,3% hors gamme.- Transférez la chroma par décalage, pas par affine. L'affine divise par le σ source et dépasse — sur une séquence réelle, il a inversé b* à +11,6 contre une cible de −17,5. Le décalage a fait passer la MAE de 6,23 à 2,13.
- La compression de gamme a coûté 3,8x le temps d'exécution pour une MAE identique. Rendez-la optionnelle.
Anti-Patterns
| Ne pas faire | Pourquoi |
|---|---|
| Régler sur des séquences de test synthétiques | A coûté quatre conclusions erronées distinctes sur un projet ; la séquence réelle a toutes renversées |
| Faire confiance à la MAE seule | 1,88 MAE ressemblait à un succès sur une image visiblement cassée |
| Utiliser la moyenne/écart type pour la chroma | Asymétrique à droite ; pousse ~3x trop fort |
| Comparer uniquement les zones d'extrémité | Les deux extrémités sont presque neutres par construction |
| Décrire le look et s'arrêter | Le cahier des charges est pour le contenu et la structure ; le pack est pour la couleur |
Passage de Relais
Le pack est l'interface. Une fois qu'il existe, utilisez la compétence
taste-application pour générer et assembler par rapport à lui, ou donnez
look.cube directement à un coloriste.
Code Inclus
scripts/ dans cette compétence est une implémentation fonctionnelle, pas du
pseudo-code. Elle n'a pas d'hypothèses spécifiques au projet : pointez-la vers
n'importe quelles vidéos de référence et elle produit un pack.
pip install -r scripts/requirements.txt
export FAL_KEY=... # nécessaire uniquement pour les étapes qui appellent fal
Chaque appel réseau est bouchonné sous TASTE_FORGE_DRY_RUN=1 ou --dry-run,
donc le plan, les prompts, la disposition des pistes et le manifeste peuvent
être inspectés sans dépenses.