Mimic — Arquitetura técnica
Arquitetura — Mimic
Fluxo end-to-end
[user busca produto]
→ scrape TikTok → lista vídeos
[user seleciona vídeo + avatar]
→ download vídeo (yt-dlp)
→ separa voz/música (Demucs)
→ transcreve (Whisper Large v3) com timestamps
→ extrai pose/motion (DWPose / MediaPipe)
→ segmenta pessoa (SAM 2)
→ clona voz (F5-TTS) lendo transcrição
→ gera vídeo: avatar + motion (MimicMotion/AnimateAnyone)
→ lip-sync refinement (LatentSync)
→ composita BG original ou novo
→ upscale + interp (RealESRGAN + RIFE)
→ mix áudio (voz clonada + música original)
→ entrega
Componentes por etapa
1. Busca TikTok
- yt-dlp + TikTok-Api (unofficial) ou Apify
- Cache Redis (TTL 1h) por query
- Fallback: user cola URL direto
2. Áudio
- Demucs v4: separa vocal/instrumental
- WhisperX: transcrição + timestamps por palavra
- F5-TTS: clone zero-shot (PT-BR ok), embedding pré-treinado por user
3. Motion
- DWPose: skeleton 2D + face landmarks
- SAM 2: segmentação pessoa do BG
- Salva sequência poses por frame em JSON
4. Geração vídeo
Opção A (MVP): MimicMotion ou AnimateAnyone — pose-guided, identity preserved
Opção B (V2): Wan 2.2 I2V + LoRA do avatar + ControlNet pose
5. Lip-sync
- LatentSync (ByteDance) — SOTA atual
- Fallback: MuseTalk (mais rápido, menor qualidade)
6. Background
- Mantém BG original: composita avatar segmentado via alpha blend
- Opcional: gera BG novo via SDXL/Flux
7. Pós
- Upscale: RealESRGAN + CodeFormer (rosto)
- Frame interp: RIFE 30→60fps
- Color match avatar ↔ BG
Arquitetura sistema
Frontend Next.js 16 (App Router, Cache Components)
↓
API Elysia (Bun) + Better-Auth + Stripe
↓
Redis + BullMQ (filas: scrape | audio | video | postproc)
↓
Worker pool (containers Docker)
- scrape: CPU
- audio: L4
- video: H100 / A100
- postproc: RTX 4090
↓
Storage: Cloudflare R2 (sem egress) ou MinIO self-host
DB: Postgres + Drizzle
Schema DB (rascunho)
users (id, email, plan, credits_balance)
avatars (id, user_id, name, lora_path, status)
voices (id, user_id, name, embedding_path, ref_audio_path)
jobs (id, user_id, tiktok_url, avatar_id, voice_id,
status, progress, steps_log, output_url, cost_credits)
job_steps (id, job_id, name, status, started_at, finished_at, gpu_type)
Treinamento avatar (1x por user)
- 20-50 fotos user → SDXL/Flux LoRA training (~20min A100)
- Salva
/avatars/{uid}/lora.safetensors(~200MB) - Custo treino: ~$1
Treinamento voz (1x por user)
- 30s áudio user → F5-TTS reference embedding (~10s)
- Salva
/voices/{uid}/ref.wav+ embedding - Custo: ~$0.01
GPU infra
- RunPod Serverless: autoscale, paga uso
- Cold start: 30-60s — mantém 1 worker quente em pico
- Alternativa custo fixo: VPS Hetzner GEX44 (~€180/mês RTX4000)
Observabilidade
- PostHog (analytics produto)
- Sentry (erros)
- Grafana + Loki (workers GPU, métricas custo/job)