🎬 Janusly Benchmark — Rodada 28

Video-to-Video para troca de cenário com preservação de identidade + áudio

Vídeo longo (77s) via API oficial Kling, 3 chunks de 30s nativos em paralelo, $9.70 reais (consultados via API de cobrança — não a estimativa de $0.90 que eu tinha botado primeiro).

🏆 Plataformas Testadas — ordem: mais recente → mais antiga

Rodada 28 — Pedro 77s no Kling oficial: 3 chunks de 30s nativos em paralelo — escalando R27a pra duração real

★ oficial API · paralelo

Por que rodamos: R27a validou que character_orientation="video" destrava 30s nativo no Kling v3. Próximo passo: vídeo de criador real (Pedro 77s) pra ver se o pipeline escala. Tentamos via Replicate primeiro e quebramos: conta com <$5 de crédito caiu pra rate limit burst=1 (6 req/min) e os 3 chunks paralelos retornaram 402/429. Solução: comprar o Trial Package oficial da Kling ($14, 100 unidades, 5 concurrent, 30 dias) e ir direto na API api-singapore.klingai.com. Funcionou tecnicamente: 3 chunks paralelos de verdade, JWT HS256, hidden param funcionando, vídeo bonito de 77s.

⚠️ Surpresa de custo (consultado via /account/costs): meu chute inicial de "$0.30/call" tava errado. O custo real, batido com a API de billing do Kling, foi 27 unidades por chunk de 30s e 15.3 unidades pelo chunk de 17s. Total 69.3 unidades = $9.70 a $0.14/unidade do Trial. Pra 3min seriam ~162u = $22.68/vídeo. Não é pricing de produto — é pricing de prototipagem.

Sourcepedro-video.mp4 (77s) split em 3 chunks via ffmpeg: 30s + 30s + 17s
char_imagescene-1791a11fa43dc161.png (gpt-image-2 podcast studio · mesma do R27)
APIapi-singapore.klingai.com/v1/videos/motion-control · JWT HS256 · model_name=kling-v3
Param chavecharacter_orientation="video" (hidden) · keep_original_sound="yes"
Concorrência3 chunks submetidos juntos · 5 concurrent disponível no Trial · processamento real paralelo
Tempo~9min wall (paralelo, gargalo no chunk mais lento) · stitched 77.24s
Custo real (API)69.3u = $9.70 por vídeo de 77s · 27u/chunk de 30s · Trial $14/100u → só ~10 vídeos de 77s ou ~3 de 3min
Custo/segundo$0.126/s no Kling oficial v3 (real, /account/costs) · vs $0.07/s std ou $0.12/s pro no Replicate v3 motion-control (real, página do modelo)
Tamanho final38.7MB · 77.24s · stitched via ffmpeg concat (re-encode CRF 20)

Resultado — Pedro 77s completo no Kling oficial

R28 — Kling oficial · 3 chunks de 30s nativos paralelos · 77.24s

3 calls oficial API · $9.70 real (69.3 unidades × $0.14) · pipeline ~9min wall · cenário podcast preservado

Ponto da R28 (revisado 2x): Tecnicamente funciona. Mas tive que corrigir duas vezes a comparação de custo: a primeira ficou em "$0.30/call" (chute), a segunda em "$0.04/s no Replicate" (também chute, contradizendo as notas da R25 onde já tinha registrado $0.05-0.075/s). Pricing real, batido com a página do modelo: Replicate kling-v3-motion-control std $0.07/s, pro $0.12/s · Kling oficial v3 std ~$0.126/s. Pro 77s do Pedro: Replicate std $5.39, Replicate pro $9.24, oficial $9.70. A diferença real é ~1.8x (não 3x) no std, e essencialmente empate no pro. A lição da R28 não é "oficial é caro" — é: o problema da rodada anterior foi burst=1 com conta sem crédito, não falta de provedor. Carregar $20 no Replicate destrava a mesma operação por preço equivalente, sem precisar do JWT/Trial. Kling oficial fica como plano B real (rate limit) ou quando precisar de pro mode garantido. E uma nota meta-honesta: três rodadas seguidas eu publiquei número de custo no site sem consultar billing/pricing real. A partir daqui, regra é: não citar $/s sem antes verificar a fonte oficial do modelo.

Rodada 27 — 30s nativo single-call: Kling v3 hidden param vs Wan 2.2 Animate vs R26 stitched — largando o stitching

★ single-call wins

Por que rodamos: R26 ficou ótimo mas o pipeline tem 4 chunks em paralelo + stitching + autocut. Pedro perguntou: "em vez de cortes de 8-10s dá pra gerar com mais tempo? quanto custa 3min?". Pesquisamos e achamos duas saídas pra fugir do stitching. (A) Kling v3 motion-control tem um param hidden character_orientation="video" que destrava 30s na mesma chamada (não documentado oficialmente, mas o modelo aceita). (B) Wan 2.2 Animate aceita 30s nativo direto na input — sem trick. Mesmo char_image do R26 (cena gpt-image-2 podcast studio), mesmo source video do Pedro 30s.

Source comumpedro-video-30s.mp4 + scene-1791a11fa43dc161.png (gpt-image-2 podcast)
R27a Kling nativekwaivgi/kling-v3-motion-control + character_orientation="video" · single call · 862s · 92.9MB · 1168×1776
R27b Wan nativewan-video/wan-2.2-animate-animation · single call · 1544s · 66.6MB · 768×1168 · merge_audio
Custo R27a~$0.30 (1 call) — 4-5x mais barato que R26
Custo R27b~$1.20-2.40 (1 call de 30s)
Custo R26 stitched~$1.20-1.60 (4 chunks × $0.30-0.40)
Vantagem nativozero juntas, zero autocut perdido nas bordas, zero re-encode

Comparação 3-way — todos os 30s do mesmo source do Pedro

R26 — Kling v3 stitched · 4 chunks · 28.8s

4 chunks de 7.5s + stitch · ~$1.20-1.60 · 5min total

R27a — Kling v3 30s nativo · single call · 30.0s

character_orientation="video" hidden · ~$0.30 · 14min

R27b — Wan 2.2 Animate 30s nativo · single call · 30.0s

merge_audio + go_fast · ~$1.20-2.40 · 26min

Ponto da R27: Se R27a Kling native ficar visualmente equivalente ao R26 stitched, vira o default — 4-5x mais barato, zero stitching, zero juntas visíveis. Se R27b Wan trouxer fidelidade visual superior, justifica os ~$1.20-2.40 pra premium tier. Decisão é qualitativa: assistir os três lado-a-lado e julgar identidade preservada, suavidade dos movimentos, aderência ao cenário e naturalidade nos olhos/boca. Para vídeo de 3min: R27a ~$1.80 (6 calls de 30s) vs R27b ~$7.20-14.40 vs R26 ~$7.20-9.60 (24 chunks). Kling native escala melhor.

Rodada 26 — Kling v3 stitched 30s (V2 fixa) + autocut — reprodução do R24 mas com Kling v3 ao invés de v2.6

★ v3 + estilo R24

Por que rodamos: R25 validou que Kling v3 funciona via Replicate, mas usamos a imagem errada (headshot raw). Pedro apontou que o cenário ficou ruim e cobrou o teste real: 30s stitched + autocut estilo R24, mas agora com v3. Esta é a reprodução fiel do R24 trocando só o modelo (kling-v2.6-motion-control → kling-v3-motion-control), mesma estratégia V2 (char_image fixa = scene composta no gpt-image-2), 4 chunks de 7.5s rodados em paralelo, mesmo prompt/seed.

Modelokwaivgi/kling-v3-motion-control (Replicate)
EstratégiaV2 — char_image fixa em todos os 4 chunks
char_imagescene-1791a11fa43dc161.png (gpt-image-2 podcast studio)
Sourcepedro-video-30s.mp4 (4 chunks × 7.5s)
Paralelo4 workers — todos os chunks em ~310s (5min total)
Custo Kling~$1.20-1.60 (4 × $0.30-0.40)
Autocut$0 (auto-editor + ffmpeg local)
Stitched28.80s · 30.1MB · alta resolução

Output R26 — stitched bruto (28.80s)

V2 fixa, 4 chunks Kling v3 paralelo, char_image = scene podcast studio

Output R26 com autocut — moderado (25s) vs agressivo (20s)

R26a — moderado · 25.27s · poucos cortes

threshold 8% margin 0.1s — só pausas óbvias

R26b — agressivo · 19.73s · muitos cortes

threshold 16% margin 0.05s — ritmo TikTok

Comparação direta — R24 (Kling v2.6) vs R26 (Kling v3)

R24b — Kling v2.6 · agressivo · 19.73s

v2.6, mesmo prompt/seed/chunks/threshold

R26b — Kling v3 · agressivo · 19.73s

v3, único delta vs R24b é o modelo

Ponto da R26: Mesmo source, mesma char_image (scene podcast studio), mesma estratégia V2, mesmo prompt e seed, mesmo autocut. Só muda v2.6 → v3. Se v3 entregar mais qualidade pelo mesmo custo (~$1.20-1.60), passa a ser o default do produto. Se ficar parecido, fica a critério custo/qualidade caso a caso. As durações pós-autocut são idênticas porque o áudio é determinístico — o que muda é a qualidade do frame e a aderência ao cenário.

Rodada 25 — Kling v3 motion-control: Replicate vs Oficial SDK — primeiro teste do v3 que saiu em fev/2026

★ v3 oficial validado

Por que rodamos: Kling v3 saiu em fev/2026 e a gente ainda tava em v2.6. Pra entender se vale migrar, rodamos o mesmo input do Pedro (vídeo 10s + headshot podcast) em duas vias. Replicate é drop-in (já usamos lá pra v2.6, basta trocar o slug do modelo) — caro mas zero setup. Oficial SDK precisa de auth JWT HS256 (Access Key + Secret Key), URL pública pro vídeo de input (servimos via Cloudflare Pages), mas dá acesso a std e pro mode com pricing direto da fonte.

Achado importante sobre Extend: a doc oficial é explícita — Extend feature (estende vídeo até 3min em blocos de 5s) só funciona pra V1.0/V1.5/V1.6, NÃO pra motion-control v2.6 ou v3. A estratégia "gerar 30s + estender até 3min" não funciona com motion-control. Long video continua sendo client-side stitching.

Input comumpedro-video-10s.mp4 + pedro-headshot-podcast-studio.jpg
Replicate v3kwaivgi/kling-v3-motion-control · 1232×1680 · 20.5Mbps · 9.87s · 367s gerar · ~24MB
Oficial v3 stdapi-singapore.klingai.com · 816×1104 · 11.6Mbps · 9.87s · 303s gerar · ~14MB
Auth oficialJWT HS256 (Access Key como iss, Secret Key como signing key, exp 30min, nbf -5s)
Custos 10sReplicate ~$0.50-0.75 · Oficial std $1.26 · Oficial pro $1.68
Custos 10minReplicate ~$30-45 · Oficial std ~$76 · Oficial pro ~$101

Output R25 — Replicate (1080p) vs Oficial std (720p)

R25a — Replicate v3 · 1232×1680 · default quality

drop-in via Replicate — sai em ~1080p sem param de mode

R25b — Oficial v3 std · 816×1104 · 720p

SDK oficial mode=std — barato mas resolução menor

Veredicto R25: Comparação não está em pé de igualdade — Replicate saiu 1080p e oficial saiu 720p (porque escolhi std). Pra comparar qualidade pura faltou rodar oficial em pro mode. Mas já validamos: (1) Kling v3 oficial roda no nosso pipeline (auth JWT, endpoint, polling, callback de URL pública de input — tudo funciona); (2) Replicate v3 sai default em qualidade alta (sem param de mode exposto); (3) Pra Janusly hoje, Replicate continua melhor custo-benefício ($30-45/10min vs $76 oficial std), a menos que precisemos de pro 1080p garantido (oficial $101/10min). Próximo: rodar oficial pro mode pra comparação justa, e gerar V2 de 30s do Pedro com Kling v3 Replicate pra ver se identidade melhora vs v2.6 atual.

Rodada 24 — V2 + auto-editor (CapCut style) — ao invés de esconder cortes, abraça muitos cortes como estilo

★ corte é estilo

Por que rodamos: as R22.1 e R23 tentaram esconder as junções dos chunks com transições. Pedro propôs uma virada de chave: e se a gente parar de tentar esconder e fizer um vídeo onde cortes são parte do estilo? É como Lucas Arrial, Mila Markson, conteúdo TikTok/Reels é editado — auto-editor (e o "remover suspiros" do CapCut) cortam pausas/silêncios e deixam o vídeo denso com cortes constantes. As junções dos chunks viram só "mais cortes" entre dezenas — ficam invisíveis. Bonus: vídeo mais curto e dinâmico = mais retenção.

SourceV2 final (char_image fixa, 28.80s)
Toolauto-editor 29.3.1 (Python, free, MIT)
Threshold moderado8% audio · margin 0.1s · resultado: 25.27s (-3.5s)
Threshold agressivo16% audio · margin 0.05s · resultado: 19.73s (-9.0s)
Custo$0 (auto-editor + ffmpeg locais)
Tempo~2s de processamento por versão

Output R24 — moderado (25s) vs agressivo (20s)

R24a — moderado · 25.27s · poucos cortes

threshold 8% — só corta pausas óbvias, ritmo natural

R24b — agressivo · 19.73s · muitos cortes

threshold 16% — corta respirações + micro-pausas, ritmo TikTok

Hipótese R24: Se o agressivo (R24b) ficar bom, é provavelmente o caminho final pro produto Janusly: V2 (Kling stitched 4 chunks, char fixa) + auto-editor agressivo. Custo: $1.20 por vídeo. Resultado: 30s de input vira 18-22s de conteúdo denso, sem drift de identidade, com cortes como estilo (não como bug). Próximos passos se a hipótese se confirmar: testar com 1min source (8 chunks V2 + autocut → 35-45s final), e adicionar B-roll/legendas tipo Lucas Arrial pra completar o look.

Rodada 23 — V2 + face-zoom transition — char_image fixa (sem drift) + zoom convergindo no rosto nas junções

★ transição cinematográfica

Por que rodamos: dos 4 testes da R22.1, a V2 (char_image fixa) ficou a melhor — identidade preservada do início ao fim sem drift. Mas ainda tinha "quebra" nos cortes entre chunks. A V4 tentou mascarar com zoom mas usou crop centralizado uniforme (afasta de todos os lados igual ao invés de puxar pra cara) — não parece transição, parece glitch. R23 corrige isso: zoom convergindo pro rosto do Pedro (~centro-x, ~30% do topo no half-body podcast 768×1168), 1.0× → 1.15× → 1.0× ao longo de 0.8s nas 3 junções (7.2s, 14.4s, 21.6s). O frame puxa pro rosto e relaxa, igual câmera de cinema.

SourceV2 final (kling-stitch-30s-v2/pedro-kling-stitched-30s-v2.mp4)
Junções7.2s · 14.4s · 21.6s (entre chunks de 7.2s)
Zoom curvetriangular 1.0 → 1.15 → 1.0 em 0.8s (0.4s + 0.4s)
Face anchor(W/2, H*0.30) = (384, 350) — half-body upper third
ffmpeg vfscale upsample por z, crop offset (fx*(z-1), fy*(z-1)) → rosto fixo
Custo$0 (só ffmpeg, audio passthrough)
Tempo~30s de re-encode
Output28.80s · 7.3MB compressed

Output R23 — V2 + face-zoom transition

28.80s · sem drift de identidade · transição focada no rosto nas 3 junções

Comparação — V4 (crop centralizado) vs R23 (face-zoom)

V4 — crop centralizado uniforme (V1 base)

zoom 6%, afasta simétrico — não parece transição

R23 — face-zoom convergente (V2 base)

zoom 15% no rosto + V2 sem drift — push-in cinematográfico

Veredicto R23: Combinação de V2 (char_image fixa = identidade estável) + zoom focado no rosto (0.8s, 15%) entrega a melhor experiência das stitched 30s. Sem drift, e o corte entre chunks vira parte do "ritmo de câmera" ao invés de glitch. Próximas tunings possíveis: zoom mais agressivo (1.20x), curva ease-in/out em vez de triangular, ou auto-detecção de face frame-a-frame (opencv) pra anchors que se movem. Pra produção: usar como Pro tier do Janusly junto com Wan default.

Rodada 22 — Como ir pra 30s+ — Wan 2.2 Animate (single call) vs Kling v2.6 stitched (4 chunks frame-continuity)

★ 30s extension

Por que rodamos: a R21 validou o pipeline visual (gpt-image-2 cena + Kling v2.6 motion-control) mas com limite estrito de <10s no Kling. Pedro mandou: "como fazer um vídeo mais longo, igual ao modelo de referência (30s)?" Duas estratégias possíveis: usar um modelo que aceita 30s direto (Wan 2.2 Animate) ou costurar 4 chunks de Kling com frame continuity. Test data: mesmo source de 30s do Pedro (pedro-video-30s.mp4), mesma cena custom da R21 (scene-1791a11fa43dc161.png, podcast studio half-body), mesma seed/cfg quando aplicável.

Sourcepedro-video-30s.mp4 (3.5MB, 30s)
Char_imagescene-1791a11fa43dc161.png (gpt-image-2, podcast studio)
A — Wan 2.2 Animatewan-video/wan-2.2-animate-animation (Replicate)
A — Custo/tempo~$0.40 / ~25 min (single call, 30s)
B — Kling stitchedkwaivgi/kling-v2.6-motion-control x 4 chunks de 7.5s
B — Custo/tempo~$1.20 / ~10 min (4x $0.30 sequencial)
B — EstratégiaFrame continuity: último frame chunk N → image chunk N+1
Status2/2 sucesso, 30s gerado

Output final — Wan 2.2 (single call 30s) vs Kling v2.6 stitched (4 chunks 7.5s)

A — Wan 2.2 Animate (30s direto, single call)

prediction: xje6kb4b4nrmy0cy148v548sx8 · 30.02s · 25 min GPU · merge_audio:true, go_fast:true

B — Kling v2.6 stitched (4 chunks de 7.5s + ffmpeg concat)

4x kling-v2.6-motion-control · 28.80s · 10 min total · áudio do source overlay

A — Wan 2.2 Animate
  • Bom: 30s num único call, audio merged automaticamente, sem stitching manual
  • Bom: 3x mais barato que Kling stitched ($0.40 vs $1.20)
  • Ruim: 25 min de GPU (vs 10 min do Kling stitched paralelizável)
  • Ruim: output 68MB raw (precisa comprimir pra web)
  • Pegadinha: processo polling por ~25min parece "travado" — fácil interpretar como falha e cancelar (perde GPU billing)
B — Kling v2.6 stitched
  • Bom: qualidade do Kling v2.6 (melhor motion-control disponível) preservada em 30s
  • Bom: frame continuity (último frame chunk N → image chunk N+1) elimina cortes visíveis entre chunks
  • Bom: cache check no script — chunks já feitos são pulados em rerun (resiliente a kills)
  • Ruim: 4 calls sequenciais (não dá pra paralelizar — cada chunk depende do anterior)
  • Pegadinha: chunks de exatos 7.5s (4 x 7.5 = 30s); chunks de 10s seriam rejeitados (Kling exige <10s estrito)
Veredicto R22: As duas rotas funcionam pra 30s. Wan 2.2 Animate é o caminho default pra "1-call → 30s pronto" — mais barato, audio merged automático, mas sujeito a longa espera em GPU. Kling stitched é o caminho pra quem não abre mão da qualidade do Kling v2.6 — frame continuity entrega resultado costurado sem cortes, e o cache do script torna o pipeline resiliente a falhas. Decisão pro Janusly: oferecer Wan como default (mais barato + automático), Kling stitched como "Pro tier" pra quem quer máxima qualidade. Próximo passo: testar duração ainda maior (60-90s) com ambos.

R22.1 — Resolvendo o "drift de identidade" do Kling stitched

Pedro identificou que a versão B (Kling stitched) "vai perdendo a identidade original" ao longo do tempo. Causa raiz: frame continuity é "xerox de xerox" — o último frame do chunk N (já uma reinterpretação do Kling) vira o char_image do chunk N+1, e cada iteração compõe pequenos drifts. Rodamos 3 estratégias em paralelo pra atacar o problema:

V1 (baseline)Frame continuity — char_image N+1 = último frame chunk N
V2 (char fixa)Mesma cena original em TODOS os 4 chunks (sem drift)
V3 (regen char)char_image N+1 = gpt-image-1(frame 0 source N+1, scene ref) — pose alinhada + identidade do source
V4 (zoom mask)V1 + ffmpeg zoom in/out 6% nas junções (7.2s, 14.4s, 21.6s) — disfarça cortes
Custo total testes~$2.52 (V2 $1.20 + V3 $1.32 + V4 $0)
Tempo~15 min (V2/V3 paralelos via worktrees)

Output das 4 variantes (mesmo source, mesma cena, mesma seed)

V1 — Baseline frame continuity (drift visível)

28.80s · $1.20 · char_image[N+1] = last_frame[N]

V2 — char_image FIXA (cena original em todos chunks)

28.80s · $1.20 · sem drift, mas pode haver "salto" de pose nos cortes

V3 — regen char (gpt-image-1 + frame source)

28.80s · ~$1.32 · gpt-image-1 errado pra match de pose (lição aprendida — usar FLUX Kontext)

V4 — V1 + zoom transitions nas junções

28.80s · $0 (só ffmpeg) · zoom 1.0→1.06→1.0 em 0.6s nas junções

Lições R22.1:
  • V2 (char fixa) resolve drift mas não resolve transição — pose pode "saltar" no corte porque chunk N termina onde Kling levou e chunk N+1 começa de novo na pose original.
  • V3 (regen) sofreu da escolha de modelo: gpt-image-1 não é bom pra match de pose específica de uma foto fonte (ele "interpreta demais"). Pra esse caso o certo é FLUX Kontext multi-image. Lição salva pra próxima.
  • V4 (zoom) é "barato e funciona" — não resolve drift, mas mascara visualmente os cortes com movimento de câmera. Combina bem com V1 ou V2.
  • Próximo: V5 = V2 + V4 (char fixa + zoom mask) ou V6 = FLUX Kontext multi-image no lugar do gpt-image-1.

Rodada 21 — Pipeline orchestrator (flow) — gpt-image-2 (cena custom) + Kling v2.6 motion-control encadeados num app visual

★ Pipeline ponta-a-ponta no app

Por que rodamos: sair do "scripts soltos" e validar o pipeline rodando num app visual real (~/dev/flow, Next.js + React Flow + Zustand). Template Cena → Motion Transfer: 1 foto + prompt → gpt-image-2 gera a cena profissional → essa cena vira image + vídeo source vira driving no Kling v2.6 motion-control → vídeo final preserva gestos/áudio do source com Pedro/Diego em cenário de IA. Test data: Pedro (foto headshot real + vídeo 30s trim 9.5s) e Diego (foto + vídeo 9s) rodando o mesmo template, mesmo prompt ("in a modern podcast studio, warm lighting, looking at the camera, half-body shot"), cfg_scale 0.5, seed 42.

Stackflow app local (Next.js 16) → /api/run → /api/kling-motion
Cenagpt-image-2 (OpenAI) — 1024×1536, $0.04/img
Motionkwaivgi/kling-v2.6-motion-control (Replicate)
Vídeo source<10s obrigatório (limite Kling v2.6)
Custo total~$0.35 por vídeo
Tempo total~6 min cena + motion
Output9.3s 720p mp4
Status2/2 sucesso (Pedro + Diego)

Output final — Pedro vs Diego (mesmo template, mesma config)

Pedro — pipeline flow (9.5s source → 9.3s final)

Cena gerada: scene-1791a11fa43dc161.png · final: kling-77c8c8cccc5dabb7.mp4

Diego — pipeline flow (9s source → 9.3s final)

Cena gerada: scene-65a22290bc237bd9.png · final: kling-86d83b4a8f8e6555.mp4

O que funcionou
  • Encadeamento genérico via URLs — output do node 1 (/outputs/scene-*.png) entra direto como input do node 2, sem código de cola
  • Run pipeline 1-click — um botão executa toda a cadeia respeitando ordem topológica
  • Mesmo template pra Pedro e Diego — só trocou os assets, output consistente
  • Custo realista — $0.35 ponta-a-ponta, batendo a estimativa do CLAUDE.md
Pegadinhas descobertas
  • Kling v2.6 rejeita 10.0s exato — limite é estritamente menor que 10s. Trim pra 9.5s resolve
  • Validação de path nos endpoints — precisava aceitar /outputs/ além de /uploads/ pra pipelines encadeados funcionarem
  • Limite de duração herdado — vídeo source longo precisa ser trim antes; pipeline não corta automático
Veredicto R21: Stack do CLAUDE.md (FLUX + Kling) original era um caminho. Esse aqui (gpt-image-2 + Kling v2.6 motion-control) é o que efetivamente roda no flow hoje, ponta-a-ponta. Pipeline visual + 1-click run reduz dramaticamente o atrito comparado ao "rodar 3 scripts em sequência". Próximo passo: trazer o template direto pro app do Janusly em vez de manter no flow (que é experimental).

Rodada 20 — Motion transfer vs Avatar talking-head — mesmo Pedro, mesmo áudio, duas filosofias opostas

★ Comparação A vs B

Por que rodamos: com crédito disponível na conta HeyGen, dava pra fechar finalmente a comparação direta entre as duas abordagens que disputam o caso de uso do Janusly. Rota A (Wan 2.2 Animate via Replicate): motion transfer — pega o vídeo do Pedro real e transfere os movimentos pra char_image em cenário NYC, preservando gestos e expressões reais. Rota B (HeyGen Avatar IV Digital Twin): avatar talking-head — usa o Digital Twin do Pedro já treinado na conta HeyGen + áudio do source, gera gestos sintéticos do twin com lipsync sincronizado. Mesmo source de 30s, mesmo áudio, output 720x1280 nas duas pontas.

Sourcepedro-video-30s.mp4 (576×1024, 30s)
A — Motion transferWan 2.2 Animate (Replicate) — copia movimentos reais
A — Char_imagegpt-image-2 multi-frame (R17 v3) em cenário NYC
A — Custo/tempo~$0.40 / ~20 min
B — Avatar talking-headHeyGen Avatar IV Digital Twin (Pedro treinado)
B — ÁudioExtraído direto do source (mp3 128k)
B — Custo/tempo~$2.00 / ~3 min
B — BackgroundSólido cinza #1a1a1a (matting:true)

Source vs Rota A (Wan motion transfer) vs Rota B (HeyGen Avatar IV)

Source — Pedro real (30s)

A — Wan motion transfer (R17 v3)

B — HeyGen Avatar IV Digital Twin

Rota A — Wan motion transfer
  • Movimentos reais preservados — gestos, expressões e timing do Pedro real, transferidos pro avatar em cenário NYC
  • Cenário customizado — pode ser qualquer ambiente (NYC, Tokyo, escritório) via char_image
  • Custo baixo — ~$0.40 por vídeo de 30s
  • Lento — ~20 min de geração no Wan, sujeito a falhas (PW errors)
  • Limite — drift temporal além de 30s, identidade pode degradar nos últimos segundos
Rota B — HeyGen Avatar IV Digital Twin
  • Lipsync perfeito — sincronização precisa de boca com o áudio do source
  • Gestos sintéticos — vêm do treino do Digital Twin, NÃO do source video. Não copia o "Pedro real" daquela gravação específica
  • Background limitado — sólido ou imagem upload, sem cenário gerado por IA
  • Rápido — ~3 min total (upload + processing + download)
  • Caro — ~$2.00 por vídeo de 30s (5x mais que Wan)
Veredicto R20: As duas rotas resolvem problemas diferentes. Wan ganha quando autenticidade do movimento real importa (criador gravou casual, queremos a versão profissional dele com aqueles mesmos gestos) — é o caso central do Janusly. HeyGen ganha quando velocidade e lipsync importam mais que autenticidade gestual (script novo que o usuário não quer regravar, ou áudio gerado por TTS/voice clone). Custo: HeyGen é 5x mais caro mas 7x mais rápido. Pra MVP do Janusly, Wan é a rota principal — HeyGen vira fallback pra "regenerar com áudio diferente sem precisar gravar de novo".
Pendência da rota A (Wan v1' single source frame): A v1' planejada (gpt-image-2 char_image com 1 frame único do source, pra isolar single vs multi como variável) ficou bloqueada por falta de crédito Replicate. Quando rodar, entra como sub-comparação dentro da R17 (v1' vs v2 vs v3) — não muda o veredicto da R20.

Rodada 18 + 19 — Luma Photon-1 & Ray-2 — testando alternativas no stack: identidade (Photon) e vídeo curto cinematográfico (Ray-2)

★ Luma entra no jogo

Por que rodamos: Luma anunciou Uni-1 (a API pública só expõe photon-1 ainda) e mantém Ray-2 como modelo de vídeo. Hipótese: pode ser mais barato e mais rápido que o stack atual (gpt-image-2 multi-frame + Wan 2.2 Animate). Pegamos os mesmos 4 frames do Pedro NYC (R17) e mandamos como character_ref pro Photon-1, depois usamos a char_image vencedora da R17 v3 como keyframe0 pro Ray-2 gerar 5s de vídeo livre. Comparar: identidade (Photon vs gpt-image-2) e qualidade cinematográfica do vídeo curto sem driving (Ray-2 vs Wan).

R18 — Modelo imagemLuma Photon-1 (character_ref até 4 imgs)
R18 — Tempo16s ★ (gpt-image-2 levou ~30s)
R19 — Modelo vídeoLuma Ray-2 (image-to-video, 5s/720p/9:16)
R19 — Tempo102s ★ (Wan leva ~20min em 30s)
R19 — KeyframeChar_image R17 v3 (Pedro NYC multi-frame)
Custo Ray-2 5s 720p~$0.40 (Wan 30s ~$1.20)

R18 — Identidade: Photon-1 vs gpt-image-2 multi-frame (Pedro NYC half-body)

Luma Photon-1 (4 char_ref)

Pedro NYC Photon-1

gpt-image-2 multi-frame (R17 v3)

Pedro NYC gpt-image-2 R17 v3
Veredicto R18: Photon perdeu identidade. Cabelo cheio com franja (Pedro tem cabelo curto/ralo na frente), barba mais densa, proporções faciais "homem genérico bonitão". Cenário NYC ficou ótimo (taxis, golden hour, profundidade), mas é o oposto do que queremos: priorizou estética sobre fidelidade. gpt-image-2 multi-frame continua imbatível pra identidade.

R19 — Vídeo cinematográfico: Ray-2 a partir da char_image R17 v3

5 segundos de vídeo livre (sem driving), prompt natural ("man speaks naturally with subtle hand gestures, NYC golden hour"). 102s de geração, 720p, 9:16. Compare com a Wan da R17 v3 logo abaixo (que precisou de driving video do Pedro real e levou ~20min).

Ray-2 (livre, sem driving) — 5s

Wan R17 v3 (motion transfer 30s) — referência

Frames Ray-2 @ 0.5s, 2.5s, 4.5s

@ 0.5s — mãos abertas

@ 2.5s — mãos juntas

@ 4.5s — mão no peito + crowd real

O que Ray-2 PROVOU
  • Identidade preservada nos 5s inteiros — usar a char_image vencedora (R17 v3) como keyframe0 funcionou: o homem do vídeo é claramente o Pedro stylizado da char_image
  • Movimento natural de fala — boca abre/fecha, gestos de mão variam (abertas → juntas → no peito) sem morphing
  • Cenário NYC vivo — pedestres reais andando ao fundo no 4.5s (não é foto estática animada)
  • ~12x mais rápido que Wan (102s vs ~20min) e ~3x mais barato (~$0.40 vs ~$1.20)
O que Ray-2 NÃO RESOLVE
  • Não é motion transfer — gestos e fala são "inventados" pelo modelo, não copiados do humano real. Pra Janusly (preservar fala/movimento do Diego/Pedro real) isso não substitui o Wan
  • Limitado a 5-10s — não escala pra vídeo de 30s+ ainda
  • Áudio: Ray-2 não gera fala. Precisa montar áudio separado (ElevenLabs IVC + lip-sync depois) = pipeline extra
Onde Luma encaixa no Janusly: Photon NÃO substitui gpt-image-2 pra char_image (perde identidade). Ray-2 é candidato forte pra B-roll cinematográfico curto — clipes de 5s do "você profissional" em cenários variados (NYC, Tokyo, Dubai, escritório), gerados rápido e barato a partir da char_image R17 v3, pra intercalar com o talking-head principal do Wan no formato split-screen do Lucas Arrial. Pipeline ideal: Wan pro talking-head longo (motion transfer real) + Ray-2 pro B-roll curto (cinematográfico, sem driving).

Rodada 17 — Multi-frame char_image + 30s source — sintetizando identidade de 5 frames pra reduzir drift do Wan

★ Multi-frame v3

Diagnóstico que motivou esta rodada: na Rodada 14 (Pedro NYC, source 77s) o output do Wan ficou perfeito nos primeiros 30s e foi degradando conforme avançou — efeito de drift temporal porque o Wan ancora forte na character_image nos primeiros segundos e depois passa a se basear cada vez mais nos próprios frames gerados, acumulando erro. Hipótese dupla: (1) cortar o source pra 30s mantém o Wan dentro da janela onde a ancoragem na char_image ainda é forte; (2) char_image multi-frame — em vez de 1 frame único do source (que pode ter olho fechado, expressão estranha, mão na frente do rosto), sintetizar a identidade a partir de 5 frames variados via gpt-image-2 com image[] multi-input, gerando uma "DNA visual" mais robusta.

Source Pedro30s · 576×1024 (cortado de 77s)
Source Diego12s · 1280×720 (mesmo da R16)
Frames pra char_image5 por subject (eyes-open, sem legenda)
Char_image genOpenAI gpt-image-2 ★ multi-input
Motion transferWan 2.2 Animate (Replicate)
Tempo Wan Pedro 30s~20 min cada (v2 e v3)
Tempo Wan Diego 12s~4 min (v3)
Custo total rodada~$1.40 (3 Wan + 2 OpenAI)

Etapa 1 — Selecionar 5 frames variados (eyes-open, sem oclusão)

Pra Diego (12s) extraímos frames a cada ~0.5s e visualmente filtramos os 5 com olhos abertos e expressão limpa: 0.5s, 2.5s, 7.0s, 7.5s, 9.0s. Pra Pedro (30s) extraímos a 2s, 8s, 15s, 22s, 28s e cropamos 576×720 do topo pra remover as legendas hard-coded em PT-BR que estavam no terço inferior. O ponto chave: 1 frame ruim contamina a char_image (problema observado na Rodada 16 quando o frame escolhido tinha o Diego de olho meio fechado). 5 frames variados deixam o gpt-image-2 sintetizar a identidade mediana, mais resiliente a artefato pontual.

Diego — frame 0.5s

Diego frame 0.5s

Diego — frame 2.5s

Diego frame 2.5s

Diego — frame 9.0s

Diego frame 9.0s

Pedro — frame 2s (cropado)

Pedro frame 2s

Pedro — frame 15s (cropado)

Pedro frame 15s

Pedro — frame 28s (cropado)

Pedro frame 28s

Etapa 2 — gpt-image-2 sintetiza identidade dos 5 frames

Endpoint /v1/images/edits com model=gpt-image-2, size=1024x1536, quality=high. Em vez do image singular, mandamos image[] 5 vezes via multipart. Prompt explícito: "Hyper-realistic photo of the same man shown across the multiple reference frames — synthesize his identity (face structure, beard, hair, build) from all of them." Resultado: char_image significativamente mais fiel ao real do que a v2 (single-frame) — Pedro com a barba grisalha real, cabelo bagunçado natural, olhar seguro; Diego com o tom certo de cabelo grisalho e expressão de pessoa-conversando.

Diego v3 — char_image multi-frame ★

Diego studio v3 multi-frame

Sintetizada a partir de 5 frames do source (0.5s, 2.5s, 7.0s, 7.5s, 9.0s). Identidade do Diego mais firme — cabelo grisalho com a textura real, olhar limpo, mão na pose certa de gesticulação.

Pedro v3 — char_image multi-frame ★

Pedro NYC v3 multi-frame

Sintetizada a partir de 5 frames do source (2s, 8s, 15s, 22s, 28s). Identidade muito mais fiel: barba mista grisalha, cabelo bagunçado, estrutura facial certa. Pose com as duas mãos no peito, ideal como anchor pro Wan.

Etapa 3 — Wan 2.2 Animate: Pedro 30s v2 (single-frame) vs v3 (multi-frame)

Mesmo source de 30s, mesmo cenário NYC. v2 usa a char_image gerada de 1 frame único da Rodada 14 (gpt-image-2 single). v3 usa a char_image multi-frame desta rodada (gpt-image-2 multi). Custo Wan: $0.40 cada. Tempos: v2 1213s (~20.2min), v3 1135s (~18.9min). Nota: uma terceira variante (v1, char com gpt-image-1 single-frame) estava planejada mas Replicate ficou sem crédito antes do disparo — pode ser adicionada depois.

Pedro v2 — char single-frame (gpt-image-2)

Source 30s + char gerada de 1 frame. Identidade mantida nos primeiros segundos e degrada gradualmente (drift do Wan).

★ Pedro v3 — char multi-frame (gpt-image-2 ×5)

Mesmo source 30s + char sintetizada de 5 frames. Hipótese: identidade mais robusta resiste melhor ao drift temporal.

Frames de comparação (5s · 15s · 25s):

v2 @ 5s

v3 @ 5s ★

v2 @ 15s

v3 @ 15s ★

v2 @ 25s

v3 @ 25s ★

Etapa 4 — Diego v3 multi-frame (12s, podcast studio)

Mesmo source de 12s da Rodada 16, mas com char_image multi-frame em vez do single-frame da v2 (que usou 1 frame extraído @5s). Comparar com a Rodada 16 v2 ★ pra ver se a multi-frame faz diferença visível em vídeo curto onde o drift é mínimo.

★ Diego v3 — char multi-frame

Char_image sintetizada de 5 frames com olhos abertos. Mesmo source 12s, mesmo prompt cenário podcast.

Diego R16 v2 — char single-frame (referência)

Versão da Rodada 16 com char_image single-frame (gpt-image-2 a partir de 1 frame).

Comparação direta — o que mudou desta vez

Esta rodada testa duas variáveis ao mesmo tempo no Pedro (30s + multi-frame char) e isola só a multi-frame char no Diego (12s, mesmo source da R16). A char_image multi-frame em si ficou claramente mais fiel ao real, com identidade mais "média" que captura o sujeito sem herdar nenhuma expressão extrema. Comparar lado a lado v2 (single) vs v3 (multi) nos vídeos acima — a hipótese é que o v3 sustenta a identidade por mais tempo no source de 30s. Frames intermediários extraídos pra inspeção rápida.

O que esta rodada provou
  • gpt-image-2 aceita image[] multi-input via multipart pra sintetizar identidade composta
  • Char_image multi-frame produz uma identidade visivelmente mais fiel ao real (Pedro tem a barba certa, Diego o olhar certo)
  • Wan 2.2 Animate aguenta source de 30s sem cancelar (~20min de processamento)
  • Crop 576×720 das legendas hard-coded do source funciona pra limpar a referência sem perder identidade
O que ainda pode quebrar
  • v1 (gpt-image-1 single-frame) não rodou — Replicate sem crédito. Comparar 3 condições (single-1, single-2, multi-2) ainda pendente
  • Drift temporal pode acontecer mesmo em 30s se source tiver muita oclusão (mão no rosto, etc)
  • Multi-frame depende de seleção manual visual dos 5 frames — automatizar com detector de eyes-open ainda em aberto
  • Source > 30s pode estourar timeout do Replicate (1 dos 3 jobs Pedro foi cancelado a ~15min na primeira tentativa)

Rodada 16 — Frame → Studio → Animate — casa o pipeline original do Janusly: foto + vídeo casual → vídeo profissional

★ Pipeline Janusly v1

O que essa rodada faz: primeira validação de ponta-a-ponta do conceito original do Janusly — "your two faces, one video". Pega um frame qualquer de um vídeo casual do Diego (gravação caseira com guitarras na parede e mic de podcast amador), regera esse mesmo Diego em um studio profissional via OpenAI gpt-image-1 preservando identidade (rosto, barba, cabelo), e usa essa imagem como character_image do Wan 2.2 Animate junto com o vídeo casual original como driving video. Resultado: Diego no studio profissional fazendo exatamente os mesmos movimentos e dizendo exatamente as mesmas coisas do vídeo caseiro.

Source casual12s · 1280×720 · home setup
Frame extractionffmpeg @ 5s do clipe
Image regenOpenAI gpt-image-2 ★ (1024×1536)
Motion transferWan 2.2 Animate (Replicate)
Output12s · 768×1168 · 30fps · áudio mergeado
Tempo total~14 min (1min OpenAI + 13min Wan)
Custo total~$0.46 (OpenAI $0.06 + Wan $0.40)
Identidade✓ preservada (rosto, barba, cabelo)

Etapa 1 — Extração do frame de referência

Do media/diego-heygen/diego-3min.mp4 (gravação curada de 3min) cortamos um clipe de 12s começando aos 30s e extraímos um frame aos 5s do clipe. Frame mostra Diego em ambiente totalmente caseiro: guitarras pendurads na parede, mic de podcast caseiro do lado direito, camiseta azul, gesticulando com as duas mãos no nível do peito.

Source casual — vídeo de 12s (driving video)

Recorte do diego-3min.mp4 começando aos 30s. Diego fala naturalmente em ambiente doméstico com mic amador.

Frame extraído @5s do clipe

Frame casual Diego com guitarras

Foto fonte (64KB) usada como referência de identidade pro OpenAI gpt-image-1 reimaginar em outro ambiente.

Etapa 2 — OpenAI reimagina em studio profissional (comparativo gpt-image-1 vs gpt-image-2)

Endpoint /v1/images/edits com size=1024x1536, quality=high. Prompt descreve: studio de podcast profissional, painéis acústicos navy escuro, mic broadcast SM7B no boom arm, iluminação LED warm com key light difuso à esquerda, lente 50mm cinematográfica, t-shirt navy fitted, mãos visíveis em pose de gesticulação, vertical 9:16. Rodamos em 2 modelos pra comparar: o gpt-image-1 (geração anterior) e o gpt-image-2 (lançado em 2026-04-21, mais recente da OpenAI). Custo: $0.06 cada.

Frame casual (input)

Diego casual

Home setup: guitarras, mic amador, camiseta azul, iluminação flat.

gpt-image-1 (geração anterior)

Diego studio v1

Identidade preservada, mas framing apertado e pose um pouco rígida. Iluminação correta porém menos cinematográfica.

gpt-image-2 (★ mais recente)

Diego studio v2

Framing aberto natural, prateleira com vaso à esquerda dando profundidade, anel + relógio nas mãos, textura de pele realista. Realismo claramente superior.

Etapa 3 — Wan 2.2 Animate transfere movimentos + voz original (v1 vs v2)

Modelo wan-video/wan-2.2-animate-animation recebe (1) video=clipe casual de 12s, (2) character_image=Diego no studio gerado pelo OpenAI, (3) merge_audio=true pra preservar a voz/áudio original do source. Wan extrai os movimentos faciais, gestos das mãos, postura corporal do source casual e aplica esses mesmos movimentos no Diego do studio. Rodamos 2 vezes — uma com character do gpt-image-1 (v1, 12.7min) e outra com character do gpt-image-2 (v2, 11.1min). Custo: $0.40 cada.

Source casual (driving)

Diego em casa, voz e movimentos originais.

Wan v1 — character gpt-image-1

Movimentos transferidos, framing apertado herdado da imagem v1.

★ Wan v2 — character gpt-image-2

Mesmo motion transfer, mas com o character mais cinematográfico do gpt-image-2 — gestos da mão extendendo pra frente, mic Shure visível em primeiro plano, profundidade real do studio. Esse é o conceito Janusly em produção.

Por que isso fecha o conceito Janusly

A promessa do Janusly sempre foi "your two faces, one video" — você grava casual, devolvemos você profissional. Até a Rodada 15 o pipeline tinha foco em Reels narrativos com b-roll. Esta rodada validou o core original: qualquer vídeo seu vira você-versão-pro em outro ambiente, mantendo voz e movimentos. Com $0.46/video e 14min de processamento, isso já é viável pra MVP. Próximo: rodar com 30s, 60s e ver onde quebra.

O que provou
  • OpenAI gpt-image-1 preserva identidade muito melhor que FLUX em prompts complexos com cenário novo
  • Wan 2.2 Animate aceita imagem reimaginada como character — não precisa ser foto real
  • Custo de pipeline ponta-a-ponta cabe em $0.50/video curto
  • Tempo total < 15min é aceitável pra fluxo assíncrono
O que ainda falta validar
  • Vídeos mais longos (30s, 60s) — Wan tem teto?
  • Mãos longe do peito (acima da cabeça, fora do frame) — preservação?
  • Múltiplos ambientes (escritório, palco, NYC) com mesmo source
  • Pipeline automatizado web (Diego apenas envia foto + vídeo)

Rodada 15 — Decisões de custo + abstração do editor — testamos 2 alternativas pra baixar custo, ambas perderam pro setup atual

★ Refactor + benchmark

O que essa rodada faz: a Rodada 13 (Reels Neuralink v3/v4) ficou pronta com custo marginal de ~$1.51/vídeo (Wan 2.2 Animate $0.40 + sync/lipsync-2 $1.38, com a voz do ElevenLabs IVC v2 já fora do cálculo porque é assinatura mensal). Esta rodada explorou 2 frentes pra reduzir esse custo: (1) HeyGen Audio-to-Video direto via API, que em tese eliminaria o lipsync do Replicate aproveitando o Digital Twin já treinado, e (2) kwaivgi/kling-lip-sync como substituto do sync/lipsync-2. Em paralelo, refatoramos o NeuralinkShort.tsx em BRollComposition<Theme> pra que o próximo Reels não precise fork do componente — só plugar dado.

Custo atual (locked)~$1.51 / Reels 53s
HeyGen API✗ exige créditos API à parte
Kling lip-sync✗ teto 10s/chamada
Refactor✓ idêntico pixel-a-pixel
Decisãomanter sync/lipsync-2 + Replicate
Próximo Reelsdata-only (criar themes/foo.ts)

1️⃣ HeyGen Audio-to-Video direto via API — falhou

Hipótese: como o Diego já tem Digital Twin treinado na conta HeyGen, podia usar a rota POST /v2/video/generate passando character.type=avatar + voice.type=audio com audio_asset_id do MP3 do ElevenLabs já clonado. Se funcionasse, custo marginal por Reels iria pra ~$0.40 (só Wan, sem lipsync). Upload do áudio passou (200 OK), mas a chamada de geração retornou MOVIO_PAYMENT_INSUFFICIENT_CREDIT. Investigação confirmou: o plano mensal HeyGen cobre só "studio credits" (uso via interface web). Rota API precisa de "api credits" comprados à parte (~$0.30/min Avatar III, $1.30/min Avatar IV) com depósito mínimo de $5. Pesquisa de pricing completa em docs/heygen-api-pricing-2026-05.md: nenhum plano API HeyGen vence o sync/lipsync-2 ($1.38/53s) com qualidade equivalente.

Tabela de custo HeyGen API vs Replicate (vídeo de 53s)
  • Replicate sync/lipsync-2: $1.38 — qualidade alta, validado em produção ✓
  • HeyGen Avatar IV API: $2.65–3.54 — qualidade alta, mas 2× mais caro
  • HeyGen Lipsync Speed API: $1.77 — comparável em qualidade, ainda mais caro
  • HeyGen Avatar III API: $0.89 — único mais barato, mas tech antiga (lip-sync visivelmente pior)

2️⃣ kwaivgi/kling-lip-sync — funciona pra clipes curtos, falha em escala

Hipótese: o Kling tem lipsync próprio (kwaivgi/kling-lip-sync v8311467f, oficial Kuaishou, 43k runs no Replicate) que poderia ser concorrente do sync/lipsync-2. Testamos com um chunk de 9s do vídeo Diego + áudio ElevenLabs v2. Resultado abaixo — qualidade boa, fundo escuro preservado, boca sincroniza naturalmente. Bloqueio: teto de 10s por chamada. Pra cobrir os 53s do Reels precisaria fatiar em 6 chunks + stitch (frame-perfect alignment é não-trivial). Processing também é 4.5× mais lento por segundo (21.9× realtime vs 4.9× do sync/lipsync-2). Sem vantagem de custo nem de qualidade. Análise completa em docs/lipsync-kling-vs-sync-2026-05.md.

sync/lipsync-2 (em produção, 53s)

Reels final v4. Lipsync rodou no vídeo inteiro de 53s em 1 chamada, custo $1.38.

kwaivgi/kling-lip-sync (teste 9s)

Chunk de 9s do Diego com áudio ElevenLabs v2 sincronizado pelo Kling. Qualidade equivalente ao sync/lipsync-2, mas teto 10s/chamada inviabiliza Reels longos sem stitching complexo.

3️⃣ Refactor: NeuralinkShortBRollComposition<Theme>

A composição estava monolítica — toda lógica de B-roll, captions, PiP avatar, soundtrack e brand label hardcoded no NeuralinkShort.tsx. Pra próximo Reels (Anthropic, OpenAI, etc) seria fork do componente. Refatoramos pra dado + componente genérico:

video-editor/src/
├── BRollComposition.tsx  # componente genérico, recebe theme: BRollTheme
├── broll.ts              # só os tipos BRollSegment + Caption
├── themes/
│   └── neuralink.ts      # dados Neuralink (segments, captions, avatar, trilha)
└── Root.tsx              # itera array de themes, registra 1 Composition por tema

Pra criar Reels novo agora: criar themes/anthropic.ts com segments + captions + avatarVideo + brandLabel, adicionar no array themes do Root.tsx, plugar B-roll em public/broll/, rodar npx remotion render src/index.ts AnthropicShort out/anthropic.mp4. Zero código React novo. Smoke test do refactor: rerendizamos o Neuralink com a versão genérica e comparamos com o pré-refactor — frames idênticos, mesma duração (53.226s), mesmo audio (aac 48kHz stereo 317kbps), mesmo número de frames (1595). Variação só no tamanho do arquivo (29.7MB vs 37MB) — não-determinismo do x264 com --concurrency=4, sem impacto visual.

Decisão final
  • Custo Janusly Reels travado em ~$1.51/vídeo até HeyGen baixar API ou aparecer lipsync mais barato no Replicate
  • Pipeline atual: ElevenLabs IVC v2 (TTS) → Wan 2.2 Animate ($0.40) → sync/lipsync-2 ($1.38) → BRollComposition (Remotion local, $0)
  • Próximo Reels: criar arquivo de tema, sem refactor de componente
  • Voz, lipsync e editor já são "infra estável" — foco volta pra geração de conteúdo
O que ficou aberto
  • HeyGen Avatar III API ($0.89) — único path teoricamente mais barato, mas precisa depositar $5 + validar qualidade
  • Kling lipsync com stitching de 6 chunks — viável mas adiciona complexidade sem ganho de custo
  • Próximo Reels real (Anthropic? OpenAI?) — primeiro uso prático da abstração
  • Template themes/_template.ts comentado pra acelerar criação de novos temas

Veredito: investigação que não mudou o pipeline mas validou que ele é o ótimo local. Em ambos os benchmarks, o setup atual venceu — HeyGen API por preço, Kling lipsync por escalabilidade. O refactor abriu espaço pra próximo Reels ser questão de dado, não de código. Conhecer o teto é tão valioso quanto subir o teto.

Rodada 13 — B-roll Editor (Remotion) — avatar Diego + imagens de notícia real + captions cinéticas em 9:16

★ Editor programático

O que essa rodada faz: pega o vídeo bruto do Diego falando sobre Neuralink (gravado em chroma green pelo HeyGen Digital Twin), troca a voz robotizada do HeyGen pela voz clonada no ElevenLabs (IVC PT-BR), re-sincroniza a boca via sync/lipsync-2 e compõe via Remotion um Reels vertical 1080×1920 com (1) avatar do Diego em PiP circular pulsante no canto superior direito, (2) 9 segmentos de b-roll com imagens reais de notícia (Wikimedia + Fox News + MIT Tech Review) sincronizados com o discurso via Whisper word-level, (3) captions cinéticas word-by-word com reveal animado, (4) Ken Burns em diagonal nas imagens, (5) progress bar com gradiente cyan→verde, (6) badge contador "01/09" e título/subtítulo grandes por segmento. Tudo declarado como componente React, renderizado headless via remotion render.

StackRemotion 4.0.220 + React 19
Source avatarHeyGen Digital Twin Diego (51s)
VozElevenLabs IVC + eleven_multilingual_v2
Lip-syncsync/lipsync-2 (Replicate)
Sync B-rollWhisper word-level (medium PT)
B-roll9 imagens — Wikimedia, Fox News, MIT TR
Formato9:16 vertical (1080×1920) @ 30fps · 53.2s
Output9.4 MB (h264 CRF26 + AAC 96k stereo)
Trilhalo-fi Pixabay CC0 · volume 0.12 · loop

Source — Diego no HeyGen (chroma green, 51s, voz HeyGen)

Avatar gerado via HeyGen Digital Twin com texto + voice clone do HeyGen (robotizada em PT-BR)

Output v4 — Reels final (IVC real + trilha lo-fi de fundo, 53.2s)

v4 = v3 + trilha lo-fi instrumental de fundo (Pixabay CC0, volume 0.12, em loop). Áudio mixado em 2 camadas via Remotion: voz principal do OffthreadVideo + Audio component da música. v3 sem trilha disponível em aqui.

Mapa do roteiro × b-roll (9 segmentos · timestamps via Whisper no áudio v2)

0.0–4.95s Neuralink — logo
4.95–9.88s Elon anuncia produção em massa
9.88–20.4s Chip Link — escala global
20.4–28.7s Robô cirurgião aprende
28.7–35.45s Brad Smith (3º paciente, ELA)
35.45–40.18s Escreve com pensamento
40.18–44.22s Interface cérebro-máquina
44.22–48.42s Não é mais ficção
48.42–53.16s Isso muda tudo
Onde isso encaixa no Janusly
  • Etapa pós-stack: depois do FLUX+Kling/Wan transformar a gravação, o editor empacota pro feed
  • Reels/TikTok exigem 9:16 + captions + ritmo visual — esse layer entrega isso programaticamente
  • Dá pra parametrizar por sujeito, tema, paleta — vira template reutilizável
  • Render local, sem custo marginal por vídeo (só compute do user)
Pendências e achados
  • B-roll é imagem estática — testar clips de vídeo (YouTube, Pexels)
  • Trilha sonora ambiente (lo-fi/beat) ainda não foi adicionada ✓ adicionado na v4 (Pixabay CC0, volume 0.12, loop)
  • Composição é fixa pro tema Neuralink — abstrair em template parametrizável
  • Lip-sync v2 funciona bem mas alguns frames ainda têm leve borrão na boca em close — testar kwaivgi/kling-lip-sync como alternativa
  • Tentamos eliminar o custo do Replicate (~$1.33/vídeo) usando HeyGen Audio-to-Video direto via API — falhou com MOVIO_PAYMENT_INSUFFICIENT_CREDIT. Plano HeyGen mensal cobre só "studio credits" (uso via interface web); rota API exige "api credits" separados. Conclusão: Replicate sync/lipsync-2 segue sendo a única rota válida no momento.

Veredito v3: a v2 sofreu de um erro grosseiro de IVC — usei os 51s da voz do HeyGen como sample de treino, e o ElevenLabs clonou fielmente a voz... robotizada. Resultado: dois clones com a mesma cara. A v3 corrige isso treinando o IVC com 3min do áudio REAL do Diego (vídeo OBS de 2026-01-23, fala natural sem TTS no meio). Agora sim a prosódia é o Diego de verdade — respiração, pausa, "tipo", "sacou" — não a versão sintética. Aprendizado pra reter: nunca treinar voice clone com áudio sintético, sempre com gravação original do humano. Fluxo final v3: OBS (sample real) → ElevenLabs IVC v2 → TTS roteiro → Whisper word-level → sync/lipsync-2 → Remotion (Reels). Próximo: abstrair em BRollComposition<Theme> e plugar no fim do pipeline Janusly como output opcional "formato Reels".

A/B da voz — 3 fontes (HeyGen × ElevenLabs com sample errado × ElevenLabs com áudio REAL)

Comparação das 3 versões de voz no mesmo roteiro Neuralink. Modelo eleven_multilingual_v2 nas duas IVCs, mesmas settings stability=0.45 similarity_boost=0.85 style=0.25. Aprendizado central: o sample que alimenta o IVC define o ceiling de qualidade — clonar uma voz já robotizada produz outra voz robotizada.

HeyGen Digital Twin (origem)

50.7s — voice clone do HeyGen, prosódia robotizada, pausas artificiais

ElevenLabs IVC v1 — sample do HeyGen ❌

55.8s — IVC alimentado com a voz do HeyGen como sample. Resultado: ElevenLabs clonou fielmente... a voz robotizada. Mesmo defeito da origem.

ElevenLabs IVC v2 — áudio REAL ✓

53.5s — IVC treinado com 3min do vídeo OBS de 2026-01-23 (Diego falando natural). Prosódia, ritmo e timbre reais. Esta é a versão que vai pro Reels v3.

Rodada 14 — Wan Animate NYC (OpenAI ref) — cenário custom + meio-corpo com mãos visíveis (v1 gpt-image-1 vs v2 gpt-image-2 ★)

★ Cenário custom
Custo~$0.60 / 77s
Tempo~65 min (single pass)
StackOpenAI gpt-image-2 ★ + Wan 2.2 Animate
Resoluçãovertical, igual ao source
IdentidadePedro pro em NYC (preservada)
ÁudioOriginal do Pedro (merge_audio)

O que essa rodada resolve: Rodada 12 (Wan + FLUX studio) cumpriu a promessa Janusly mas com cenário neutro (estúdio cinza) e enquadramento headshot — Wan replicou o crop apertado, cortou as mãos. Esta rodada testa cenário custom (Nova York, terno navy, golden hour) com referência meio-corpo gerada pelo OpenAI. v1 usou gpt-image-1; v2 (★) repete tudo com gpt-image-2 (lançado 2026-04-21) — realismo nitidamente superior, profundidade cinematográfica, micro-detalhes (Chrysler Building ao fundo, pedestres, golden hour mais quente).

Imagens de referência — gpt-image-1 vs gpt-image-2 ★

v1 — gpt-image-1

Pedro de terno navy, NYC, mãos abertas — primeira geração

v2 — gpt-image-2 ★

Mesmo prompt, modelo novo: pele com micro-textura, profundidade real, táxis e pedestres definidos

Vídeo final — Wan Animate v1 vs v2 ★ (77s, single pass)

v1 — Wan + gpt-image-1

v2 — Wan + gpt-image-2 ★

Comparação lado a lado — casual vs v1 vs v2 ★

5s — casual

5s — v1 (gpt-image-1)

5s — v2 (gpt-image-2) ★

35s — casual

35s — v1

35s — v2 ★

65s — casual

65s — v1

65s — v2 ★

✓ O que essa rodada destrava

  • Cenário custom (NYC) — não só estúdio neutro
  • Mãos visíveis no output (referência meio-corpo, não headshot)
  • OpenAI gpt-image-2 ★ supera FLUX e gpt-image-1 em fotorrealismo + identidade
  • Mesmo pipeline Janusly: 2 passos (image gen + Wan), single pass
  • Áudio e gestos originais preservados

✗ Trade-offs honestos

  • Imagem ref custa ~$0.20 (OpenAI quality=high) vs $0.05 FLUX
  • Tempo total parecido com Rodada 12 (~65-75min Wan)
  • Cenário com movimento (carros, pessoas) pode introduzir artefatos
  • Identidade ainda re-renderizada pelo Wan (~85% match)
  • v2 às vezes exagera micro-textura de pele em frames específicos

Veredito: esta rodada prova que o pipeline Janusly escala pra qualquer cenário, não só estúdio. A descoberta da v2 é que OpenAI gpt-image-2 (★, lançado 2026-04-21) vira o gerador padrão pra cenários custom (NYC, escritório, livraria) — supera FLUX e o próprio gpt-image-1 em profundidade, micro-detalhes e identidade. FLUX fica reservado só pra cenários neutros econômicos. Próximo: validar com mais sujeitos além do Pedro e otimizar throughput.

Rodada 12 — Wan Animate Pro Outfit + Studio — troca roupa E local mantendo voz/movimentos

★ Caminho Janusly real
Custo~$0.40 / 77s
Tempo~75 min (single pass)
StackFLUX studio headshot + Wan 2.2 Animate
Resolução816×1104 (vertical, igual ao source)
IdentidadePedro pro (preservada)
ÁudioOriginal do Pedro (merge_audio)

O que essa rodada resolve: Rodada 10 (Kling Stitched) entregou "Pedro pro" mas em horizontal 1168×768 (perdeu o formato vertical do source) e com pequenas inconsistências entre os 8 cortes. Esta rodada usa Wan 2.2 Animate Animation em uma única chamada com character_image=Pedro de terno em estúdio (FLUX) + video=source 77s + merge_audio=true. Resultado: vídeo único de 77s mantendo aspect ratio vertical original, Pedro consistente do início ao fim, voz original preservada e gestos do source replicados (mão na testa aos 5s, postura aos 35s, gestos aos 65s).

Vídeo final (77s, single pass Wan Animate)

Pedro pro (terno + estúdio cinza), 77s, vertical 540×730, áudio original.

Comparação lado a lado — mesmo timestamp, casual vs pro

5s — casual

5s — pro (Wan)

35s — casual

35s — pro (Wan)

65s — casual

65s — pro (Wan)

✓ Por que essa é a resposta

  • Roupa e local trocados em uma única passada — promessa Janusly cumprida
  • Mantém aspect ratio vertical do source (816×1104) — formato "celular gravado em casa"
  • Identidade Pedro consistente nos 77s (single call, sem stitching)
  • Áudio original 100% preservado, sincronia labial natural via motion transfer
  • Custo 6× menor que Kling Stitched ($0.40 vs $2.40)
  • Single API call no Replicate — pipeline mais simples que costurar 8 chamadas

✗ Trade-offs honestos

  • Tempo de processamento longo (~75 min pra 77s) — não viável pra realtime, ok pra async
  • Output bruto 139 MB raw (precisa compress pra web)
  • Levemente menos sharp que Kling em close-ups extremos
  • Single point of failure: se a chamada falha, retomar sem repagar é via prediction polling

Veredito: esta é a Janusly real. Casual virou pro, mantém voz, gestos e identidade, em formato vertical (igual o source). Custo viável ($0.40 por 77s) e pipeline limpo (FLUX + Wan, dois passos). Próximo: testar com cenários customizados além de "estúdio cinza" (escritório, podcast booth, livraria), validar com sujeitos além do Pedro, e otimizar throughput pra reduzir os 75min de processamento.

Rodada 11 — Pedro 4-way — mesmo discurso, 2 stacks (HeyGen DT × Janusly), 2 cenários (estúdio × podcast)

★ Comparativo direto

O que essa rodada faz: pega o Pedro (Digital Twin já treinado no HeyGen + voice clone + vídeo source de 9s) e roda 4 testes paralelos. Dois pelo HeyGen — Digital Twin gera o avatar falando o texto com voz clonada, em chroma green e em foto de cenário podcast. Dois pelo Janusly stack — FLUX Kontext gera headshot do Pedro num cenário diferente (estúdio vs podcast), Kling v2.6 transfere os movimentos do vídeo casual de 9s pro Pedro novo. Mesma identidade source, mesmas configurações em cada par. Permite ver o trade-off real: HeyGen tem áudio sintético consistente e enquadramento controlado, Janusly tem movimento autêntico e áudio original.

SujeitoPedro (mesmo Digital Twin)
Source HeyGenTexto + voice clone
Source Januslypedro-video-9s + áudio original
Custo HeyGen × 2incluso na assinatura
Custo Janusly × 2~$0.70 ($0.35 cada)
Tempo HeyGen~2 min cada
Tempo Janusly~6 min cada

Headshots gerados (FLUX Kontext, input: pedro-headshot-real.jpg)

Estúdio cinza, blazer escuro

Estúdio podcast, painel acústico

Cenário 1 — Estúdio

HeyGen Digital Twin (chroma green)

Avatar fala texto, voz clonada, fundo verde puro pra editor cortar

Janusly stack (FLUX + Kling)

Pedro pro (estúdio cinza) com movimentos e áudio originais do vídeo casual de 9s

Cenário 2 — Podcast

HeyGen Digital Twin (foto cenário podcast)

Avatar composta sobre cenario-podcast.jpg via image_asset_id

Janusly stack (Pedro pro em estúdio podcast)

Pedro pro num estúdio podcast (FLUX) fazendo os mesmos gestos e falando o mesmo áudio

HeyGen DT — quando vence
  • Roteiro novo (sujeito não precisa gravar de novo)
  • Áudio sintético consistente (sem ruído ambiente)
  • Enquadramento estável (closeUp controlado)
  • Custo marginal por vídeo zero (assinatura)
  • Chroma green ready pra editor cortar
— Limitações
  • Movimento é o que o HeyGen escolhe, não o do Pedro
  • Voz clonada nunca é 100% (sotaque, prosódia, hesitações)
  • Composição sobre cenário podcast fica chapada (sem profundidade)
Janusly stack — quando vence
  • Áudio original real do Pedro (autenticidade)
  • Movimentos exatos do Pedro casual
  • Pedro vira pro de verdade (estúdio integrado)
  • Profundidade visual coerente com o cenário
— Limitações
  • Cap em 10s por vídeo (Kling v2.6)
  • Sujeito precisa gravar pra cada vídeo novo
  • Identidade ~85% (Kling re-renderiza o rosto)
  • Custo $0.35 por vídeo de 10s

Veredito: são produtos diferentes. HeyGen é "fábrica de conteúdo" — você grava 1 vez, gera infinitos vídeos com texto novo. Janusly é "transformação de gravação real" — toda vez que você grava, vira pro. O Pedro é o caso onde a gente já tem material pra comparar honestamente: se você quer escalar conteúdo de marca pessoal, HeyGen ganha. Se você quer que esse vídeo específico fique pro mantendo a fala original, Janusly ganha. Os dois caminhos coexistem no mesmo sujeito.

Rodada 10 — Kling Stitched 77s — Pedro casual virou Pedro pro via 8 segmentos costurados

Custo~$2.40 / 77s
Tempo~8 min (paralelo)
StackFLUX headshot + Kling × 8 + ffmpeg concat
Resolução1168×768
IdentidadePedro pro (consistente)
ÁudioOriginal do Pedro

O que essa rodada resolve: a Rodada 8 (Background Replacement) preserva 100% o Pedro mas só troca o fundo — Pedro continua casual com fundo de estúdio, não vira "Pedro profissional". A premissa Janusly é mais ambiciosa: casual virou pro de verdade. O caminho validado original (FLUX Kontext + Kling motion-control) entrega isso, mas Kling v2.6 cap em 10s. Esta rodada quebra a barreira: cortamos os 77s em 8 segmentos de ~9.66s, rodamos os 8 em paralelo no Kling com mesma seed (42), mesmo headshot, mesmo prompt, costuramos com ffmpeg concat e overlay do áudio original. Resultado: vídeo inteiro de 75s do Pedro pro fazendo exatamente os mesmos gestos do Pedro casual, voz original do Pedro preservada.

Vídeo final (77s costurado de 8 segmentos Kling)

Pedro pro (suit + estúdio cinza) com áudio original e movimentos do casual. 75s, 23MB, 1168×768.

Comparação lado a lado — mesmo timestamp, casual vs pro

5s — casual

5s — pro (Kling)

42s — casual

42s — pro (Kling)

68s — casual

68s — pro (Kling)

✓ Por que essa é a resposta

  • Entrega a promessa Janusly de verdade: casual virou pro
  • Identidade do Pedro consistente entre os 8 segmentos (mesma seed/headshot)
  • Gestos transferidos com fidelidade — mão na testa (5s), mão estendida (42s), mão apontando (68s)
  • Áudio original 100% preservado (sincronia labial vem da motion transfer)
  • Stack 100% via Replicate, sem dependência de player/SaaS
  • Sem limite de duração — basta cortar em mais segmentos

✗ Trade-offs honestos

  • Custo 24× maior que bg replacement ($2.40 vs $0.10 por vídeo de 77s)
  • Aspect ratio horizontal forçado pelo Kling (1168×768) — perde formato vertical do source
  • Pequena variação de framing entre cortes (segmentos têm enquadramentos levemente diferentes)
  • Fundo padrão Kling (cinza estúdio) — pra cenário específico precisa segunda passada
  • Tempo de processamento dependente de paralelismo da conta Replicate

Veredito: esta é a Janusly real. A Rodada 8 (bg replacement) era honesta sobre identidade mas não cumpria a promessa de transformação — era "Pedro casual com fundo de estúdio", não "Pedro profissional". A Rodada 10 cumpre: Pedro vira pro, mantém os movimentos, mantém a voz, mantém a identidade. O custo de $2.40 por vídeo de 77s é viável pra um produto que cobra $19-49/mês com créditos limitados. Próximo passo: testar consistência entre segmentos com seeds variadas, validar com mais sujeitos além do Pedro, integrar bg customizado via composite pós-Kling.

Rodada 9 — Diego Digital Twin (HeyGen) — teste com sujeito real do Janusly + roteiro inédito

✓ Avatar treinado
Custo~$0.07/min
Treino~15 min (3 min vídeo)
Enginedigital_twin
Vozclone auto-gerado (Diego)
Input3 min do source 1h05
FramingcloseUp + matting

Mudança de premissa: as rodadas anteriores usaram o Pedro como sujeito de teste. Esta rodada inverte e usa o próprio Diego (dono do projeto) — confirma que a stack HeyGen Digital Twin funciona tal qual no Pedro com sujeito novo, e abre porta pra usar o avatar do Diego em conteúdo real. Cortamos os 3 primeiros minutos do source de 1h05 (2026-01-23 10-40-27.mp4), subimos pro POST /v3/avatars com type=digital_twin, e em ~15 min o HeyGen entregou o avatar treinado + voice clone auto-gerado da fala do Diego. Geramos dois vídeos comparativos com o mesmo avatar.

A) Roteiro inédito sobre Neuralink — fundo escuro

Avatar Diego + voice clone TTS lendo roteiro de ~1 min sobre as últimas da Neuralink (produção em massa dos chips Link, Brad Smith virou 3º paciente com ELA escrevendo pelo cérebro). Fundo #1a1a1a, 1280×720.

B) Mesmo avatar em chroma key verde — pra editor cortar

Mesmo avatar e voz, fala curta de teste do Janusly, fundo verde chroma #00b140 — pra cortar e colocar qualquer cenário na edição.

✓ O que essa rodada confirma

  • Stack HeyGen Digital Twin replica em sujeito novo sem ajuste
  • 3 min de vídeo (cortados de 1h) bastam pro treino
  • Voice clone do Diego sai natural em PT-BR no primeiro shot
  • Mesmo avatar gera múltiplos vídeos com bg trocável (cor sólida ou chroma)
  • Roteiro novo (Neuralink) abre uso real pra conteúdo, não só teste técnico

✗ Limites herdados do tier

  • Mesmas limitações da Rodada 7 — gestos próprios do HeyGen, não os do Diego
  • Não é motion transfer: é avatar trained falando, não Diego do dia gravado virou pro
  • Custo recorrente por minuto continua
  • Bg de cor sólida / chroma é workaround — cenário gerado por imagem precisa BG dedicado (FLUX)

Veredito: validação prática de que o avatar Diego está usável pra conteúdo real (vídeo Neuralink) e pra workflow de editor (chroma green). Não muda a conclusão estratégica das rodadas com Pedro — Background Replacement (Rodada 8) ainda é o caminho Janusly real porque preserva o sujeito original. Mas o avatar Diego no HeyGen vira ferramenta utilitária pra conteúdo onde o Diego não precisa gravar a cada vez.

Rodada 8 — Background Replacement — mantém Pedro inteiro, só troca o fundo

✓ Funciona, mas não cumpre a promessa
Custo~$0.10/vídeo
Tempo~2 min RVM + ffmpeg
StackRVM + ffmpeg + FLUX bg
Identidade100% Pedro real
Motion100% original
Áudio100% original

Mudança de premissa: as Rodadas 1-7 todas pediram pro modelo gerar um Pedro novo (avatar, motion transfer, etc). Mesmo no teto comercial (HeyGen Digital Twin), o output sempre virou "avatar AI falando", nunca "Pedro casual virou pro". Esta rodada inverte: a gente não toca no Pedro — só troca o fundo. Stack: arielreplicate/robust_video_matting extrai foreground com green-screen alpha (~120s), depois ffmpeg compõe sobre o estúdio FLUX 1.1 Pro com chromakey + despill + grading cinematográfico (contrast, saturation, gamma). Áudio do Pedro 100% preservado, motion 100% preservado, identidade 100% preservada. o sofá vira estúdio.

A) Vertical nativa 576×1024

Resolução do source preservada. Pedro com presença real, fundo blur natural, sem artefato de upscale. Áudio + motion + identidade 100% originais. Versão mais honesta.

B) Vertical 1080×1920 (Reels-ready)

Upscaled pra resolução de Reels/Shorts. Mais corpo do estúdio visível. Mão do Pedro pixela um pouco no upscale 1.875×, mas formato nativo de social.

C) Horizontal 1280×720 (letterbox)

Source vertical centralizado em canvas horizontal. Reflexo lateral do bg fica estranho. Útil só pra benchmark com os outros formatos das rodadas anteriores.

✓ O que essa abordagem destrava

  • Pedro 100% real — identidade exata, sem "avatar AI"
  • Motion 100% real — gestos, micromovimentos, expressões originais
  • Áudio 100% real — voz, entonação, respiração originais
  • Custo $0.10/vídeo (vs $0.07/min recorrente do HeyGen)
  • ~2 min de processamento (vs treinar avatar)
  • Funciona com vídeo de qualquer duração (testado em 77s)
  • Casa exatamente com a tese Janusly: "casual virou pro"

✗ Limitações honestas

  • Iluminação do Pedro continua a do sofá — não casa 100% com o estúdio
  • Cabelo / bordas finas têm ringing leve do chromakey
  • Legendas queimadas no source vão junto (não tira)
  • Source vertical do celular limita output a vertical
  • Não cria um Pedro "diferente" — mantém o que tem

Veredito: esse é o caminho. As 7 rodadas anteriores provaram que gerar um Pedro pro é tecnicamente possível mas semanticamente errado pro Janusly — sempre vira talking head genérico. Trocar só o fundo respeita a tese central da marca: a sua face real, a sua voz real, os seus movimentos reais, em ambiente que parece estúdio. Próximas iterações: relight via ComfyUI/IC-Light pra casar iluminação do Pedro com o estúdio (ataca a primeira fraqueza da lista), bgs alternativos (escritório, café cool, cenário corporativo), e talvez um leve lipsync correction caso o áudio for trocado depois.

Rodada 7 — HeyGen Digital Twin — avatar treinado a partir do vídeo de 77s do Pedro

★ Vídeo-treinado, não foto
Custo~$0.07/min
Treino~10 min (77s vídeo)
Enginedigital_twin + avatar_iv
Vozclone auto-gerado + áudio real
Cenárioestúdio FLUX 1.1 Pro
FramingcloseUp + matting

Salto de tier: a Rodada 6 já estava no teto do Photo Avatar (avatar gerado a partir de UMA foto). Mas o HeyGen tem um tier acima — Digital Twin, que treina o avatar a partir de um vídeo real do usuário. Mandamos o vídeo de 77s do Pedro pra POST /v3/avatars com type=digital_twin — aceito sem briga (o mínimo declarado de 2min é orientação, não bloqueio). Em ~10 min o HeyGen entregou: 1 look digital_twin (motion aprendido do vídeo) + 3 looks photo_avatar com engine avatar_iv (best-frame selection) + voice clone auto-gerado da fala do Pedro. Geramos três comparativos abaixo.

A) Avatar IV (photo_avatar best-frame) + voice clone TTS

Engine avatar_iv sobre look auto-selecionado (terracotta), voice clone Pedro lendo script, estúdio FLUX, 17.7s 1280×720

B) Digital Twin (vídeo-treinado) + voice clone TTS — caso escalável

Avatar treinado do vídeo do Pedro + voice clone TTS lendo script, estúdio FLUX, 18.6s 1280×720

C) Digital Twin + áudio real do Pedro — caso autêntico

Avatar treinado do vídeo + áudio real do Pedro (77s do casual original), estúdio FLUX, 1280×720

✓ O que esse tier destrava

  • Avatar treinado a partir de vídeo real (não foto única)
  • Voice clone auto-gerado, sem upload separado
  • 3 looks bonus + 1 digital_twin de uma única chamada
  • Mínimo prático bem abaixo dos 2min declarados — 77s passou
  • Caso autêntico (vídeo C) usa a fala original do Pedro inteira

✗ Limites que persistem

  • Mesmo o digital_twin gera gestos próprios, não copia os do vídeo source
  • Não é motion transfer — é avatar trained falando, não Pedro do sofá virou pro
  • Custo recorrente por minuto continua
  • Pra motion-real verdadeiro o caminho ainda é Wan + face swap ou Hedra

Veredito: esta é a melhor versão do HeyGen sobre nosso input — vídeo-treinado + voz real + áudio original. Confirma que mesmo no tier máximo o HeyGen entrega avatar do Pedro falando profissional, não Pedro casual virou profissional. A diferença é semântica mas crítica pro Janusly. Comparação direta entre B e C ajuda a separar o efeito do TTS vs áudio real; comparação entre A e B mostra se o digital_twin entrega motion diferente do photo_avatar IV. Os três vídeos juntos esgotam o que o HeyGen tem a oferecer — daqui pra frente, motion transfer real só fora desse stack.

Rodada 6 — HeyGen Ceiling Test — áudio real do Pedro + estúdio FLUX + closeUp

★ Teto comercial real
Custo~$0.07/min + $0.05 bg
Geração~2 min
Duração77s (áudio inteiro)
Vozáudio real do Pedro
Cenárioestúdio FLUX 1.1 Pro
FramingcloseUp + matting

Por que repetir o HeyGen: a Rodada 5 ficou aquém do que o HeyGen entrega no marketing — figura olhando pro nada, mexendo pouco, falando texto qualquer. Diagnóstico: usamos o tier mais básico (Photo Avatar TTS + fundo cinza chapado + framing "normal"). Esta rodada explora o teto real do produto: áudio real do Pedro extraído do vídeo casual (ffmpeg -vn -ar 22050 -ac 1 -b:a 64k), background de podcast estúdio gerado via FLUX 1.1 Pro (LED panels, bokeh quente, foam acústico), framing closeUp com matting ligado.

HeyGen Avatar V + áudio real Pedro (77s) + estúdio FLUX + closeUp, 1280×720

✓ O que mudou pra melhor

  • Voz real do Pedro (não TTS) — autenticidade volta
  • Cenário de estúdio coerente com a promessa do Janusly
  • closeUp + matting dão presença cinematográfica
  • Lipsync nativo do HeyGen agora atua sobre fala REAL
  • Duração casa com o áudio (77s, não mais 8s artificial)

✗ O que continua quebrado

  • Movimentos ainda são gerados pelo HeyGen (não os do Pedro original)
  • Não é "motion transfer" — é lipsync sobre avatar com gestual genérico
  • Continua quebrando a tese de "sua gravação real virou profissional"
  • Custo recorrente por minuto, não one-shot

Veredito: este é o teto real do HeyGen sobre nosso input — bem acima da Rodada 5. Mostra que a primeira rodada estava subaproveitando o produto, não que o produto não entrega. Mas mesmo no teto, o HeyGen entrega avatar AI com voz real, não vídeo do Pedro virou profissional. Mantém a conclusão da Rodada 5: ótimo benchmark de teto comercial, ruim como pipeline Janusly. Próximos testes precisam atacar motion transfer + identidade junto (Wan + Magic Hour Face Swap, Hedra Character-3, etc).

Rodada 5 — HeyGen Avatar V (Photo Avatar treinado) — teste com pack multi-frame

★ Estado-da-arte comercial
Custo~$0.07/min
Treino~12 min (one-time)
Geração~1-2 min
IdentidadeFace Sim. 0.840
ÁudioTTS HeyGen (PT-BR)
MétodoAPI direta

Hipótese desta rodada: resultados anteriores (Wan Animation/Replace + GFPGAN) ainda não chegaram numa "visão real possível da pessoa em outro ambiente". Estratégia: usar pack multi-frame do Pedro (10 prints extraídos do vídeo casual em timestamps variados) e treinar um Photo Avatar dedicado no HeyGen. HeyGen Avatar V tem o melhor Face Similarity de mercado em 2026 (0.840 vs Veo 3.1 = 0.714).

Pipeline: 10 frames Pedro → Upload Asset (HeyGen) → Create Photo Avatar Group → Add Looks (3 lotes de 4) → Train (12 min) → Generate Video com voz "Pedro Lima - Friendly" (PT-BR) → output 720p.

HeyGen Avatar V — 10 frames Pedro, voz Pedro Lima TTS, 8.8s, 1280x720

✓ Pontos fortes

  • Face Similarity líder do mercado (0.840)
  • Treino aproveita variação do pack (10 ângulos/expressões)
  • Lipsync nativo, sem pós-processo
  • API estável, billing claro ($5 mín. PAYG)
  • 1 treino → infinitas gerações com mesmo avatar

✗ Pontos fracos

  • Voz é TTS, não a voz real do Pedro
  • Movimentos são gerados pelo HeyGen, não os do Pedro original
  • Não é "motion transfer" — perde a autenticidade de "você gravou casual"
  • Custo recorrente por minuto, não one-shot como Replicate

Veredito: HeyGen Avatar V resolve identidade visual perfeitamente, mas quebra a tese fundadora do Janusly: deixa de ser "sua gravação real virou profissional" e vira "avatar AI fala um script". É o melhor produto comercial pra avatar talking head, mas não é o produto que estamos construindo. Útil como benchmark de teto, não como pipeline de produção.

Rodada 4 — Pedro real (sem FLUX) + GFPGAN restore — teste de identidade

★ Identidade preservada

Hipótese testada: a perda de feição nos outputs Wan vinha da etapa FLUX Kontext (que reconstrói a foto de headshot, perdendo traços do rosto original). Refeitos os dois testes Wan usando uma foto real do Pedro (crop do pedro-foto-3.jpg, sem FLUX no meio). Em seguida, aplicamos GFPGAN v1.4 frame-a-frame (paralelo, 8 threads via Replicate) pra restaurar nitidez facial sobre os dois outputs.

Animation (foto real Pedro + driving video)

A1 — Wan Animation (foto Pedro real)

Sem FLUX. Headshot direto do Pedro alimentando o Animation. Áudio do source merged.

A2 — Animation + GFPGAN restore

Mesmo vídeo de A1 com GFPGAN aplicado em todos os 265 frames (137s, ~$0.27). Áudio remuxado.

Replace (sobre Luma Ray3, foto real Pedro)

B1 — Wan Replace (foto Pedro real)

Substitui o personagem do vídeo Luma pela foto real do Pedro. Sem áudio (Luma source não tem).

B2 — Replace + GFPGAN restore

Mesmo vídeo de B1 com GFPGAN nos 335 frames (170s, ~$0.34).

✓ O que ficou melhor

  • Identidade do Pedro preservada (sem FLUX reconstruindo o rosto)
  • GFPGAN restaura definição de olhos, contorno, textura de pele
  • Custo extra do restore: ~$0.30 por vídeo (paralelo 8x via Replicate)
  • Pipeline simples de plugar em qualquer output Wan

✗ Trade-offs

  • GFPGAN pode "uniformizar" demais (flatness em rostos imperfeitos)
  • +2-3 min adicionais de processamento
  • Alguma cintilância entre frames (cada frame é independente)
  • Replace continua sem áudio do source Luma

Veredito desta rodada: comparar A1 vs A2 e B1 vs B2 lado a lado pra decidir se GFPGAN entra na pipeline default. A escolha entre Animation e Replace já estava clara — Animation ganha pelo áudio nativo. A pergunta agora é: GFPGAN melhora identidade o suficiente pra justificar +$0.30 e +3min? Ou Wan + foto real já é suficiente?

LatentSync 1.6 (ByteDance) — pós-processo de lipsync

★ Pós-processo
Custo~$0.05
Tempo~1-2 min
Funçãolipsync
Áudioaplica áudio externo
MétodoAPI (Replicate)

Como funciona: recebe vídeo + áudio e re-sincroniza a boca do vídeo pra bater exatamente com o áudio fornecido. Usado como pós-processo sobre o melhor output do Wan 2.2 Animate (a versão Animation, que já tem áudio do Pedro), para corrigir qualquer dessincronia labial residual.

Pipeline final candidata: Foto Pedro → FLUX Kontext (headshot pro) → Wan 2.2 Animate Animation (cenário + movimentos + áudio merged) → LatentSync (lipsync corrigido). Custo total estimado: ~$0.30-0.60 por vídeo. Tudo via Replicate, escalável.

✓ Pontos fortes

  • Resolve o "boca dessincronizada" residual
  • Custo praticamente irrelevante ($0.05)
  • Aplica áudio real do Pedro com lipsync correto
  • Pode ser plugado em qualquer pipeline

✗ Pontos fracos

  • Só corrige boca, não o resto da identidade
  • Pode introduzir leve borrão na região oral
  • Precisa do áudio extraído antes (ffmpeg)

Wan 2.2 Animate (ByteDance/Alibaba) — Apache 2.0, open-source

★ Novidade — 2 modos testados
Custo~$0.20-0.50
Tempo5-10 min
Max duraçãodepende do source
Áudiomerge nativo (Animation)
MétodoAPI (Replicate)

Como funciona: Wan 2.2 Animate tem 2 modos. Animation anima uma foto-alvo (Pedro headshot pro) seguindo os movimentos faciais e corporais de um vídeo source — equivalente teórico ao Act-Two do Runway, mas open-source via Replicate. Replace faz o oposto: substitui o personagem dentro de um vídeo existente (no nosso caso, o resultado Luma Ray3) pelo personagem da foto-alvo, usando segmentação SAM2 internamente.

A — Animation (foto + driving video)

Input: headshot profissional do Pedro + pedro-video-9s-exact.mp4 como driving. Output: 9s, com áudio do source mergeado nativamente (merge_audio=true). Identidade tem que vir 100% da foto e movimentos do vídeo casual.

B — Replace (sobre Luma Ray3)

Input: luma-ray3-result.mp4 (cenário e movimento ótimos, mas com a feição alterada) + headshot Pedro. Output: 11s, sem áudio (Luma source não tem). Tenta resolver o problema "Luma mudou o rosto" colando o Pedro real sobre o vídeo Luma.

✓ Pontos fortes

  • Open-source (Apache 2.0) — pode self-hostar no futuro
  • Animation merge áudio do source nativamente
  • Replace usa SAM2 para segmentação precisa
  • Sem content filter restritivo
  • Custo competitivo ($0.20-0.50)

✗ Pontos fracos

  • Tempo de processamento maior (~10 min Animation)
  • Replace não tem áudio se o source não tem
  • Qualidade depende muito da iluminação da foto-alvo
  • Lipsync no Animation pode ficar levemente off

Runway Act-Two — Performance Capture

⚠ Bloqueado server-side
Custo previsto~1.80 créditos/s
TempoN/A
Max duração30s
Áudiovia voice tab (não testado)
MétodoWeb (Playwright)
3 tentativas falharam com "There was an issue on our end"

O Runway estornou os créditos automaticamente. Mensagem da própria plataforma: "Any used credits have been refunded. If you get this error more than once, try different inputs." Pedro foto (9:16) + Pedro driving video (9s, 9:16) — combinação dentro dos limites documentados, mas a infraestrutura do Act-Two recusou as 3 tentativas em sequência. Não conseguimos avaliar o resultado nesta rodada.

O que era esperado: Act-Two é a feature do Runway desenhada exatamente pro caso Janusly — "performance capture": pega 1 vídeo de driving performance + 1 imagem/vídeo de character e anima o character com os movimentos faciais e gestos do driving. Em teoria, é o que o Janusly precisa: identidade da foto + movimentos do vídeo casual.

✓ Pontos fortes (no papel)

  • Feature dedicada a "performance capture"
  • Suporta até 30s
  • Tab "Voices" promete áudio também
  • Slider de "facial expressiveness" + toggle de gestures

✗ Pontos fracos / bloqueios

  • 3 falhas server-side em sequência nesta sessão
  • Sem API pública pro Act-Two — só web
  • Difícil escalar pro produto sem API
  • Avaliação adiada — repetir em outro momento

Google Veo 3 Fast — image + audio nativo

✓ Testado
Custo~$0.40 (8s)
Tempo~4 min
Max duração8s
Áudiosim (nativo, gerado)
MétodoAPI (Replicate)

Observação: única plataforma do benchmark com áudio gerado nativamente (no caso, voz/ambiente sintetizados — não a voz real do Pedro). Veo 3 é image-to-video, então a entrada foi a foto do Pedro + prompt do estúdio. Primeira tentativa foi rejeitada pelo content filter (E005, alegação "sensitive content"); a 2ª passou usando google/veo-3-fast e prompt sem termos de "preservação de identidade".

✓ Pontos fortes

  • Áudio gerado nativamente (único do benchmark)
  • Cenário gerado do zero junto com a pessoa
  • API via Replicate, simples

✗ Pontos fracos

  • Voz gerada não é a do Pedro — não preserva sua fala real
  • Content filter rejeita prompts com "preservar identidade"
  • Limite de 8s
  • Não recebe o vídeo original — só foto, perde os movimentos do Pedro

Runway Gen-4 Aleph — Edit Video

✓ Testado
Custo75 créditos (~$0.75)
Tempo~3 min
Max duração5s (truncado)
Áudionão
MétodoWeb + API

Observação: "Edit Video" é literalmente posicionada como "Swap backgrounds, lighting, angles - all without reshooting" — descrição idêntica ao caso Janusly. Truncou pra 5s. SDK Runway é maduro.

✓ Pontos fortes

  • Posicionamento idêntico ao Janusly
  • Geração rápida (~3min)
  • SDK e API maduros

✗ Pontos fracos

  • Limite de 5s na config padrão
  • Sem áudio nativo
  • Truncou o vídeo original

Luma Ray3 — Modify + pós-processos

✓ 3 variantes testadas
Custo base~$0.50-1.00
+ Magic Hour+~$0.20
Tempo total~12 min
Duração saída9s (com cortes)
MétodoWeb/API + ffmpeg + Magic Hour API

A — Luma puro

Limitações observadas pelo Diego: qualidade visual ótima, mas sem áudio e a feição do Pedro mudou bastante.

B — Luma + áudio (ffmpeg)

Pós-processo: ffmpeg pega o áudio original do Pedro e cola sobre o vídeo Luma cortado pra 9s. Resolve o "sem som". Sincronia labial depende de quanto o Luma alterou a boca.

C — Luma + áudio + Magic Hour

Pós-processo: Magic Hour API (/v1/face-swap) cola o rosto do Pedro sobre o vídeo Luma+áudio. Tentativa de resolver simultaneamente identidade + áudio.

✓ Pontos fortes

  • Pipeline 100% via API (Luma + Magic Hour + ffmpeg)
  • Resolve identidade (face swap) e áudio (merge) que o Luma puro não cobre
  • Custo total ainda dentro do orçamento (~$0.70-1.20 por vídeo)
  • Qualidade do cenário Luma é a melhor do benchmark

✗ Pontos fracos

  • 3 etapas independentes pra coordenar
  • Face swap pode introduzir artefatos próprios
  • Sincronia labial não é garantida (Luma muda boca)
  • Tempo total maior (12 min)

Kling 2.6 Motion Control — baseline atual

✓ Testado (baseline)
Custo$0.30
Tempo~6 min
Max duração10s
Áudionão
MétodoAPI (Replicate)

Como funciona: recebe foto-alvo + vídeo source → transfere movimentos e fala do source pra figura da foto. Não é "swap de fundo" puro, é motion transfer com pessoa-alvo já em ambiente novo (a foto define o cenário).

✓ Pontos fortes

  • Custo imbatível ($0.30)
  • API estável e bem documentada
  • Pipeline atual já validado com Diego

✗ Pontos fracos

  • Limite de 10s
  • Cenário precisa vir pronto na foto
  • Sem áudio nativo

📊 Resumo & Recomendação

O que mudou desde a rodada 2: entraram Wan 2.2 Animate (2 modos) e LatentSync. Wan 2.2 Animate é a primeira opção do benchmark que faz performance capture real via API — equivalente conceitual ao Act-Two do Runway, mas open-source e escalável. LatentSync entra como pós-processo de lipsync, prometendo corrigir o último ponto fraco que sobrava (boca dessincronizada quando a IA altera a fala).

Caminho técnico mais promissor agora: pipeline Foto Pedro → FLUX Kontext (headshot pro) → Wan 2.2 Animate Animation (cenário + movimentos + áudio do Pedro merged) → LatentSync (lipsync corrigido). Cobre os 4 requisitos: identidade visual, voz real, movimentos preservados e cenário profissional. Custo total ~$0.30-0.60/vídeo, ~10 min total.

Caminhos alternativos: Luma Ray3 + ffmpeg + Magic Hour continua viável se Wan Animation deixar resíduos visuais. Kling 2.6 Motion Control fica como baseline mais barato e estável.

🎯 Recomendação técnica (a confirmar com inspeção visual)

1ª opção pro MVP: FLUX Kontext + Wan 2.2 Animate Animation + LatentSync. Tudo open-source via Replicate, escalável, ~$0.40/vídeo, áudio real preservado, identidade da foto-alvo.

2ª opção / fallback: Luma Ray3 + ffmpeg + Magic Hour face swap. Cenário Luma é o melhor visualmente, ~$1/vídeo.

3ª opção / barato: Kling 2.6 Motion Control. Motion transfer puro, $0.30/vídeo, sem cenário gerado nem áudio nativo.

Investigar mais: Wan Replace (substituir Pedro dentro do Luma Ray3) pode ser combo interessante — cenário de vídeo Luma + identidade Pedro real + áudio merged via ffmpeg.

Descartar: Veo 3 (voz sintética). Runway Act-Two segue inviável sem API pública.

⚠️ Decisão pendente: compare lado a lado Wan Animation, Wan Replace, LatentSync e a melhor variante Luma. Critérios: (a) a feição realmente parece o Pedro? (b) a sincronia labial bate com o áudio? (c) o cenário é convincente? (d) tem artefato perceptível? A pipeline Wan Animation + LatentSync é a candidata mais limpa em arquitetura — todas peças open-source via Replicate.

📋 Visão Geral do benchmark

Objetivo: Identificar a melhor pipeline pra transformar vídeo casual em "estúdio profissional" preservando rosto, identidade, voz e movimentos do Pedro.

Mesmo input em todas: pedro-video-9s-exact.mp4 (9s) + prompt descrevendo um podcast studio profissional. Preservar 100% identidade.

Histórico de mudanças: Pika removido (sem API pública). Luma ganhou variantes com áudio recomposto e face swap pós-processo. Adicionados Veo 3 (Google) e Runway Act-Two. Rodada 7 trouxe HeyGen Digital Twin treinado a partir do vídeo do Pedro. Rodada 8 isolou Background Replacement preservando 100% o sujeito. Rodada 9 testou o Diego no HeyGen com vídeo Neuralink + chroma green. Rodada 10 quebrou o cap dos 10s do Kling com stitching de 8 segmentos paralelos. Rodada 11 colocou HeyGen DT e Janusly stack lado a lado com o mesmo Pedro em 2 cenários. Rodada 12 fechou a promessa Janusly (Wan 2.2 Animate troca roupa + local mantendo voz/movimentos do source). Rodada 13 montou o B-roll editor em Remotion (Reels Neuralink 9:16 com IVC v2 do ElevenLabs + lipsync Replicate + trilha lo-fi). Rodada 14 levou o Wan pra cenário custom NYC com referência meio-corpo do OpenAI (v1 gpt-image-1, v2 gpt-image-2 ★ — realismo nitidamente superior). Rodada 15 testou 2 alternativas de custo (HeyGen API direta ✗, Kling lipsync ✗) e refatorou o editor pra BRollComposition<Theme> — próximo Reels é só plugar dado. Rodada 16 fechou o conceito Janusly original ponta-a-ponta: extrai 1 frame de vídeo casual → OpenAI gpt-image-1 reimagina em studio profissional preservando identidade → Wan 2.2 Animate transfere movimentos+voz pro novo ambiente. $0.46/video, 14min total.

🎥 Vídeo Original (input)

pedro-video-9s-exact.mp4

9 segundos · Pedro falando em ambiente casual

🖼️ Foto Pedro (face swap)

pedro-foto-3.jpg

Foto usada nos jobs com identidade-alvo (Magic Hour face swap, Veo 3 image-to-video, Kling motion control).

📝 Prompt usado

"Replace background with a professional podcast studio: warm ambient lighting, modern microphone setup on a desk, acoustic foam panels in the background, cinematic depth of field, high quality. Keep the person's face, identity, body, hair and movements 100% identical."