Taste Distillation
Este skill autônomo possui sua implementação em scripts/; use
taste-application para a edição subsequente gerada ou baseada em takes locais. Mantenha cada gênero nomeado em seu próprio pacote. Medições de Flash Ethereal não devem ser reutilizadas silenciosamente para Fluid Sketch ou 3D Cyber Glitch. Um valor zero medido é dado válido; distinga-o de um campo ausente.
As dependências locais estão em scripts/requirements.txt. O trabalho com provedores separadamente autorizados também precisa de scripts/requirements-live.txt, credenciais e a variável explícita TASTE_FORGE_ALLOW_LIVE=1. --dry-run não lê credenciais nem envia jobs. Nunca inferir que um fluxo de trabalho foi salvo a partir de um nome de endpoint local; use o fluxo de trabalho real do provedor ou evidência da requisição.
Transforme vídeos de referência em um pacote de estilo: uma pasta de medições e ativos que as etapas posteriores consomem de forma determinística.
Quando Ativar
- "capturar o visual desses clipes" / "destilar a vibe" / "tornar isso repetível"
- O usuário possui imagens de referência e deseja um LUT, uma correção de cor ou um ritmo correspondente
- Construir uma biblioteca de looks particionados por gênero
- Qualquer solicitação onde a resposta seria "descreva o estilo em um prompt"
A Descoberta Central
Prompts não conseguem entregar uma correção de cor. A medição consegue.
Medido em imagens reais: três gerações pagas com direção de cor crescente moveram o a* dos meios-tons de +1,9 → +2,8 → +0,3 contra um alvo de +24,9, e o contraste nunca saiu de ~19 contra um alvo de 34,7. Aplicar um pacote medido na mesma imagem atingiu MAE de croma 1,88 e contraste 33,7 em uma passada determinística, de graça.
Portanto, a separação é: o modelo fornece conteúdo, movimento e estrutura de iluminação; o pacote fornece o visual. Palavras de cor em um prompt de geração são piores que inúteis — custam dinheiro e afastam a renderização da base neutra que o LUT deseja. Diga isso explicitamente no prompt: "Cor: nenhuma. Renderize neutro. A correção de cor é aplicada depois."
O Que um Pacote Contém
stylepacks/<genero>/
grade.json estatísticas de cor medidas (veja abaixo)
cadence.json cada borda de plano detectada + a distribuição derivada
look.cube LUT 33^3, arraste diretamente para o Resolve como um LUT de nó
spec.json descrição VLM, baseada nas medições
grounding.txt os fatos medidos alimentados para o VLM
stills/ frames em resolução total dos planos mais longos (imagens de condicionamento)
plates/ elementos de sobreposição com blend de tela extraídos sobre preto
props/ malhas GLB cunhadas
pack.json manifesto
Executando
python mint.py --genero <nome> --refs a.mov b.mov c.mov # offline, sem chave de API
python distill.py --genero <nome> # uma chamada VLM
mint.py é análise puramente numérica — sem rede, sem chave, determinística, portanto um pacote pode ser regenerado em vez de ter que ser salvo em backup.
As Medições Que Importam
Croma por zona de luminância, não globalmente
A identidade de cor geralmente reside em uma faixa de luminância. Um deslocamento global de a*/b* matematicamente não pode representar split-toning. Meça o croma dentro de zonas
(bordas L* [0,15,35,55,75,100]).
Uma assinatura real: violeta em L25 (a +24,9, b* −17,5), quase neutro em ambas as extremidades. Relatar apenas as zonas mais escuras e mais claras chama isso de "cast uniforme" — sempre imprima a curva inteira.
Mediana + MAD, nunca média + desvio padrão
O croma em conjuntos de referência reais é fortemente assimétrico à direita. Em um rolo medido, a média do croma dos meios-tons foi 36,9 contra uma mediana de 17,5, portanto um LUT baseado na média empurrou a cor cerca de 3x mais forte do que o material justificava.
Contraste é std(L*), não branco menos preto
A faixa branco−preto é de aproximadamente 100 em quase qualquer imagem real e não discrimina nada.
A proporção de fundo é uma estatística de primeira classe
Registre a proporção de pixels abaixo de L*10. Nenhum momento da distribuição consegue enxergá-la: um clipe pode ter a média, o desvio padrão e o croma corretos enquanto seus pretos foram elevados para cinza. Isso é exatamente como uma correção de cor uma vez obteve MAE 1,88 / contraste 33,7 enquanto o quadro real era uma bagunça roxa lamacenta.
Mascarar a interface antes de medir
Referências capturadas de tela carregam mobília estática — barras de letterbox, uma barra de status, um ícone de like, texto de legenda. Tudo isso cai nas estatísticas como se fosse o visual: barras pretas inflam o peso das sombras, um coração vermelho distorce o a* em direção ao magenta. A variância temporal separa-os de forma limpa — a imagem se move, a interface não — portanto, nenhum corte manual é necessário. Em material real, isso mantém aproximadamente 65% dos pixels.
O ritmo precisa de um limiar adaptativo
O limiar correto do detector de conteúdo depende do material: uma referência de ação de alto contraste corta forte o suficiente para 30, uma melancólica esconde seus cortes abaixo disso. Varra limiares decrescentes e pegue o mais alto que ainda recupere ≥90% dos planos que a configuração mais sensível encontra — isso tende a favorecer cortes reais em vez de ruído. Rejeite limiares que impliquem uma taxa de corte absurda (>100/min); movimentos contínuos de câmera disparam o detector a cada quadro.
Execute toda a varredura em uma passada de decodificação com um StatsManager compartilhado. A versão ingênua redecodifica por limiar, o que em fonte de 60fps é a diferença entre segundos e minutos.
Placas de Sobreposição: Ativos, Não Capturas de Tela
Um still é um quadro inteiro — compor um apenas coloca uma segunda imagem por cima. Uma placa é o vocabulário gráfico da referência (flares, estrias, fragmentos de glitch) extraído sobre preto para que se misture com a tela sem necessidade de keying.
Duas armadilhas, ambas encontradas em material real:
- Limiares absolutos falham. Em uma referência clara, uma seleção
L>55 E croma>12pega ~90% do quadro, e a "placa" é a imagem — incluindo um rosto reconhecível. Selecione por percentil (~topo 3%) e rejeite qualquer placa que cubra mais de ~22% do quadro. - Classifique pela separação, não pelo brilho. "Proporção de pixels brilhantes e saturados" classifica um quadro desbotado no topo e um quadro preto com um flare intenso — a assinatura real — perto da base. Pontue
p99.5(energia) / mediana(energia).
Além disso, mascare antes de pontuar: tipografia embutida é brilhante, saturada e de alto contraste, portanto, uma execução sem máscara produz uma placa perfeita do título de outra pessoa.
Fundamentando o VLM
Alimente as medições no prompt do sistema antes de pedir uma descrição. Sem fundamentação, um VLM relatará "sem correção de cor aparente, neutro" em imagens com um cast de a* de +24,9. Com fundamentação, ele descreve o cast corretamente e infere o acento secundário de forma independente.
Proíba palavras de hesitação (variado, misto, dinâmico, algum, frequentemente, neutro, ou) — um modelo não pode renderizar "iluminação variada". Reforce a proibição no código, não apenas no prompt: ela foi violada em aproximadamente uma em cada três execuções. Refaça a pergunta por campo, mantenha a resposta menos hesitada após N tentativas em vez de falhar.
Ressalva que vale a pena declarar ao usuário: uma vez que a especificação está fundamentada nas medições, ela deixa de ser uma verificação independente sobre elas.
Armadilhas na Geração do LUT
- Um LUT só pode codificar uma função RGB por pixel. Qualquer coisa dependente de distribuição (correspondência de histograma, âncoras de percentil) deve ser reduzida a uma constante antes da geração, ou ela mede silenciosamente a grade uniforme do LUT em vez da imagem.
cv2.cvtColor(LAB2RGB)limita internamente, portanto, um teste fora de gamute usando-o relata 0%. Converta Lab→sRGB linear manualmente; uma medição real mostrou 83,3% fora do gamute.- Transfira croma por deslocamento, não afim. O afim divide pelo σ da fonte e ultrapassa — em imagens reais, inverteu b* para +11,6 contra um alvo de −17,5. O deslocamento reduziu o MAE de 6,23 para 2,13.
- A compressão de gamute custou 3,8x o tempo de execução para o mesmo MAE. Torne-a opt-in.
Anti-Padrões
| Não fazer | Por quê |
|---|---|
| Ajustar com imagens de teste sintéticas | Custou quatro conclusões erradas separadas em um projeto; imagens reais derrubaram todas |
| Confiar apenas no MAE | MAE 1,88 parecia sucesso em um quadro visivelmente quebrado |
| Usar média/desvio padrão para croma | Assimétrico à direita; empurra ~3x mais forte |
| Comparar apenas zonas extremas | Ambas as extremidades são quase neutras por construção |
| Descrever o visual e parar | A especificação é para conteúdo e estrutura; o pacote é para a cor |
Handoff
O pacote é a interface. Uma vez que exista, use o skill taste-application para gerar e montar contra ele, ou entregue look.cube diretamente a um colorista.
Código Empacotado
scripts/ neste skill é uma implementação funcional, não pseudocódigo. Não possui suposições específicas de projeto: aponte para quaisquer vídeos de referência e ele produz um pacote.
pip install -r scripts/requirements.txt
export FAL_KEY=... # necessário apenas para as etapas que chamam fal
Cada chamada de rede é simulada com TASTE_FORGE_DRY_RUN=1 ou --dry-run, para que o plano, prompts, layout da faixa e manifesto possam ser inspecionados sem gastar.