E1 · Motor testado
5 minRode o bloco "testes do explicavideos".
Pronto quando: A saída mostra 2.13.10, saída: 0, Ran 50 tests e OK.
Aula 2 · 18 min
O explicavideos transforma um roteiro em vídeo explicativo com avatar, voz, cenas animadas e legenda. A parte cara é uma só: o estúdio de avatar. Nesta aula você roda os testes do motor e monta cenas, blocos e moldes de um roteiro seu, parando antes do estúdio.
Começar a aula
Objetivo: rodar os testes do explicavideos e montar cenas e blocos de um roteiro seu sem gerar nada no estúdio de avatar.
Clique em cada etapa. Só a do meio gasta crédito.
Etapas do motor v1, lidas no README e no código do explicavideos 2.13.10 (commit 604fc74). O prepare é a primeira etapa dos dois motores, v1 e v2. HyperFrames por dentro é assunto do curso 3.
Clona, mostra a versão, lê o --help e roda os testes. Os testes simulam a rede e trocam o render por um comando que falha se for chamado: nada sai da sua máquina.
E=${TMPDIR:-/tmp}/ensaio-fabrica/a2; rm -rf "$E"; mkdir -p "$E"; cd "$E"
git clone -q https://github.com/inematds/explicavideos.git && cd explicavideos
git checkout -q 604fc74 && cat VERSION
python3 explica.py --help | grep -E "^ (prepare|preview)"
python3 -m unittest discover -s tests > testes.log 2>&1; echo "saída: $?"
grep -E "^(Ran|OK)" testes.log | sed 's/ in .*s$//'2.13.10 prepare monta cenas, blocos (<= 4.400 caracteres) e templates. Não gera nada no HeyGen. preview renderiza o bloco 1 localmente, sem avatar, para conferir o layout. saída: 0 Ran 50 tests OK
O bloco tira o tempo da linha Ran 50 tests (muda a cada execução). Repare no texto do preview: ele diz que renderiza, mas veja a próxima aba.
No commit 604fc74, preview chama build_final_block.py pt 1 --preview, que só grava o HTML do bloco 1 em layout-preview/, com tempos fictícios e o aviso "PRÉVIA VISUAL · SEM NARRAÇÃO" no lugar do avatar. Não sai MP4. Quando o texto de ajuda e o código divergem, vale o código.
Quatro cenas de exemplo e uma config que aponta para elas. O limite baixo (300 caracteres) é de propósito, para ver o empacotamento.
[
{"title": "Por que conferir antes de gerar", "chapter": "ABERTURA", "kind": "steps", "speech": "Gerar avatar custa crédito e tempo. Por isso o motor monta tudo antes: cenas, blocos e moldes. Só depois de conferir é que alguma coisa vai para o estúdio.", "labels": ["Cenas", "Blocos", "Moldes"], "takeaway": "Conferir é de graça. Gerar não é.", "source": "README do explicavideos"},
{"title": "O roteiro vira cenas", "chapter": "ETAPA 1", "kind": "steps", "speech": "Cada cena tem título, capítulo, fala e até três rótulos. A fala é o que o avatar diz; os rótulos são o que aparece na tela.", "labels": ["Título", "Fala", "Rótulos"], "takeaway": "Fala para ouvir, rótulo para ver.", "source": "engine/prepare.py"},
{"title": "As cenas viram blocos", "chapter": "ETAPA 2", "kind": "steps", "speech": "O estúdio aceita um texto de tamanho limitado por vídeo. O motor junta cenas inteiras em blocos até o limite, sem cortar nenhuma fala no meio.", "labels": ["Limite por bloco", "Cena inteira", "Sem corte"], "takeaway": "Bloco é um vídeo de avatar.", "source": "engine/prepare.py"},
{"title": "O que vem depois", "chapter": "ETAPA 3", "kind": "steps", "speech": "Com os blocos prontos, a pessoa dona do avatar aprova e só então o estúdio gera. Depois vêm transcrição, cenas animadas, render e montagem.", "labels": ["Aprovação", "Estúdio", "Render"], "takeaway": "Aprovação humana antes do crédito.", "source": "README do explicavideos"}
]K=~/projetos/formacao-cinema-ia-fabrica-v72/kit
E=${TMPDIR:-/tmp}/ensaio-fabrica/a2; cd "$E/explicavideos"
cat > "$E/ensaio.json" <<FIM
{"id": "ensaio", "title": "Ensaio", "source_repo": "$E", "output": "$E/saida",
"languages": ["pt"], "scene_files": {"pt": "$K/exemplos/a2-explica/cenas-pt.json"},
"max_chars": 300}
FIM
python3 explica.py --config "$E/ensaio.json" prepare; echo "saída: $?"
ls "$E/saida/blocos" "$E/saida/templates/pt"
python3 explica.py --config "$E/ensaio.json" status | head -3{"blocks": 2, "scenes": 4, "topics": 0, "chars": 561}
saída: 0
/tmp/ensaio-fabrica/a2/saida/blocos:
manifest.json
pt-b01.txt
pt-b02.txt
/tmp/ensaio-fabrica/a2/saida/templates/pt:
scene-01.html
scene-02.html
scene-03.html
scene-04.html
{
"submitted": {
"prepared": 2Duas cenas por bloco (155 + 123 caracteres cabem em 300; a terceira não). O status mostra os dois blocos como prepared: nada foi enviado ao estúdio. Os moldes scene-NN.html já têm data-duration calculado pela fala.
O motor recusa cortar uma fala. Com o limite em 140, a primeira cena (155 caracteres) já estoura.
E=${TMPDIR:-/tmp}/ensaio-fabrica/a2; cd "$E/explicavideos"
sed 's/"max_chars": 300/"max_chars": 140/' "$E/ensaio.json" > "$E/curto.json"
sed -i 's#"output": "[^"]*"#"output": "'"$E"'/saida-curta"#' "$E/curto.json"
python3 explica.py --config "$E/curto.json" prepare 2>&1 | grep -E "^ValueError"; echo "saída: ${PIPESTATUS[0]}"ValueError: Scene 1 exceeds limit; split its narration before submitting saída: 1
A correção é dividir a fala da cena em duas, não aumentar o limite: o limite real vem do estúdio.
Na produção real, o start sobe cinco serviços. Rode, interrompa e rode de novo.
Simulação no navegador: nada roda de verdade. Os cinco nomes são os serviços do start no explicavideos 2.13.10 (submit, monitor, render, assemble, publish).
Três coisas para conferir antes de qualquer start.
O --help do motor exige um arquivo APROVADO_HEYGEN no output, com a autorização do dono do avatar e o número de blocos e minutos. É uma regra escrita, não um bloqueio no código: o seu portão (aula 7) é o que fecha de verdade.
O motor foi feito para o avatar e a voz do Nei, com o consentimento dele. No seu uso, o avatar é seu, com termo assinado. Avatar de outra pessoa sem termo, não.
Perfis são do v2: sem profile_visual, sai o perfil aula; com "profile_visual": "viral", o perfil viral (cortes mais rápidos), conferido por engine/v2/qa_viral.py, que imprime APROVADO, APROVADO COM AVISO ou REPROVADO.
O v2 não gera avatar de novo: parte de uma produção v1 pronta e refaz o visual de cada bloco com um roteiro visual por deixas faladas, o mesmo conceito que o validador do refazvideo confere na aula 4.
Comandos do README (só descritos aqui, porque precisam da fala transcrita do avatar): engine/v2/setup_output.py → engine/v2/build_block.py 1 --strict → engine/v2/run_lane.sh 1 2 3.
Um explicativo de 10 minutos feito pelo explicavideos v2, com avatar e voz do próprio Nei (com o consentimento dele), em três idiomas.
Do motor testado às cenas do seu próximo vídeo.
Rode o bloco "testes do explicavideos".
Pronto quando: A saída mostra 2.13.10, saída: 0, Ran 50 tests e OK.
Rode o bloco "prepare e status" com as quatro cenas do kit.
Pronto quando: {"blocks": 2, "scenes": 4, "topics": 0, "chars": 561}, saída: 0 e o status com "prepared": 2.
Peça ao seu agente as cenas de um explicativo seu (5 a 8 cenas, cada fala com até 600 caracteres) no mesmo formato de cenas-pt.json. Grave em ${TMPDIR:-/tmp}/ensaio-fabrica/a2/minhas-cenas.json, troque o scene_files da config e rode o prepare com max_chars 4400.
Pronto quando: cd ${TMPDIR:-/tmp}/ensaio-fabrica/a2/explicavideos && python3 explica.py --config ../ensaio.json prepare; echo "saída: $?" → uma linha {"blocks": …, "scenes": N, …} com o N das suas cenas e saída: 0.
A explicação aparece depois da sua resposta.
Pergunta 1 de 4
Qual comando do explicavideos gasta crédito?
Pergunta 2 de 4
Uma cena tem 5.000 caracteres de fala e o limite é 4.400. O que fazer?
Pergunta 3 de 4
O --help diz que preview renderiza; o código só grava um HTML. Em quem você confia?
Pergunta 4 de 4
Por que o manifesto importa quando o start é interrompido?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.