Aplicação de Estilo
A segunda metade do pipeline. taste-distillation mede referências em um pacote de estilo; isto gera contra esse pacote e corta o resultado.
Contrato de Execução e Entrega
A implementação original está aqui em scripts/; nenhum checkout separado de
ito-video é necessário. 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 trabalho pago.
Inspecione a solicitação do provedor antes de decidir se um novo envio é justificado.
Use takes concluídos existentes sem nenhuma chamada de provedor:
python scripts/pipeline.py --genre example --root stylepacks \
--takes media/take-a.mp4 media/take-b.mp4 --duration 12 --fps 30 \
--out out/review-v1.mp4
--duration é um alvo de cadência de melhor esforço, não um tempo de execução exato.
Tomadas completas 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 retém a
duration real e adiciona duration_contract com os segundos solicitados e reais,
shortfall, overrun 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 tomada classificados de cada execução porque o FCPXML editável e o EDL os referenciam. Ele recusa colisões de saída e relata falhas de exportação da linha do tempo. Uma renderização concluída não é um projeto de editor salvo ou aprovação criativa. Preserve os assets de origem e os checkpoints do projeto versionado antes e depois das edições ao vivo; registre o caminho salvo e o digest separadamente do recibo da linha do tempo em memória.
Os gráficos Fal prontos para clonagem e seu compilador de entrada offline estão documentados
em workflows/README.md. Compile o brief 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 do endpoint atual com o provedor real antes de uma execução paga.
Para Blender, use o GLB texturizado de origem completo; a retopologia é um derivado
com nome separado e nunca substitui essa origem. blender_prop.py suporta
--width 1920 --height 1080 --fps 30 --receipt receipt.json explícito e preserva
a iluminação de borda e texturas de material derivadas do pacote. Salvar uma cena é
diferente de renderizá-la; inspecione o estado do recibo e as imagens empacotadas.
Para sobreposições do 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 um final de origem 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
adições. Os 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, então inspecione a saída renderizada exata antes de relatar a entrega.
Quando Ativar
- "faça um vídeo neste estilo" / "aplique o pacote" / "complemente esta filmagem"
- Montar clipes gerados em algo com ritmo de edição real
- Criar props 3D a partir de um visual e colocá-los de volta no vídeo
- Verificar se uma peça finalizada 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 linguagem de cor zero. Adicione "Cor: nenhuma. Render neutro. A correção de cor é aplicada depois."
- Mantenha duas flags separadas:
--brief(o que ACONTECE: sujeito, ação, lugar) e--style-steer(como PARECE). Mesclá-las vaza palavras de estilo para a cena ("teal" se torna um objeto teal) e palavras de sujeito para a correção. - O modelo responde muito melhor a regras locais e verificáveis do que a globais. "Fundos preto puro e sem luz; sujeitos clareando em direção ao branco" funciona; "contraste extremo" não.
Gere TAKES, Não Tomadas
A leitura óbvia de "combinar a cadência" é uma geração por tomada. É economicamente absurda. Uma referência com média de 0,78 s/tomada 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 gravam um take mais longo e cortam dentro dele. Agrupar tomadas em takes de ~5s: 3 chamadas, 13 segundos gerados, 77% de eficiência e tomadas consecutivas que realmente pertencem umas às outras porque vieram da mesma geração.
Diga ao modelo qual forma você quer, ou ele renderiza um push travado e lento e seis cortes dentro dele são lidos como uma gagueira:
"Filmado como UM take contínuo sem cortes bruscos dentro dele. Será cortado em 6 pedaços de aproximadamente 0,8 s na edição, então o enquadramento, sujeito e luz devem continuar mudando ao longo de todo — qualquer janela de 0,8 s tem que se sustentar sozinha como sua própria tomada."
Regras de Corte
- Re-codifique, nunca stream-copy. Stream copy corta apenas em keyframes, que em 0,78 s significam que o comprimento da tomada 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 tomada. Fatiar um vídeo base em pedaços contíguos e reproduzi-los em ordem apenas remonta o original: todo "corte" cai no meio da tomada e é invisível. Medido, uma montagem de 20 tomadas registrou apenas 12 cortes detectados. Detecte limites reais e pegue todo Nth para que seleções consecutivas sejam garantidamente descontínuas. Isso moveu uma medição de corte de 1,29 s para 0,83 s contra um alvo de 0,78 s.
- Amostre os comprimentos das tomadas da distribuição da referência, não de sua média, para que o corte herde a variância do ritmo em vez de achatar em clipes uniformes.
Regras de Correção de Cor
- Medição direta supera um LUT embutido quando você tem o clipe: meça-o,
combine sua CDF L*, aplique croma por zona.
grade_clip_directalcançou MAE 1,58 e contraste 34,0 contra 34,7. - Âncore, não combine CDF, quando o histograma do clipe é diferente do da referência. Forçar um clipe gerado 68% preto em um histograma de referência movimentado levantou todo o fundo do preto: a preservação do fundo caiu para 26,0% (CDF) versus 69,0% (âncora), enquanto MAE e contraste ambos ainda pareciam excelentes. Padrão para tom ancorado.
- O tamanho do lote importa. Corrigir 48 quadros de uma vez OOM-matou o processo; 6 é seguro.
Comportamento Recuperado da Plataforma fal
Essas observações e exemplos de endpoint vieram do workflow recuperado. Reveja os metadados atuais do endpoint; eles não são garantias sobre todas as futuras versões do provedor. Os modelos de gráfico incluídos registram as entradas de workflow separadamente verificadas, incluindo controle explícito de áudio gerado.
Elas custam tempo real para descobrir. Verifique-as 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 cunhado não pode reentrar em um gráfico de vídeo fal. Renderize localmente, então use fal-ai/ffmpeg-api/images-to-video. |
| compose não pode sobrepor | fal-ai/ffmpeg-api/compose rejeita uma segunda faixa com "Múltiplas faixas de vídeo não são suportadas" — e conta uma faixa image como faixa de vídeo. Ele sequencia apenas uma faixa de vídeo. Componha localmente com ffmpeg. |
| keyframes do compose 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 tomada 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 vive 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 têm o prefixo fal-ai/. kling-video, veo3.1, flux-*, hunyuan-3d, ffmpeg-api têm. |
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 parte | 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 isso ao condicionar em uma única imagem estática.
IDs de modelo e preços mudam. Verifique em fal.ai/models antes de prometer qualquer um deles.
O Ramo 3D
python mint3d.py --genre <nome> --from-stills 4 --retopo --render
python mint3d.py --genre <nome> --prompt "um visor de chrome rachado" --render
- Gere uma placa limpa primeiro; não levante de stills de referência. O requisito de entrada declarado do endpoint é fundo simples, objeto único, objeto >50% do quadro. As bobinas de referência são o oposto disso — colagens, planos gerais, vários sujeitos, gráficos gravados — e elas 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-vista é nomeada por campos de â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 nenhum sinalizadormulti_view— inventá-los degrada cada cunhagem para mono-visual enquanto parece funcionar. Um rótulo de ângulo errado é pior do que omitir a vista, porque o modelo confia nele. - Enderece o GLB por chave, não por posição. A resposta carrega um PNG
thumbnaile um blocomodel_urlsjunto commodel_glb; pegar a primeira URL funciona apenas até as chaves reordenarem, e um PNG de pré-visualização baixa bem — nada falha até o Blender se recusar 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 loop. Uma vez que um turntable são quadros, é filmagem, e todo estágio downstream já lida com filmagem — corrija-a, corte-a, exiba-a como um elemento ou carregue-a como uma referência de condicionamento. Use 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 só funciona em uma estação de trabalho não faz parte de um pipeline.
Verifique, Então Acredite
Cada outro estágio alega um resultado. Verifique-o, e verifique a forma da distribuição, não apenas momentos:
background— parcela do quadro abaixo de L*10 vs o valor do pacote. Compare à referência, não ao clipe de origem: uma origem gerada com 68% de preto é mais preta do que qualquer referência em uma banda de 24–55%, então "preservar os pretos da origem" exige a coisa errada e igualmente desculpa uma correção elevada.chroma_mae— erro a*/b* por zona, usando a mediana (correspondendo a como os alvos do pacote foram medidos; uma média aqui compara uma estatística sensível a assimetria a uma robusta e relata uma incompatibilidade de definição como um erro).contrast/black_point/white_pointbanding— bins de histograma L* vazios entre ocupados. Contar bins vazios totais não funciona: um clipe legitimamente escuro tem bins de realce vazios.cadence— comprimento médio de tomada detectado 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 desviados +128. Misturá-los relata erros de croma nas centenas.
Cadeia Completa
python pipeline.py --genre <nome> --refs a.mov b.mov \
--brief "o que acontece" --duration 12 \
--base-video existente.mp4 --out out/FINAL.mp4
mint → distill → (mint3d) → apply → forge → verify. Etapas 1–3 são armazenadas em cache, então
iterar em briefs nunca mede nada novamente. --dry-run simula toda chamada de
rede: o plano, prompts, layout de faixa e manifesto ainda são todos exercitados.
Anti-Padrões
| Não faça | Por quê |
|---|---|
| Uma geração por tomada | 21% de eficiência, 12 clipes não relacionados |
| Colocar cor no prompt | Medido como não funcionando; afasta da base neutra que o LUT quer |
| Stream-copy dos cortes | Limites apenas em keyframe destroem o ritmo de sub-segundo |
| Cortar um vídeo base contiguamente | Remonta o original; todo corte invisível |
| Confiar que compose faz sobreposição | Ele não pode; rejeita a segunda faixa |
| Enviar segundos para compose | Silenciosamente 1000x mais curto |
| Entregar apenas com MAE | Adicione a verificação de parcela de fundo |
Filmagem Emprestada Carrega a UI do Aplicativo de Captura
O pior defeito único encontrado em um corte entregue: o vídeo finalizado embarcou o botão de like de outra pessoa, contador de visualizações e balão de comentário, porque a base
...