Destilación de Estilo
Esta skill independiente incluye su implementación en scripts/; usa
taste-application para la edición posterior generada o local. Mantén cada
género nombrado en su propio paquete. Las mediciones de Flash Ethereal no deben
reutilizarse en silencio para Fluid Sketch o 3D Cyber Glitch. Un valor medido de
cero es dato válido; distínguelo de un campo ausente.
Las dependencias locales están en scripts/requirements.txt. El trabajo de
proveedor autorizado por separado también necesita scripts/requirements-live.txt,
credenciales y TASTE_FORGE_ALLOW_LIVE=1 explícito. --dry-run no lee
credenciales ni envía trabajos. Nunca infieras que un flujo de trabajo se guardó
desde un nombre de endpoint local; usa la evidencia real del flujo de trabajo o
solicitud del proveedor.
Convierte videos de referencia en un paquete de estilo: una carpeta de mediciones y activos que las etapas posteriores consumen de forma determinista.
Cuándo Activar
- "capturar el aspecto de estos clips" / "destilar la vibra" / "hacer esto repetible"
- El usuario tiene metraje de referencia y quiere un LUT, una gradación o un ritmo coincidente
- Construir una biblioteca de looks divididos por género
- Cualquier solicitud donde la respuesta sería "describe el estilo en un prompt"
El Hallazgo Clave
El prompting no puede entregar una gradación. La medición sí.
Medido en metraje real: tres generaciones de pago con dirección de color creciente movieron el a* de tonos medios de +1.9 → +2.8 → +0.3 frente a un objetivo de +24.9, y el contraste nunca se apartó de ~19 frente a un objetivo de 34.7. Aplicar un paquete medido al mismo metraje logró croma MAE 1.88 y contraste 33.7 en un solo paso determinista, de forma gratuita.
Por lo tanto, la división es: el modelo proporciona contenido, movimiento y es tructura de iluminación; el paquete proporciona el aspecto. Las palabras de color en un prompt de generación son peores que inútiles: cuestan dinero y aléjan el render de la base neutra que el LUT desea. Dilo explícitamente en el prompt: "Color: ninguno. Render neutro. La gradación se aplica después."
Qué Contiene un Paquete
stylepacks/<género>//
grade.json estadísticas de color medidas (ver abajo)
cadence.json cada límite de plano detectado + la distribución derivada
look.cube LUT 33^3, arrastra directamente a Resolve como LUT de nodo
spec.json descripción VLM, basada en las mediciones
grounding.txt los hechos medidos alimentados al VLM
stills/ fotogramas a resolución completa de los planos más largos (imágenes de acondicionamiento)
plates/ elementos de superposición con fusión de pantalla extraídos sobre negro
props/ mallas GLB acuñadas
pack.json manifiesto
Cómo Ejecutarlo
python mint.py --genre <nombre> --refs a.mov b.mov c.mov # offline, sin clave API
python distill.py --genre <nombre> # una llamada VLM
mint.py es análisis numérico puro — sin red, sin clave, determinista, por lo
que un paquete se puede regenerar en lugar de respaldar.
Las Mediciones que Importan
Croma por zona de luminancia, no global
La identidad de color suele vivir en una banda de luminancia. Un desplazamiento
global de a*/b* matemáticamente no puede representar un split-toning. Mide croma
dentro de zonas (L* bordes [0,15,35,55,75,100]).
Una firma real: violeta en L25 (a +24.9, b* −17.5), casi neutro en ambos extremos. Reportar solo las zonas más oscuras y más claras lo llama "tinte uniforme" — siempre imprime toda la curva.
Mediana + MAD, nunca media + desviación estándar
El croma en conjuntos de referencia reales tiene una fuerte asimetría a la derecha. En un reel medido, la media del croma en tonos medios fue 36.9 frente a una mediana de 17.5, por lo que un LUT basado en la media empujó el color ~3x más de lo que justificaba el material.
El contraste es std(L*), no blanco menos negro
El rango blanco−negro es ~100 en casi cualquier metraje real y no discrimina nada.
La proporción de fondo es una estadística de primera clase
Registra la proporción de píxeles por debajo de L*10. Ningún momento de la distribución puede verlo: un clip puede tener la media, desviación estándar y croma correctos mientras sus negros han sido elevados a gris. Así es exactamente como una gradación una vez obtuvo MAE 1.88 / contraste 33.7 mientras que el fotograma real era un desastre púrpura embarrado.
Enmascara la interfaz antes de medir
Las referencias grabadas de pantalla llevan mobiliario estático — barras de letterbox, una barra de estado, un icono de me gusta, texto de subtítulos. Todo ello llega a las estadísticas como si fuera el aspecto: las barras negras inflan el peso de las sombras, un corazón rojo sesga a* hacia el magenta. La varianza temporal los separa limpiamente — el metraje se mueve, la interfaz no — por lo que no se necesita un recorte manual. En material real esto mantiene ~65% de los píxeles.
La cadencia necesita un umbral adaptativo
El umbral correcto del detector de contenido depende del material: una referencia de acción de alto contraste corta lo suficiente para 30, una de ambiente oculta sus cortes debajo de él. Barre umbrales descendentes y toma el más alto que aún recupere ≥90% de los cortes que encuentra la configuración más sensible — eso se sesga hacia cortes reales sobre ruido. Rechaza umbrales que impliquen una tasa de corte absurda (>100/min); los movimientos de cámara continuos activan el detector en cada fotograma.
Ejecuta todo el barrido en una pasada de decodificación con un StatsManager
compartido. La versión ingenua re-decodifica por umbral, lo que en fuente de 60fps
es la diferencia entre segundos y minutos.
Placas de Superposición: Activos, No Capturas de Pantalla
Un fotograma fijo es un fotograma completo — componer uno simplemente pone una segunda imagen encima. Una placa es el vocabulario gráfico de la referencia ( destellos, rayas, fragmentos de glitch) extraído sobre negro para que se fusione por pantalla sin necesidad de keying.
Dos trampas, ambas encontradas en material real:
- Los umbrales absolutos fallan. En una referencia brillante, una selección
L>55 AND croma>12toma ~90% del fotograma, y la "placa" es la imagen — incluida una cara reconocible. Selecciona por percentil (~top 3%) y rechaza cualquier placa que cubra más de ~22% del fotograma. - Clasifica por separación, no por brillo. "Proporción de píxeles brillantes
saturados" clasifica un fotograma lavado en primer lugar y un fotograma negro
con un destello intenso — la firma real — cerca del final. Puntúa
p99.5(energía) / mediana(energía).
También enmascara antes de puntuar: la tipografía incrustada es brillante, saturada y de alto contraste, por lo que una ejecución sin enmascarar produce una placa perfecta de la tarjeta de título de otra persona.
Fundamentando el VLM
Alimenta las mediciones en el prompt del sistema antes de pedir una descripción. Sin fundamento, un VLM reportará "sin gradación de color aparente, neutro" en metraje con un tinte a* de +24.9. Con fundamento, describe el tinte correctamente e infiere el acento secundario de forma independiente.
Prohíbe palabras de evasión (variado, mixto, dinámico, algo, a menudo,
neutral, o) — un modelo no puede renderizar "iluminación variada". Haz
cumplir la prohibición en el código, no solo en el prompt: se violó en
aproximadamente una de cada tres ejecuciones. Vuelve a preguntar por campo,
mantén la respuesta menos evasiva después de N intentos en lugar de fallar.
Advertencia que vale la pena mencionar al usuario: una vez que la especificación se fundamenta en las mediciones, ya no es una verificación independiente de ellas.
Errores Comunes al Hornear LUT
- Un LUT solo puede codificar una función RGB por píxel. Cualquier cosa dependiente de la distribución (coincidencia de histograma, anclajes de percentil) debe reducirse a una constante antes de hornear, o mide silenciosamente la cuadrícula uniforme del LUT en lugar del metraje.
cv2.cvtColor(LAB2RGB)recorta internamente, por lo que una prueba fuera de gama que lo use reporta 0%. Convierte Lab→sRGB lineal a mano; una medición real fue 83.3% fuera de gama.- Transfiere croma por desplazamiento, no afín. La transformación afín divide por la σ de origen y se sobrescribe — en metraje real invirtió b* a +11.6 frente a un objetivo de −17.5. El desplazamiento llevó el MAE de 6.23 a 2.13.
- La compresión de gama costó 3.8x el tiempo de ejecución para un MAE idéntico. Hazla optativa.
Anti-Patrones
| No hacer | Por qué |
|---|---|
| Ajustar contra metraje de prueba sintético | Costó cuatro conclusiones erróneas separadas en un proyecto; el metraje real las derribó todas |
| Confiar solo en MAE | 1.88 MAE parecía éxito en un fotograma visiblemente roto |
| Usar media/desviación estándar para croma | Asimétrico a la derecha; empuja ~3x demasiado fuerte |
| Comparar solo zonas de los extremos | Ambos extremos son casi neutros por construcción |
| Describir el aspecto y detenerse | La especificación es para contenido y estructura; el paquete es para el color |
Entrega
El paquete es la interfaz. Una vez que existe, usa la skill taste-application
para generar y ensamblar contra él, o entrega look.cube directamente a un
colorista.
Código Incluido
scripts/ en esta skill es una implementación funcional, no pseudocódigo. No
tiene suposiciones específicas del proyecto: apúntalo a cualquier video de
referencia y produce un paquete.
pip install -r scripts/requirements.txt
export FAL_KEY=... # solo necesario para las etapas que llaman a fal
Cada llamada de red está simulada bajo TASTE_FORGE_DRY_RUN=1 o --dry-run, por
lo que el plan, prompts, diseño de pistas y manifiesto se pueden inspeccionar sin
coste.