Taste Application
A segunda metade do pipeline. taste-distillation mede as referências em um pacote de estilo; este gera a partir desse pacote e monta o resultado.
Contrato de Execução e Entrega
A implementação original está aqui em scripts/; não é necessário um checkout separado do ito-video. Instale scripts/requirements.txt para processamento local. Instale scripts/requirements-live.txt apenas para execução em provedor. Envios, submissões e downloads ao vivo exigem TASTE_FORGE_ALLOW_LIVE=1 explícito além das credenciais; defina-o apenas para a execução autorizada do usuário. --dry-run permanece livre de credenciais e produz placeholders rotulados. Um timeout ambíguo do provedor não é repetido como um novo job pago. Inspecione a requisição do provedor antes de decidir se outro envio é justificado.
Use takes já concluídos sem chamadas de provedor:
python scripts/pipeline.py --genero exemplo --root stylepacks \
--takes media/take-a.mp4 media/take-b.mp4 --duracao 12 --fps 30 \
--out out/revisao-v1.mp4
--duracao é um alvo de cadência de melhor esforço, não um tempo de execução exato. Takes completos podem produzir uma edição mais curta ou mais longa; o montador não duplica clipes nem adiciona preenchimento para atingir o alvo. O manifesto de saída mantém a duracao real e adiciona duracao_contrato com a duração solicitada e real, déficit, excesso e a política cadence_target. Diferenças de pelo menos um quadro de saída são avisadas explicitamente. Nenhum modo de duração exata é fornecido; quando um tempo de execução exato é necessário, inspecione o recibo e revise ou rejeite o corte antes da entrega.
O pipeline mantém os arquivos de take graduados de cada execução porque o FCPXML e EDL editáveis os referenciam. Ele recusa colisões de saída e relata falhas na exportação da timeline. Um render concluído não é um projeto de editor salvo ou aprovação criativa. Preserve os assets de origem e os checkpoints de projeto versionados antes e depois das edições ao vivo; registre o caminho salvo e o hash separadamente do recibo da timeline em memória.
Os gráficos Fal prontos para clone e seu compilador de entrada offline estão documentados em workflows/README.md. Compile o briefing e a direção de estilo antes do envio; não presuma que um campo de esquema desconectado afeta um prompt de modelo. Valide os campos atuais do endpoint com o provedor real antes de uma execução paga.
Para o Blender, use o GLB texturizado completo; a retopologia é um derivado nomeado separadamente e nunca substitui essa fonte. blender_prop.py suporta --largura 1920 --altura 1080 --fps 30 --recibo recibo.json explícitos e preserva a iluminação de borda e texturas de material derivadas do pacote. Salvar uma cena é distinto de renderizá-la; inspecione o estado do recibo e as imagens empacotadas.
Para sobreposições no Resolve, use taste.resolve.apply_placements com objetos injetados de um alvo versionado explicitamente selecionado. Defina source_end_mode para a convenção verificada naquele host. Não presuma que o source end é inclusivo entre versões do Resolve. O adaptador aloca efeitos sobrepostos acima das faixas preservadas e verifica cada posicionamento imediatamente e novamente após todas as anexações. Inteiros compostos devem corresponder à API instalada; para o host verificado Studio 21, Screen é 5, não o incorreto 22 do builder histórico. O recibo prova apenas o posicionamento em memória. Salve o projeto, verifique seu checkpoint, depois inspecione a saída renderizada exata antes de relatar a entrega.
Quando Ativar
- "faça um vídeo neste estilo" / "aplique o pacote" / "complete esta filmagem"
- Montar clipes gerados em algo com ritmo de edição real
- Mintar props 3D a partir de um visual e colocá-los de volta no vídeo
- Verificar se uma peça final realmente corresponde à sua referência
Divisão de Trabalho
O modelo fornece conteúdo, movimento, enquadramento e estrutura de iluminação. O pacote fornece cor e ritmo. Isso é medido, não preferência estilística — veja taste-distillation para os números. Consequências práticas:
- O prompt de geração contém zero linguagem de cor. Adicione "Cor: nenhuma. Render neutro. A gradagem é aplicada depois."
- Mantenha duas flags separadas:
--brief(o que ACONTECE: assunto, ação, lugar) e--style-steer(como PARECE). Mesclá-las vaza palavras de estilo para a cena ("azul-petróleo" se torna um objeto azul-petróleo) e palavras de assunto para a gradagem. - O modelo responde muito melhor a regras locais e verificáveis do que a regras globais. "Fundos preto puro e não iluminados; assuntos indo para o branco" funciona; "contraste extremo" não.
Gerar TAKES, Não Shots
A leitura óbvia de "igualar a cadência" é uma geração por shot. É economicamente absurdo. Uma referência com média de 0,78s/shot contra um endpoint com piso de 4 segundos transforma uma peça de 10s em 12 chamadas, 48 segundos gerados para 10 usados (21% de eficiência), e doze clipes não relacionados costurados no que deveria ser contínuo.
Editores rolam um take mais longo e cortam dentro dele. Agrupar shots em takes de ~5s: 3 chamadas, 13 segundos gerados, 77% de eficiência, e shots consecutivos que realmente pertencem uns aos outros porque vieram da mesma geração.
Diga ao modelo qual forma você quer, ou ele renderiza um lento push travado e seis cortes dentro dele leem como um soluço:
"Filmado como UM take contínuo sem cortes duros dentro dele. Será cortado em 6 pedaços de aproximadamente 0,8s na edição, então o enquadramento, assunto e luz devem continuar mudando ao longo de todo o take – qualquer janela de 0,8s tem que se sustentar sozinha como seu próprio shot."
Regras de Corte
- Re-codifique, nunca copie stream. Copiar stream corta apenas em keyframes, que em 0,78s significam que o comprimento do shot arredonda cada limite para o GOP mais próximo — destruindo a coisa exata que o pipeline existe para preservar.
- Ao complementar filmagem existente, use seus próprios limites de shot. Fatiar um vídeo base em pedaços contíguos e reproduzi-los em ordem apenas remonta o original: todo "corte" cai no meio de um shot e é invisível. Medido, uma montagem de 20 shots registrou apenas 12 cortes detectados. Detecte limites reais e pegue a cada N-ésimo shot para que escolhas consecutivas sejam garantidamente descontínuas. Isso moveu uma medição de corte de 1,29s para 0,83s contra um alvo de 0,78s.
- Amostre comprimentos de shot da distribuição da referência, não de sua média, para que o corte herde a variância de ritmo em vez de achatar para clipes uniformes.
Regras de Gradagem
- Medição direta supera uma LUT assada quando você tem o clipe: meça-o, iguale sua CDF L*, aplique croma por zona.
grade_clip_directalcançou MAE 1,58 e contraste 34,0 contra 34,7. - Âncore, não iguale CDF, quando o histograma do clipe é diferente do da referência. Forçar um clipe gerado 68%-preto em um histograma de referência ocupado levantou todo o fundo do preto: preservação do fundo caiu para 26,0% (CDF) versus 69,0% (âncora), enquanto MAE e contraste ainda pareciam excelentes. Padrão para tom ancorado.
- Tamanho do lote importa. Gradear 48 quadros de uma vez matou o processo por falta de memória; 6 é seguro.
Comportamento Recuperado da Plataforma fal
Estas observações e exemplos de endpoint vieram do workflow recuperado. Re-verifique os metadados atuais do endpoint; eles não são garantias sobre todas as versões futuras do provedor. Os templates de gráfico fornecidos registram as entradas de workflow verificadas separadamente, incluindo controle explícito de áudio gerado.
Isso custa tempo real para descobrir. Verifique-os antes de projetar um gráfico.
| Limite | Detalhe |
|---|---|
| Nenhum renderizador 3D | fal tem image-to-3d, text-to-3d, 3d-to-3d e nada mais. Cada endpoint 3d-to-3d emite outra malha. Não há categoria 3d-to-image/3d-to-video, então um GLB mintado não pode re-entrar em um gráfico de vídeo fal. Renderize localmente, depois use fal-ai/ffmpeg-api/images-to-video. |
| compose não pode sobrepor | fal-ai/ffmpeg-api/compose rejeita uma segunda trilha com "Várias trilhas de vídeo não são suportadas" — e conta uma trilha de image como trilha de vídeo. Ele sequencia apenas uma trilha de vídeo. Componha localmente com ffmpeg. |
| compose keyframes são em milissegundos | Nada na resposta diz isso. Uma execução enviada em segundos é aceita e retorna um vídeo 1000x mais curto. |
| extract-frame oferece apenas primeiro/meio/último | Nenhum timestamp arbitrário. Use os três como três imagens de condicionamento distintas. |
| Sem loops, sem concatenação de strings no DAG | O fan-out por shot tem que ser autorado nó por nó, ou mantido local. |
| Kling 3.0 não tem referência-para-vídeo | A linha v3 é apenas texto/imagem/controle de movimento; referência-para-vídeo está na linha o3: fal-ai/kling-video/o3/pro/reference-to-video. |
| Prefixos não são uniformes | bytedance/*, tripo3d/*, meshy/*, minimax/*, openai/* não carregam o prefixo fal-ai/. kling-video, veo3.1, flux-*, hunyuan-3d, ffmpeg-api carregam. |
Escolhas de Endpoint
| Slot | Melhor | Alternativa de valor |
|---|---|---|
| referência→vídeo | bytedance/seedance-2.5/reference-to-video (~$0.473/s @720p) | fal-ai/kling-video/o3/pro/reference-to-video (~$0.112/s) |
| imagem→3D | fal-ai/hunyuan-3d/v3.1/pro/image-to-3d ($0.375, até 8 vistas) | tripo3d/h3.1/image-to-3d ($0.20) |
| texto→3D | fal-ai/hunyuan-3d/v3.1/pro/text-to-3d | tripo3d/h3.1/text-to-3d |
| retopologia | fal-ai/hunyuan-3d/v3.1/smart-topology ($0.75) | tripo3d/tripo/remesh (~75x mais barato) |
| divisão de partes | fal-ai/hunyuan-3d/v3.1/part (apenas FBX) | tripo3d/tripo/segment |
| texto→imagem | fal-ai/nano-banana-pro ($0.15 fixo) | fal-ai/flux-2-pro ($0.03/MP) |
Seedance é ~4x o preço do Kling o3 pelos mesmos 5 segundos. Ele ganha isso na fidelidade de múltiplas referências (até 50 referências mistas de imagem/vídeo/áudio) e não ganha quando condicionado a uma única imagem parada.
IDs de modelo e preços mudam. Verifique em fal.ai/models antes de prometer qualquer um deles.
O Ramo 3D
python mint3d.py --genero <nome> --de-stills 4 --retopo --render
python mint3d.py --genero <nome> --prompt "um visor de cromo rachado" --render
- Gere uma placa limpa primeiro; não extraia de stills de referência. O requisito de entrada declarado do endpoint é fundo simples, objeto único, objeto >50% do quadro. Os reels de referência são o oposto disso — colagens, planos abertos, vários assuntos, gráficos queimados — e produzem ruído esculpido. Texto → placa de objeto único → malha custa ~$0,15 extra e é a diferença entre uma malha utilizável e uma descartada.
- Multi-visualização é nomeada por campos por ângulo, não uma lista.
input_image_url(frente, obrigatório), depoisback_image_url,left_image_url,right_image_url,left_front_image_url,right_front_image_url,top_image_url,bottom_image_url. Não háinput_image_urlse nenhuma flagmulti_view— inventá-los degrada cada mint para visualização única enquanto parece funcionar. Um rótulo de ângulo errado é pior do que omitir a vista, porque o modelo confia nele. - Acesse o GLB por chave, não por posição. A resposta carrega um PNG de
thumbnaile um blocomodel_urlsao lado demodel_glb; pegar a primeira URL funciona apenas até que as chaves sejam reordenadas, e um PNG de pré-visualização baixa bem — nada falha até que o Blender se recuse a abri-lo. - Solicite mapas PBR. Sem eles, a malha ilumina como papelão pintado.
- Retopologize se alguém for editar ou riggar. Malhas geradas são densas e caóticas.
- Renderize localmente para fechar o ciclo. Uma vez que um turntable são quadros, é filmagem, e todo estágio downstream já lida com filmagem — gradear, cortar, exibir como elemento, ou enviar como referência de condicionamento. Use o Blender quando um binário estiver no PATH; mantenha um rasterizador de software leve como padrão, porque um contexto GL headless é a coisa mais comum que falta em um contêiner e um renderizador que funciona apenas em uma estação de trabalho não é parte de um pipeline.
Verifique, Depois Acredite
Todo outro estágio afirma um resultado. Verifique-o, e verifique a forma da distribuição, não apenas momentos:
background— proporção do quadro abaixo de L*10 vs o valor do pacote. Compare com a referência, não com o clipe de origem: uma origem gerada com 68% de preto é mais preta do que qualquer referência em uma faixa de 24–55%, então "preserve os pretos da origem" exige a coisa errada e igualmente desculpa uma gradagem levantada.chroma_mae— erro a*/b* por zona, usando a mediana (combinando com como os alvos do pacote foram medidos; uma média aqui compara uma estatística sensível à assimetria com uma robusta e relata uma incompatibilidade de definição como um erro).contrast/black_point/white_pointbanding— bins vazios do histograma L* entre bins ocupados. Contar bins vazios totais não funciona: um clipe legitimamente escuro tem bins de destaque vazios.cadence— comprimento médio detectado do shot vs o da referência.
Cuidado com a armadilha de unidades: OpenCV muda a convenção Lab com dtype. Em float32, L* é 0–100 e a*/b* são com sinal; em uint8, L* é 0–255 e a*/b* são deslocados +128. Misturá-los relata erros de croma nas centenas.
Cadeia Completa
python pipeline.py --genero <nome> --refs a.mov b.mov \
--brief "o que acontece" --duracao 12 \
--video-base existente.mp4 --out out/FINAL.mp4
mint → distill → (mint3d) → apply → forge → verify. Estágios 1–3 são cacheados, então iterar em briefs nunca re-mede nada. --dry-run substitui toda chamada de rede: o plano, prompts, layout de trilhas e manifesto ainda são exercitados.
Anti-Padrões
| Não faça | Por quê |
|---|---|
| Uma geração por shot | 21% de eficiência, 12 clipes não relacionados |
| Colocar cor no prompt | Medido como não funcionando; afasta-se da base neutra que a LUT deseja |
| Copiar stream nos cortes | Limites apenas em keyframes destroem o ritmo subsegundo |
| Cortar um vídeo base contiguamente | Remonta o original; todo corte invisível |
| Confiar que compose sobrepõe | Ele não pode; rejeita a segunda trilha |
| Enviar segundos para compose | Silenciosamente 1000x mais curto |
| Entregar apenas com MAE | Adicione a verificação de proporção de fundo |
Filmagem Emprestada Carrega a UI do App de Captura
O pior defeito único encontrado em um corte entregue: o vídeo finalizado enviou o botão de like, contador de visualizações e bolha de comentários de outra pessoa, porque o base …