A fábrica de vídeo com agentes|INEMA.CLUB-PRO

Aula 2 · 18 min

Explicativo com avatar e voz: o explicavideos por dentro

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
Pequeno estúdio escuro com um banco vazio, um microfone no pedestal e um monitor de edição com a tela dividida em slide e apresentador.

Nesta aula você vai

  1. 1As etapas do motor, do roteiro ao vídeo montado
  2. 2O formato de cena: título, capítulo, fala, rótulos e frase para levar
  3. 3Por que as cenas viram blocos e o que o limite por bloco faz
  4. 4Onde está o portão do estúdio e o que o --help diz que o código não faz

Objetivo: rodar os testes do explicavideos e montar cenas e blocos de um roteiro seu sem gerar nada no estúdio de avatar.

01O caminho de um explicativo

Clique em cada etapa. Só a do meio gasta crédito.

Clique em cada bloco do diagrama para ver o que ele faz.

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.

02O motor num commit fixo

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.

Terminal · testes do explicavideos
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$//'
Exemplo do repositório
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.

03Um roteiro seu vira cenas e blocos

Quatro cenas de exemplo e uma config que aponta para elas. O limite baixo (300 caracteres) é de propósito, para ver o empacotamento.

Arquivo · kit/exemplos/a2-explica/cenas-pt.json
[
  {"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"}
]
Terminal · prepare e status
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
Exemplo do repositório
{"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": 2

Duas 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.

04Quando uma cena não cabe

O motor recusa cortar uma fala. Com o limite em 140, a primeira cena (155 caracteres) já estoura.

Terminal · limite estourado
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]}"
Exemplo do repositório
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.

05O start: cinco serviços que retomam de onde pararam

Na produção real, o start sobe cinco serviços. Rode, interrompa e rode de novo.

fila/

rodando/

pronto/

falhou/

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).

06O que fica antes do estúdio

Três coisas para conferir antes de qualquer start.

1. Aprovação

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.

07O que sai do motor

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.

IA Cultivada: um explicativo que saiu do explicavideos · 10 minPágina do vídeo com roteiro →

08Prática

Do motor testado às cenas do seu próximo vídeo.

E1 · Motor testado

5 min

Rode o bloco "testes do explicavideos".

Pronto quando: A saída mostra 2.13.10, saída: 0, Ran 50 tests e OK.

E2 · Cenas e blocos

5 min

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.

E3 · O seu roteiro

15 min

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.

09Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 4

Qual comando do explicavideos gasta crédito?

10Em três frases

Cenasfala para ouvir, rótulo para ver; o agente escreve, você revisa.
Blocoso prepare empacota cenas inteiras até o limite do estúdio, sem gastar nada.
Estúdioo único passo pago fica atrás do start, da aprovação e do seu termo.

Para ir além

Aula anteriorPróxima aula