Vídeos Doco-3D (TikTok, Português)
Tudo é construído em código: HyperFrames mais Three.js. Leia primeiro o skill hyperframes, onde estão contrato, check, snapshot e render.
Idioma: sempre português. Isso vale para roteiro, voz, título, legendas e para respostas ao usuário.
O Formato (medido a partir de três vídeos de referência)
- Técnica: 1080×1920, 30 fps.
- Duração: PADRÃO 60–90 segundos (pedido expresso do usuário; ~150–200 palavras, 10–14 tomadas). Mais curto apenas a pedido explícito.
- Perspectiva: O espectador é VOCÊ. "Você vai para a praia." "Você senta em um bunker perto de Moscou." "Seu despertador toca."
- Estrutura de contagem regressiva: O tempo é a espinha dorsal. "Em 3 horas" → "Ainda 2,5 h" → "Ainda 30 min" → "Hora 0" → "+40 min". Alternativamente "Minuto 0/25/100/160" ou "Dia 1/3/7/10". O ponto de virada é "Hora 0" ou "Minuto 0".
- Estrutura:
- Abertura calma (idílica ou cotidiana), data e local na linha superior.
- Sinais e escalada, cada tomada um salto temporal.
- Catástrofe ou ponto de virada.
- Balanço com um número duro, de preferência em um mapa estilizado ("≈ 230.000", números vermelhos em alarmes).
- Seção explicativa "… na média" / "Por quê?" com painel escuro e gráfico esquemático plano, legenda "ESQUEMA, NÃO EM ESCALA".
- Fim: uma lição ou uma pergunta para "você".
- Corte: cortes secos entre tomadas (a cada 2–4 s). Dentro de cada tomada, a câmera se move lentamente, como um dolly ou push-in, com
smooth()ao longo de toda a tomada.
Design
Mundo 3D (Three.js r149, assets/vendor/three.min.js, carregar no <template> da cena):
- Mundo low-poly estilizado e suave com materiais lisos (roughness ~0.8), sol quente e sombras suaves (PCFSoft, mapa 1024).
- Céu como textura gradiente, além de névoa. Tone mapping ACES com exposição ~0.62, caso contrário, tudo parece desbotado.
- Personagens = bonecos articulados: pernas, tronco e braços em cápsula, cabeça esférica, touca de cabelo, roupas em cor sólida, sem rostos. Auxiliar
person(seed, {top, pants, scale}), animação comidle()/walk(), fases nunca sincronizadas. - Adereços feitos de caixa, cilindro e esfera, detalhes via
canvasTex()(mostradores, placas, janelas). - Cenas noturnas com janelas emissivas; luz apagada =
emissiveIntensitygraduado por distância. - Cada tomada é
W.<id> = {scene, camera, update(tLoc, T)},SHOTSdefine os tempos. Renderizado via um proxy GSAP (onUpdate → renderAt) e adicionalmente viahf-seek. - Modelo:
templates/exemplo-ninguem-trabalha/mundo.html, com estas cenas: quarto + despertador, escritório aberto, ponto de ônibus, supermercado, corredor de hospital, rua de lixo + ratos, cidade à noite (luz apagada), cozinha com vela, janela/varanda. Copiar auxiliares, cenas e renderizador, reutilizar ou substituir cenas. - O enquadramento do retrato é estreito (~27° horizontal): coloque a câmera mais longe do que você pensa e posicione os personagens no centro da imagem.
- Hold-shots sob painéis:
{ id, t0, t1, hold: true }renderiza a cena no estado final.
Bloco de título superior esquerdo (scripts/titulo.py, dados em titulo.json), Open Sans, branco, sombra suave:
- Linha superior, 32 px, 600, maiúsculas com espaçamento, ex.: "26 DE DEZEMBRO DE 2004, ≈ 10:00".
- Título, 132 px, 700, ex.: "Ainda 30 min", "Minuto 0", "Dia 7". Em alarme pode ser vermelho (
"cor":"#ff4b3e"). - Linha inferior, 32 px, 600, maiúsculas, ex.: "O MAR RECUA".
- Posição: esquerda 72 px, topo 228 px. Muda a cada corte (blur-in 0,2 s).
Legendas (scripts/legenda.py):
- Open Sans 700 itálico, 54 px, centralizado em y ≈ 1210.
- Uma frase (até a pontuação ou no máx. 5 palavras) aparece. Palavras ainda não ditas ficam esmaecidas (0.5) e acendem ao serem faladas.
- Palavras-chave em azul claro
#6cc0ff(--azul "Mar,Onda").
Mapa de balanço (modelo balanco.html, caminhos de europa-paths.json ou Natural Earth):
- Mapa plano: mar
#123f73, terra bege#e9dfc6, país alvo mais claro com borda branca, pontos amarelos de cidades. - Anéis brancos pulsam do centro, número grande no bloco de título aumenta e fica vermelho.
Seção explicativa (modelos explicacao.html = cadeia, estoque.html = duas fases na mesma faixa):
- Cena fortemente escurecida (
rgba(20,26,38,.97)em cima, um pouco de visão em baixo). - Bloco de título "A CAUSA / Por quê? / ESQUEMA, NÃO EM ESCALA".
- Uma faixa de imagem clara (y 640–1040) com ilustração plana (corte transversal, cadeia, câmaras…) e rótulos em maiúsculas.
- Frase de status em ciano
#5fd0e8abaixo da faixa. - Cruz vermelha ou visto verde como ícones (OpenMoji).
Áudio: A voz é o relógio. Efeitos sonoros com moderação:
- whoosh-curto em cortes
- impact-grave no ponto de virada
- erro/pop na cruz ou alarme
Música apenas se o usuário fornecer um arquivo.
Fluxo (sem perguntas adicionais, quando um tópico é mencionado)
bash scripts/setup.sh(uma vez por contêiner), depoisbash scripts/projeto.sh <slug>.- Escrever
script.txt: uma linha por tomada, forma "você", frases curtas.- Duração: 60 s ≈ 150 palavras, 70 s ≈ 165, 90 s ≈ 210 (Piper ~2,5 palavras/s incluindo pausas).
- Números escritos por extenso para a voz, exibição com
doze{12}. - Fatos apenas se confiáveis; estimativas com "cerca de"/"aproximadamente", experimentos mentais no modo condicional/ como cenário.
python3 scripts/voz.py script.txt assets/audio --speed 1.08 --gap 0.45- Resultado:
voz.wavepalavras.json, tomadas cortadas porlines[].start. - Gravação própria do usuário tem prioridade.
- Resultado:
titulo.json→python3 scripts/titulo.py titulo.json compositions/titulo.htmlpython3 scripts/legenda.py assets/audio/palavras.json compositions/legenda.html --azul "..."- Construir
compositions/mundo.html(3D) ecompositions/explicacao.html(esquema); copiarindex.htmldo modelo (camadas: mundo 1, explicacao 2, titulo 3, legenda 4, Áudio). npx hyperframes check --json(erros devem ser resolvidos; avisos de contraste contra céu claro são estilísticos).- Depois
npx hyperframes snapshot --at a,b,c,d,e,f --no-end -o snap, no máximo cerca de 6 pontos de tempo por chamada. - Visualizar imagens e corrigir.
- Depois
- Render em segundo plano:
npx hyperframes render -o renders/<slug>.mp4 -q delivery -w 2 --quiet.- WebGL roda na CPU, leva alguns minutos.
- Depois verificar com ffprobe, visualizar contato e enviar o arquivo ao usuário.
Voz (desejo do usuário: voz feminina amigável)
- Preferido: arquivo ElevenLabs do usuário (anteriormente "Jessica – Playful, Bright, Warm", eleven_v4). Fluxo:
- Dar ao usuário o script como bloco de texto para gravar (uma linha por tomada).
- Gerar referência com tempos de palavra:
python3 scripts/voz.py script.txt /tmp/ref --voice ~/.cache/geo-voice/vits-piper-de_DE-kerstin-low/de_DE-kerstin-low.onnx --gap 0.4 - Alinhar:
python3 scripts/alinhar.py /tmp/ref assets/audio/<eleven>.mp3 assets/audio(DTW via MFCC, inícios de linha ajustados a pausas reais). Resultado:voz.wav+palavras.json; verificar limites de linha comsilencedetect. - Derivar todos os tempos (cortes, títulos, efeitos, painéis) dos novos tempos de palavra.
- Substituição sem arquivo: vozes femininas Piper (Kerstin/Ramona/Eva, GitHub
k2-fsa/sherpa-onnxreleasetts-models). Soam sintéticas; apenas como solução temporária, informar o usuário. - Não é possível clonagem de voz (modelos bloqueados), não construir vozes de estranhos ou celebridades.
Música e Sons
O usuário sempre quer uma música de fundo suave e efeitos sonoros. Openverse, Freesound, Pixabay, archive.org e HeyGen estão bloqueados, portanto ambos são gerados sinteticamente com scripts/som.py.
- Música:
python3 scripts/som.py musica musica-plano.json assets/music/musica.wavmusica-plano.jsondefine por seção: acorde, energia, brilho e opcionalmente um pulso em BPM. Além disso, algumas notas de piano.- As seções seguem a dramaturgia: sombrio → tensão (pulso) → ponto baixo quase silêncio → acorde maior quente na esperança.
- No vídeo com
data-volume~0,22 abaixo da voz (arquivo de música ≈ −18 LUFS).
- Efeitos:
python3 scripts/som.py sfx assets/sfxgera vento, trovão, rádio, relógio, passos, coluna, sirene, sino, coração, zumbido, explosão.- Além dos whoosh/impact/riser fornecidos em
media-use. - Volumes 0.15–0.45, sons contínuos com
data-fade-in/out.
- Além dos whoosh/impact/riser fornecidos em
- Controle: ver espectro com
showspectrumpic(cliques = linhas verticais). Não posso ouvir, portanto informar ao usuário que a mixagem foi medida e não ouvida. - Em temas sensíveis (Holocausto, vítimas) reduzir a música; apenas vento ou zumbido.
Temas Históricos Sensíveis
- Sem suásticas, runas SS ou outros símbolos nazistas e sem retratos de perpetradores com rosto (TikTok bloqueia, mesmo em contexto histórico). Bandeiras e uniformes manter abstratos.
- Campos e violência apenas sugerir (cerca, torre de vigia, névoa), não mostrar vítimas. Tom objetivo e crítico.
- Em cenários de "e se", ao final contextualizar a realidade ("A Realidade" / "Por que é quase impossível") e mostrar a libertação.
Sempre Melhorar (desejo do usuário)
Cada projeto deve elevar atmosfera, efeitos, animação e som em relação ao anterior. O estado atual está em templates/exemplo-chernobyl/:
- Partículas
particles(cena, n, seed, {x,y,z,v,deriva,grav,vida,cor,tamanho,opacidade,adicionar,nevoeiro}): determinísticas e sempre com a textura redonda suaveSOFT(sem ela aparecem quadrados). Usadas para fogo, brasas, fumaça, chuva, poeira, jato d'água e folhas. - Luz como narrativa: luzes de alarme piscando, PointLights de fogo tremeluzindo, feixe de luz aditivo, brilho no horizonte como plano gradiente (não esfera).
- Câmera: tremer em impactos (
exp(-u*2.2)), dollys lentos por tomada. - Camada de aparência
look.html(z-index acima do mundo, abaixo dos títulos/legendas): grão de filme (15 fps, determinístico), vinheta, flash branco em explosões, fade para preto em momentos de silêncio, fade final para preto. - Som:
som.py sfx2para Geiger (3 densidades), alarme, explosão, fogo, sirene2, ônibus, chuva e rangido. Emmusica-plano.jsonháar(harmônicos),sub(sub-grave) esilêncio(janelas de silêncio duro, ex. logo após o estrondo). Além disso, um riser que converge exatamente para o ponto de virada (início = impacto − 10,03 s). - Estrutura que sustenta: início e fim se espelham (você dorme ↔ você fica acordado na janela), mapa e esquema entre eles.
Armadilhas
-
cam()tem apenas 400 m de alcance visual. Para tudo que está mais longe (horizonte, usina, arcos), usarcamFar(3000+)e definir névoa suficientemente distante, senão fica invisível. -
Janela retrato: planejar objetos de fundo exatamente através da abertura (ângulo = atan(altura/distância)).
-
Qualidade antes da velocidade (desejo do usuário): sempre 1080×1920,
-q delivery, sombras completas e antisserrilhamento. Uma renderização de 70 s leva na nuvem (CPU-WebGL) cerca de 40–60 min. Avisar isso com antecedência e não reduzir. -
pkill -f <padrão>atinge o próprio shell se o padrão estiver no comando. Em vez disso, encerrar processos por PID. -
A voz Piper soa sintética (16 kHz). Oferecer uma gravação própria ou um arquivo ElevenLabs.
-
Em linhas com fonema desconhecido, não há alinhamento.
voz.pyentão distribui as palavras por energia e comprimento de sílaba; verificar timing no snapshot. -
IDs de cena devem ser únicos (prefixos
er-,ti-,lg-). -
O contêiner é efêmero: enviar vídeos imediatamente. Skill e projetos só persistem se forem enviados a um repositório Git.