viralvideogen (storylab)
o_problema
Produzir vídeo de storytelling emocional para TikTok com consistência de personagem e retenção é trabalho manual repetitivo e caro: cada erro de prompt é uma chamada paga desperdiçada, e personagem que muda de rosto entre cenas destrói o vídeo inteiro.
o_que_faz
- Video intelligence: detecção de cena, extração de keyframes, transcrição de áudio e análise visual, selecionando frames representativos em vez de mandar todo frame para um modelo.
- Story intelligence: estrutura narrativa, arquétipos de personagem, história original em vez de personagem renomeado com diálogo traduzido, e estratégia de retenção com open loops e escalada emocional.
- Character bible e visual bible fixando características imutáveis por personagem recorrente e a linguagem visual do ambiente.
- Separação deliberada entre prompt de imagem, que define o estado visual, e prompt de animação, que define o que muda no tempo. Essa separação é o que torna a consistência de personagem controlável.
- Publishing gate que mede o vídeo final, lê o ambiente atestado e recusa quando algo bloqueia. Nunca publica sozinho.
- Treze arquivos JSON Schema versionados, um por shape persistida, como contratos machine-readable.
stack
outros
Python 3.11+ · Typer · Pydantic 2 · OpenCV · faster-whisper · Anthropic SDK · pytest · GitHub Spec Kit
medido
- Specs em dois dias
- 14specs/, 38 commits de 16/08/2026 a 18/08/2026
- Contratos machine-readable
- 13schemas/, um JSON Schema por shape persistida
- Portão de lint
- 9.9 / 10limiar fail-under do pylint
como_foi_construido
Spec-driven, catorze specs em dois dias. A arquitetura tem uma regra clara: a camada de pipeline orquestra, um módulo por comando CLI seguindo ler-checar-escrever; os pacotes de domínio ao lado não tomam decisão de I/O; models é o único lugar onde uma shape persistida é declarada; e toda shape persistida tem contrato em schemas.
Não existe um comando `generate` que roda a cadeia inteira. Três estágios fazem chamada paga a modelo, e a decisão operacional é que histórias são escritas à mão no chat e entram por um passo de promoção, o caminho não pago.
O `record` não aceita resultado declarado como verdade. Um job de vídeo reportado como completo contra um arquivo local é decodificado antes de ser acreditado: arquivo que não é vídeo legível rebaixa o job para ausente, e arquivo que é tem sua duração medida gravada, substituindo a declarada. A razão está registrada: o primeiro render plan do próprio repositório gravou um job como completo contra um PNG, e um exists-check acreditou. O que não tem nada local para medir é gravado como reportado, porque inventar medição seria a mesma falha na direção oposta.
O `assemble` soma a duração medida, não a pedida. Um gap acima de um segundo vira warning, porque um provedor devolvendo clipes de cinco segundos para pedidos de oito passa por todo check do pipeline e produz um vídeo abaixo do mínimo.
Comandos determinísticos e sem LLM nunca modificam o arquivo de origem. Escrevem um arquivo novo ao lado. O armazenamento é separado por natureza: código, config, schemas, testes e manifestos leves no git; vídeo, imagem, frames, áudio e renders sincronizados fora dele.
limitacoes_conhecidas
- Não existe comando fim-a-fim, e isso é deliberado e não uma falta: três estágios custam dinheiro por chamada, então a cadeia é conduzida estágio a estágio.
- A publicação nunca é automática. O post final é manual, no telefone. O gate reporta pronto ou bloqueado, e um humano age sobre isso.
- Resultado remoto sem artefato local é gravado como reportado, não como medido. A distinção fica no dado em vez de ser suavizada.
- Sem deploy em lugar nenhum: é uma CLI local, rodada pelo autor.
tempo de código rastreado
104 hrs 37 mins Fonte: WakaTime · rastreado desde 2026-03-17 até agora