O que chalkreel — objetivo entra, vídeo explicativo acessível sai faz?
Você está produzindo um vídeo explicativo de aprendizagem. Diferente de explicadores otimizados para engajamento, um vídeo de aprendizagem parte de um objetivo mensurável, gerencia a carga cognitiva propositalmente (princípios multimídia de Mayer) e entrega artefatos de acessibilidade — legendas, transcrição, notas de áudio-descrição — como entregáveis de primeira classe, não como complementos. Cada afirmação factual na narração é rastreável até uma fonte.
Tudo o que o espectador ouve também deve ser visível ou legível. Tudo o que o aluno aprende deve ser rastreável. Nada é entregue sem um portão humano.
Regras rígidas
- Nenhum modelo generativo de vídeo. Nenhuma imagem de arquivo. Nenhum gerador de imagens para o conteúdo das cenas. Os quadros são desenhados em código (componentes Remotion, SVG, CSS). Isso mantém cada quadro revisável, diffável e reproduzível.
- Quatro portões humanos. Nunca prossiga além de um portão sem aprovação explícita registrada no log do projeto: PORTÃO 1 objetivo + mapa de batidas, PORTÃO 2 roteiro da narração, PORTÃO 3 estilo visual, PORTÃO 4 corte final.
- Rotule tudo que é sintético. Dados de exemplo construídos, temporizações simuladas e resultados de revisão por agente são rotulados como tal no próprio arquivo. Nunca apresente um artefato seco como uma saída real renderizada/TTS.
- Afirmações antes do roteiro. Notas de pesquisa com afirmações com fontes existem antes de a narração ser escrita, e nenhum número entra no roteiro sem uma linha no livro-razão.
- TTS local primeiro. A voz padrão é kokoro-82m (local, gratuita). TTS próprio é suportado; nunca chame um TTS em nuvem sem a chave configurada pelo usuário. Nenhum modelo local além do TTS que o usuário escolher.
Entradas
objective: uma frase mensurável (ABCD — o portão do objetivo impõe isso)
audience: quem está aprendendo e seu conhecimento prévio presumido
length: duração alvo (padrão 60–120 s)
language: idioma da narração (padrão en)
Rejeite tópicos. "Um vídeo sobre fotossíntese" não é uma entrada; execute scripts/objective-gate.mjs e itere com o usuário até que passe.
Pipeline
objective + audience + prior knowledge + length + language
|
+-- 1. PORTÃO DO OBJETIVO objective-gate.mjs; reescrever tópico -> objetivo ABCD;
| enquadramento visível ao aluno "você será capaz de...";
| mapa de batidas segmentado conforme segmentação de Mayer (batidas de 10-30 s)
| << PORTÃO 1: usuário aprova objetivo + mapa de batidas
+-- 2. PESQUISA extrair afirmações, encontrar fontes, escrever livro-razão de afirmações
| (ids estilo claim-001; fontes com título/veículo/ano;
| redação vaga preferida a estatísticas inventadas)
+-- 3. NARRAÇÃO roteiro por orçamento de segmento; passada de lint humanizador
| (scripts/lint-narration.mjs deve sair com 0);
| verificação de nível de leitura vs. público
| << PORTÃO 2: usuário aprova roteiro
+-- 4. COMPETIÇÃO DE ESTILO renderizar a MESMA batida em 2-3 variantes de fundo/tema
| com o template; usuário escolhe visualmente
| << PORTÃO 3: usuário escolhe um estilo
+-- 5. CONSTRUÇÃO um componente de segmento Remotion por batida (template/);
| TTS com timestamps por palavra (kokoro-82m padrão, BYO ok);
| construir JSON de temporização {segments[].words[{w,start,end}]}
+-- 6. ACESSIBILIDADE make-srt.mjs (SRT alinhado por palavra), make-transcript.mjs
| (HTML de transcrição), notas de áudio-descrição por
| segmento, então a11y-lint.mjs DEVE passar
+-- 7. CONTROLE DE QUALIDADE pontuar quadros renderizados + roteiro contra os
| critérios escritos abaixo; escrever qc-report.md com rótulos de método
| << PORTÃO 4: usuário revisa o corte final
+-- entregar: video.mp4 + .srt + transcript.html + instructor-notes.md
+ livro-razão de afirmações + trilha completa (objetivo, pesquisa, narração,
storyboard, temporização, relatório de QC)
Orçamentos de segmento
- 10–30 s por segmento (segmentação de Mayer; limite rígido de 30 s sem autorização do usuário).
- ~145 palavras por 60 s de narração; uma ideia por segmento.
- Texto na tela: apenas rótulos e frases curtas (2–7 palavras), nunca a narração lida literalmente (princípio de redundância).
- Cada segmento define: narração, um tipo de cena, texto na tela, nota de áudio-descrição, IDs de afirmações.
Padrões de TTS
- Padrão: kokoro-82m, local. Voz:
af_heart(ou escolha do usuário). Velocidade 1.0. - Capture timbres por palavra do TTS/alinhador no JSON de temporização. Se o TTS não puder emiti-los, alinhe com um alinhador forçado; nunca adivinhe temporizações — um alinhamento adivinhado faz as legendas se deslocarem, e a verificação de ida e volta detectará texto incompatível, mas não tempos desviados.
- BYO TTS: qualquer mecanismo que retorne timbres no nível da palavra; documente o mecanismo e a voz no log do projeto.
Scripts (todos autônomos, node >=18, sem dependências)
| Script | Propósito | Sair com 0 significa |
|---|---|---|
scripts/objective-gate.mjs "<objective>" | valida objetivo ABCD | o objetivo é mensurável |
scripts/lint-narration.mjs <script.txt> | verificador de sinais de escrita de IA (executar antes do TTS) | o roteiro soa humano o suficiente para gravar |
scripts/make-srt.mjs <timing.json> --out x.srt | SRT alinhado por palavra a partir do JSON de temporização | SRT escrito |
scripts/make-transcript.mjs --timing <timing.json> --storyboard <sb.json> --out t.html | página de transcrição acessível | HTML escrito |
scripts/a11y-lint.mjs <storyboard.json> | "nenhuma informação apenas em áudio" + verificações de entregáveis | toda afirmação da narração está na tela ou na transcrição/nas notas de AD |
Amostras negativas vivem em examples/ (bad-narration.txt, bad-storyboard.json) — sempre verifique uma configuração nova executando os lints nelas e confirmando que ELES FALHAM.
Formatos de arquivo
timing.json — timbres por palavra (da alinhamento TTS):
{ "video": { "title": "...", "fps": 30 },
"segments": [ { "id": "seg-01", "text": "...", "start": 0.0,
"words": [ { "w": "Close", "start": 0.1, "end": 0.34 } ] } ] }
storyboard.json — um objeto por segmento:
{ "video": { "title": "...", "fps": 30, "width": 1920, "height": 1080,
"srtEmitted": true, "transcriptEmitted": true, "claimsLedger": "caminho" },
"segments": [ { "id": "seg-01", "title": "Ancoragem", "sceneKind": "statement",
"startSec": 0, "durationSec": 18.2, "narration": "...",
"visual": { "backdrop": "chalkboard", "description": "...",
"onScreenText": ["Reler supera releitura"] },
"audioDescriptionNote": "...", "claims": [] } ] }
sceneKind mapeia para um componente de template: statement, definition, timeline, cycle, list, caption. Adicione novos tipos no template, não como componentes avulsos dentro de um projeto.
Pacote de critérios de QC (pontue a saída renderizada CONTRA ISSO, por escrito)
Um agente de QC não "assiste" ao vídeo e opina. Ele pontua cada critério como aprovado/reprovado com uma observação citada. Verificações no nível do quadro precisam de quadros renderizados; verificações no nível do roteiro são executadas nos artefatos. Escreva o resultado em qc-report.md e rotule o método de revisão (ex.: "Revisão heurística por agente").
Nível do roteiro (executar sempre)
- Alinhamento com o objetivo — cada segmento avança o objetivo aprovado; tudo que não avança é cortado (princípio de coerência aplicado a metas).
- Rastreabilidade de afirmações — cada número, data ou descoberta nomeada na narração tem uma linha no livro-razão de afirmações com uma fonte. Falhe em qualquer fato órfão.
- Lint de narração —
lint-narration.mjssai com 0. - Nível de leitura — frases com média inferior a ~17 palavras; nenhum termo técnico não explicado; verbos concretos em vez de abstrações.
- Pacote de acessibilidade —
a11y-lint.mjssai com 0; SRT e transcrição existem; nota de AD presente para cada segmento.
Nível do quadro (executar em quadros renderizados ou capturas de tela por segmento)
- Sinalização — o termo/número chave do momento é destacado visualmente (sublinhado de giz, cor, seta) exatamente enquanto é narrado.
- Coerência — nada decorativo na tela; cada elemento mapeia para uma ideia narrada; nenhuma música de fundo a menos que o usuário tenha solicitado.
- Redundância — o texto na tela não duplica a narração literalmente; são rótulos e frases curtas.
- Contiguidade espacial — os rótulos estão adjacentes ao que descrevem; sem caça ao tesouro legenda-gráfico dentro de um quadro.
- Contiguidade temporal — a revelação de um elemento é sincronizada com sua linha de narração (verificar contra timing.json), não mostrada antes ou depois.
- Legibilidade — linhas de giz contrastam com o fundo (>= 4,5:1 para equivalentes de texto na tela); nada cortado em 1920x1080 ou 1280x720.
- Orçamento de movimento — animações se estabilizam em 1,2 s; nada se move durante uma frase que introduz uma ideia diferente.
Pontue cada REPROVADO/APROVADO com evidência. Qualquer REPROVADO em 1–5 bloqueia o PORTÃO 4. Qualquer REPROVADO em 6–12 requer correção e re-renderização daquele segmento, ou aceitação explícita do usuário.
Padrões de estilo (competição do PORTÃO 3)
- Fundo:
chalkboard(verde-ardósia profundo, textura sutil, vinheta suave). Alternativas para a competição:paper(off-white quente, linhas de tinta),night(quase preto, única cor de destaque). - Paleta: branco-giz primário, um destaque (âmbar #FFC66D) para realces. Destaque apenas o que a sinalização exigir.
- Tipo: grande (>= 64 px em 1080p), alto contraste; legendas no centro inferior com placa translúcida, máx. 2 linhas / 42 caracteres por linha.
- Respeite o espectador: sem flashes (> 3 flashes/s proibido), movimento estabiliza rápido, barra de progresso mostra posição do capítulo.
Trilha de auditoria (commite tudo)
01-objective.md (+ saída do portão) 05-timing.json
02-research-notes.md 06-subtitles.srt
03-narration.md 07-claims-ledger.md
04-storyboard.json 08-qc-report.md
A trilha de auditoria é tão produto quanto o vídeo: é o que torna o pipeline auditável por outro designer instrucional.
Limitações honestas (diga estas no log do projeto)
- O QC do agente é revisão heurística por um modelo, não endosso de especialista.
- Nenhuma afirmação de que uma saída é "instrucionalmente validada" — isso requer testes com aprendizes que esta skill não realiza.
- Legendas alinhadas por palavra são tão boas quanto o alinhamento do TTS; verifique 10 dicas contra o áudio antes do PORTÃO 4.
- Licenciamento de voz: as vozes do kokoro-82m têm seus próprios termos de uso; verifique antes da distribuição comercial.
Atribuição
Inspiração metodológica, sem código copiado: anything2explainer (PolyForm Noncommercial — método apenas, veja o ATTRIBUTION.md deste repositório), o padrão de fluxo de aprovação por portões do vox-director (MIT) e o conceito de lista de verificação de "sinais de escrita de IA" do blader/humanizer e da Wikipedia "Signs of AI writing" (o lint deste repositório é uma implementação independente).