Phase 08 - Lesson 10

Geração de Vídeo

Uma imagem é um tensor 2-D. Um vídeo é um tensor 3-D. A teoria é a mesma; a computação é de 10 a 100 vezes mais difícil. O Sora da OpenAI (Fev 2024) provou que era possível. Até 2026, Veo 2, Kling 1.5, Runway Gen-3, Pika 2.0 e WAN 2.2 entregam vídeos em produção a partir de texto em 1080p — e a pilha de pesos abertos (CogVideoX, HunyuanVideo, Mochi-1, WAN 2.2) está 12 meses atrás.

Tipo: Build Linguagens: Python Pré-requisitos: Phase 8 · 07 (Latent Diffusion), Phase 7 · 09 (ViT), Phase 8 · 06 (DDPM) Tempo: ~45 minutos

O Problema

Um vídeo de 10 segundos em 1080p a 24fps tem 240 quadros de 1920×1080×3 pixels. Isso representa cerca de 1,5 GB de dados brutos por clipe. A difusão no espaço de pixels é inviável. Você precisa de:

  1. Compressão espaço-temporal. Um VAE que codifica vídeos, e não quadros individuais, em uma sequência de patches espaço-temporais.
  2. Coerência temporal. Os quadros precisam compartilhar conteúdo, iluminação e identidade dos objetos ao longo dos segundos. A rede tem que modelar o movimento.
  3. Orçamento de computação. O treinamento de vídeo é de 10 a 100 vezes mais caro do que o de imagem para o mesmo tamanho de modelo.
  4. Condicionamento. Texto, imagem (primeiro quadro), áudio ou outro vídeo. A maioria dos modelos de produção aceita os quatro.

A arquitetura que resolveu isso é o Diffusion Transformer (DiT) aplicado a patches espaço-temporais, treinado em conjuntos de dados massivos (prompt, legenda, vídeo). Mesma perda de difusão da Lição 06.

O Conceito

Video diffusion: patchify, DiT, decode

Patchify

Codifique o vídeo com um VAE 3D (compressão espaço-temporal aprendida). O latente tem o formato [T_latent, H_latent, W_latent, C_latent]. Divida em patches de tamanho [t_p, h_p, w_p]. Para modelos do estilo Sora, t_p = 1 (patches por quadro) ou t_p = 2 (a cada dois quadros). Um vídeo de 10 segundos em 1080p é comprimido em aproximadamente 20.000 a 100.000 patches.

DiT Espaço-Temporal

Um transformer processa a sequência linearizada de patches. Cada patch possui uma incorporação posicional (positional embedding) 3D (tempo + y + x). A atenção geralmente é fatorada:

  • Atenção espacial dentro dos patches de cada quadro.
  • Atenção temporal entre quadros na mesma localização espacial.
  • Atenção 3D completa é de 16 a 100 vezes mais cara; usada apenas em baixa resolução ou em pesquisa.

Condicionamento de texto

Atenção cruzada (cross-attention) com um codificador de texto grande (T5-XXL para o Sora, o CogVideoX-5B usa T5-XXL). Prompts longos importam — o conjunto de treinamento do Sora continha descrições densas geradas por GPT que tinham em média 200 tokens por clipe.

Treinamento

Perda de difusão padrão (predição de ε ou v) sobre latentes espaço-temporais. Dados: vídeos da web + ~100 milhões de clipes curados + legendas de texto sintéticas. Computação: mais de 10.000 horas de GPU mesmo para uma pequena rodada de pesquisa; na escala do Sora, são mais de 100.000 horas.

O cenário de produção de 2026

Modelo Data Duração máxima Resolução máxima Pesos abertos? Destaque
Sora (OpenAI) 2024-02 60s 1080p Não Primeiro modelo a mostrar propriedades de simulador de mundo em escala
Sora Turbo 2024-12 20s 1080p Não Sora de produção com inferência 5 vezes mais rápida
Veo 2 (Google) 2024-12 8s 4K Não Maior qualidade + física em 2025
Veo 3 2025 Q3 15s 4K Não Áudio nativo e controle de câmera mais forte
Kling 1.5 / 2.1 (Kuaishou) 2024-2025 10s 1080p Não Melhor movimento humano no primeiro trimestre de 2025
Runway Gen-3 Alpha 2024-06 10s 768p Não Ferramentas de vídeo profissionais integradas
Pika 2.0 2024-10 5s 1080p Não Maior consistência de personagens
CogVideoX (THUDM) 2024 10s 720p Sim (2B, 5B) Primeiro modelo aberto na escala de 5B
HunyuanVideo (Tencent) 2024-12 5s 720p Sim (13B) SOTA aberto no final de 2024
Mochi-1 (Genmo) 2024-10 5.4s 480p Sim (10B) Termos mais permissivos
WAN 2.2 (Alibaba) 2025-07 5s 720p Sim Modelo aberto mais forte em meados de 2025

Os pesos abertos estão diminuindo a lacuna mais rápido do que no espaço de imagens: LoRAs do HunyuanVideo + WAN 2.2 já alimentam a maioria dos fluxos de trabalho de código aberto em meados de 2026.

Implementação

O arquivo code/main.py simula a ideia central do DiT espaço-temporal: transformar em patches um pequeno vídeo sintético, adicionar uma incorporação de posição (position embedding) por patch e remover o ruído de toda a sequência usando uma atenção estilo transformer sobre os patches. Sem numpy; Python puro. Mostramos que a coerência temporal surge mesmo em 1-D quando os patches de quadros adjacentes compartilham o mesmo removedor de ruído (denoiser) e incorporações de posição.

Passo 1: transformar em patches um "vídeo" sintético 1-D

def make_video(T_frames=8, rng=None):
    # a "video" is a sequence of 1-D values following a smooth trajectory
    base = rng.gauss(0, 1)
    return [base + 0.3 * t + rng.gauss(0, 0.1) for t in range(T_frames)]

Passo 2: incorporação de posição por quadro

def pos_embed(t, dim):
    return sinusoidal(t, dim)

Passo 3: o removedor de ruído vê toda a sequência

Em vez de remover o ruído de cada quadro de forma independente, nossa pequena rede concatena todos os valores dos quadros + suas incorporações de posição e prevê o ruído para todos os quadros de forma conjunta.

Passo 4: teste de coerência temporal

Após o treinamento, gere uma amostra de vídeo. Meça a variação (delta) quadro a quadro. Se o modelo aprendeu a estrutura temporal, as variações permanecerão menores do que se amostrássemos cada quadro de forma independente.

Armadilhas

  • Amostragem independente por quadro = oscilação (flicker). Se você executar a difusão de imagem em cada quadro separadamente, a saída oscila porque o ruído de cada quadro é independente. A difusão de vídeo corrige isso acoplando os quadros por meio de atenção ou ruído compartilhado.
  • Atenção 3D ingênua = OOM (Falta de Memória). A atenção 3D completa em um latente de 10 segundos a 1080p exige centenas de bilhões de operações. Fatore em atenção espacial + temporal.
  • A legenda dos dados importa mais do que o tamanho. A principal melhoria do Sora em relação aos trabalhos anteriores foi o treinamento com legendas cerca de 10 vezes mais detalhadas (clipes rotulados novamente com o GPT-4). O relatório técnico da OpenAI é explícito sobre isso.
  • Condicionamento do primeiro quadro. A maioria dos modelos de produção também aceita uma imagem como o primeiro quadro. Este é o modo "imagem para vídeo" (image-to-video); o treinamento inclui essa variante.
  • Desvio da física (physics drift). Clipes longos (>10s) recomendam a aplicação de técnicas para mitigar inconsistências sutis. A geração em janela deslizante (sliding-window generation) + ancoragem de quadros-chave (keyframe anchoring) ajuda.

Como Usar

Caso de uso Escolha para 2026
Texto para vídeo de maior qualidade, hospedado Veo 3 ou Sora
Cinemático controlado por câmera Runway Gen-3 com pincéis de movimento (motion brushes)
Consistência de personagens em diferentes clipes Pika 2.0 ou Kling 2.1
Pesos abertos, ajuste fino (fine-tune) rápido WAN 2.2 + LoRA
Imagem para vídeo WAN 2.2-I2V, Kling 2.1 I2V ou Runway
Sincronia labial (lip sync) de áudio para vídeo Veo 3 (áudio nativo) ou um modelo dedicado de sincronia labial
Edição de vídeo Runway Act-Two, Kling Motion Brush, Flux-Kontext (quadro estático)

O custo por segundo de vídeo em paridade de qualidade caiu 20 vezes entre 2024 e 2026.

Produção

Salve outputs/skill-video-brief.md. A habilidade recebe um briefing de vídeo (duração, proporção de tela, estilo, plano de câmera, consistência do assunto, áudio) e produz: modelo + hospedagem, estrutura de prompt (linguagem de câmera, descrição do assunto, descritores de movimento), semente (seed) + protocolo de reprodutibilidade e uma lista de verificação de garantia de qualidade (QA checklist) no nível de quadros.

Exercícios

  1. Fácil. Em code/main.py, compare a variação (delta) quadro a quadro para (a) amostragem independente quadro a quadro e (b) amostragem conjunta da sequência. Relate a média e a variância dessas variações.
  2. Médio. Adicione uma condição para o primeiro quadro: fixe o quadro 0 em um valor específico e gere as amostras para o restante. Meça como o valor fixado se propaga.
  3. Difícil. Use a biblioteca diffusers do HuggingFace para rodar o CogVideoX-2B em uma GPU local. Cronometre o tempo de 20 etapas de inferência em 720p para um clipe de 6 segundos. Faça o perfil (profile) da atenção espaço-temporal para identificar o gargalo.

Termos-Chave

Termo O que dizem O que realmente significa
Video VAE "VAE 3-D" Codificador que comprime (T, H, W, C) → latente espaço-temporal.
Patches "Os tokens" Blocos 3D de tamanho fixo do latente; entrada para o DiT.
Atenção fatorada "Espacial + temporal" Executar atenção sobre o espaço, depois sobre o tempo; ignorar a atenção 3D completa.
Imagem para vídeo (I2V) "Animar esta foto" O modelo recebe uma imagem + texto e gera um vídeo que começa a partir dela.
Condicionamento de quadros-chave "Quadros âncora" Fixar quadros específicos para controlar o arco do vídeo.
Pincel de movimento "Dica direcional" Entrada de interface onde o usuário desenha vetores de movimento na imagem.
Nova rotulagem "Legendas densas" Usar um LLM para rotular novamente os clipes de treinamento com prompts detalhados.
Oscilação (Flicker) "Artefato temporal" Inconsistência quadro a quadro; corrigida com remoção de ruído acoplada.

Nota de produção: latentes de vídeo são um problema de largura de banda de memória

Um clipe de 10 segundos em 1080p a 24 fps tem 240 quadros × 1920 × 1080 × 3 ≈ 1,5 GB de pixels brutos. Após uma compressão VAE de vídeo de 4× (2 × espacial × 2 × temporal), o latente tem cerca de ~100 MB por requisição. Executar isso por meio de um DiT espaço-temporal por 30 etapas com tamanho de lote (batch) 1 significa mover ~3 GB/etapa pela HBM — a largura de banda de memória, e não os FLOPs, é o gargalo.

Três controles de produção, todos retirados diretamente da literatura de inferência em produção (capítulo de inferência):

  • TP ao longo do DiT. Os modelos de texto para vídeo geralmente têm ≥10B de parâmetros. TP=4 em 4 H100s é o padrão; PP=2 × TP=2 para modelos da classe 405B. A latência por etapa cai de forma quase linear com o TP até atingir o limite de comunicação do all-reduce.
  • Lote de quadros = lote contínuo (continuous batching). No momento da geração, o vídeo é conceitualmente um lote de quadros vinculados por atenção. O lote contínuo (in-flight scheduling) se aplica: comece a renderizar o quadro t+1 enquanto o quadro t-1 está sendo retornado, se a arquitetura do modelo permitir a geração em janela deslizante.
  • Cache de preenchimento (prefill) no nível de clipe. Para imagem para vídeo, o condicionamento do primeiro quadro é análogo ao preenchimento de prompt de um LLM: calcule-o uma vez, reutilize-o nas passagens do decodificador temporal. Isso é, na prática, um KV-cache para vídeo.

Leitura Complementar

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).