Destilación de Estilo (Taste Distillation)
Este skill independiente incluye su implementación en scripts/; utiliza
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 silenciosamente para Fluid Sketch o 3D Cyber Glitch. Un cero medido
es un 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 punto final local; usa la evidencia del flujo de trabajo o solicitud real
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 activarlo
- "captura el aspecto de estos clips" / "destila la vibra" / "hazlo repetible"
- El usuario tiene metraje de referencia y quiere un LUT, un etalonaje o un ritmo de edición coincidente
- Construir una biblioteca de looks divididos por género
- Cualquier solicitud cuya respuesta sería "describe el estilo en un prompt"
El hallazgo fundamental
El prompting no puede dar un etalonaje. La medición sí.
Medido en metraje real: tres generaciones pagadas 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 abandonó ~19 frente a un objetivo de 34,7. Aplicar un paquete medido al mismo metraje obtuvo un MAE de croma de 1,88 y un contraste de 33,7 en un solo paso determinista, gratis.
Así que la división es: el modelo proporciona contenido, movimiento y estructura de iluminación; el paquete proporciona el look. Las palabras de color en un prompt de generación son peores que inútiles: cuestan dinero y alejan el render de la base neutra que el LUT necesita. Dilo explícitamente en el prompt: "Color: ninguno. Render neutro. El etalonaje se aplica después."
Qué contiene un paquete
stylepacks/<genero>/
grade.json estadísticas de color medidas (ver más 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, fundamentada en las mediciones
grounding.txt los hechos medidos proporcionados al VLM
stills/ fotogramas de máxima resolución de los planos más largos (imágenes de condicionamiento)
plates/ elementos de superposición con fusión de pantalla extraídos sobre fondo negro
props/ mallas GLB acuñadas
pack.json manifiesto
Cómo ejecutarlo
python mint.py --genre <nombre> --refs a.mov b.mov c.mov # sin conexión, 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 puede regenerarse en lugar de respaldarse.
Las mediciones que importan
Croma por zona de luminancia, no global
La identidad del color suele vivir en una banda de luminancia. Un desplazamiento global a*/b* matemáticamente no puede representar un split-toning. Mide el croma dentro de las zonas (bordes L* [0,15,35,55,75,100]).
Una firma real: violeta en L25 (a +24,9, b* −17,5), casi neutro en ambos extremos. Informar solo de las zonas más oscuras y más claras lo llama "tinte uniforme" — imprime siempre la curva completa.
Mediana + MAD, nunca media + desviación estándar
El croma en conjuntos de referencia reales está fuertemente sesgado a la derecha. En un metraje medido, la media del croma en tonos medios fue de 36,9 frente a una mediana de 17,5, por lo que un LUT basado en la media empujó el color ~3 veces más de lo que justificaba el material.
El contraste es la desviación estándar de L*, no blanco menos negro
El rango blanco−negro es de ~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 se han elevado hasta volverse grises. Así es como un etalonaje obtuvo una vez un MAE de 1,88 / contraste de 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 aparece en las estadísticas como si fuera parte del look: las barras negras influyen 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 ajustado a mano. En material real, esto conserva ~65% de los píxeles.
El ritmo de corte necesita un umbral adaptativo
El umbral correcto del detector de contenido depende del material: una referencia de acción de alto contraste corta lo suficientemente fuerte 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 sesga hacia cortes reales en lugar de 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 sola pasada de decodificación con un
StatsManager compartido. La versión ingenua redecodifica por umbral, lo que en
una fuente de 60 fps 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 coloca 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 encuadre.
Dos trampas, ambas acertadas 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 — incluyendo 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
y saturados" clasifica un fotograma lavado en la parte superior y un fotograma
negro con un destello intenso — la firma real — cerca de la parte inferior.
Puntúa con
p99.5(energía) / mediana(energía).
Además, 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
Introduce las mediciones en el prompt del sistema antes de pedir una descripción. Sin fundamento, un VLM informará "sin etalonaje 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 las palabras de ambigüedad (variado, mixto, dinámico, alguno,
a menudo, neutro, o) — un modelo no puede renderizar "iluminación variada".
Aplica 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,
conserva la respuesta menos ambigua después de N intentos en lugar de fallar.
Advertencia que vale la pena indicar al usuario: una vez que la especificación está fundamentada en las mediciones, ya no es una comprobación independiente sobre ellas.
Problemas conocidos al hornear LUT
- Un LUT solo puede codificar una función RGB por píxel. Cualquier cosa que dependa de la distribución (coincidencia de histograma, anclajes de percentiles) 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 informa 0%. Convierte Lab→sRGB lineal manualmente; una medición real mostró un 83,3% fuera de gama.- Transfiere el croma con desplazamiento, no afín. El afín divide por la σ de la fuente y se excede — en metraje real invirtió b* a +11,6 frente a un objetivo de −17,5. El desplazamiento redujo el MAE de 6,23 a 2,13.
- La compresión de gama costó 3,8 veces el tiempo de ejecución para un MAE idéntico. Hazla optativa.
Anti-patrones
| No hagas | Por qué |
|---|---|
| Ajustar contra metraje de prueba sintético | Costó cuatro conclusiones erróneas separadas en un proyecto; el metraje real las desmintió todas |
| Confiar solo en el MAE | 1,88 de MAE parecía un éxito en un fotograma visiblemente defectuoso |
| Usar media/desviación estándar para el croma | Sesgado a la derecha; empuja ~3 veces más fuerte |
| Comparar solo las zonas extremas | Ambos extremos son casi neutros por construcción |
| Describir el look y parar | La especificación es para contenido y estructura; el paquete es para el color |
Traspaso
El paquete es la interfaz. Una vez que existe, usa el skill taste-application
para generar y ensamblar contra él, o entrega look.cube directamente a un
colorista.
Código incluido
scripts/ en este skill es una implementación funcional, no pseudocódigo. No tiene
suposiciones específicas de 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, los prompts, la disposición de pistas y el manifiesto se pueden
inspeccionar sin gastar.