Reel — Edição de tela dividida (painel de 45% sobre o orador)
Um painel creme permanente preenche o topo do quadro (1080 × split.panel_height,
padrão 864 = 45%) com widgets no estilo de interface — cartões, medidores, botões,
terminais, chips — que ilustram exatamente o que está sendo dito. O orador fica abaixo na
escala 1 e nunca se move. Finalização: a palavra-chave do comentário grande na tela, depois um
cartão de seguir. Exemplo trabalhado: examples/split/ (plano + módulo de cena de um vídeo
real de 100 segundos sobre cinco habilidades do Claude).
Argumentos: $ARGUMENTS
Padrões (alterar apenas se o usuário disser)
Leia reel.config.json primeiro (volta para reel.config.example.json se não existir).
| Coisa | Padrão |
|---|---|
| Divisão | "split": split.panel_height (864 → painel 45%, orador 55%; 960 = 50/50) |
| Orador | escala 1, sem zoom, sem movimento; rosto centralizado na região do orador (speaker_y) |
| Caixa segura | "safe": split.safe = [64, 160, 64, 32] → conteúdo da cena fica em 952 × 672 começando 160 px abaixo (o cabeçalho do Instagram / a barra de status do telefone escondem o topo) |
| Legendas / Efeitos sonoros / Música | Nenhum adicionado. Áudio = mix original da gravação, remuxado por finish.py |
| Gravação | Assumir que já está cortada, corrigida de cor, com música adicionada → usar como está. Raw/sem corte → perguntar primeiro |
| CTA | Palavra-chave do comentário (palavra ou número) enorme em um cartão de balão de fala; cartão de seguir "handle": handle_do_criador, apenas texto, nunca um corte de rosto |
| Paleta | split_palette: painel creme, texto tinta, preenchimentos de destaque; texto sobre creme usa accent_deep (contraste) |
Entradas
Nome da gravação + tópico vêm dos argumentos. Pergunte uma vez, em uma mensagem, apenas o que estiver faltando: a gravação já está cortada/corrigida/com música; a palavra-chave do comentário; nomes ou jargões que o Whisper pode ouvir errado (nomes de ferramentas e produtos).
Pipeline
PY = .venv/Scripts/python.exe -X utf8 (Windows) ou .venv/bin/python -X utf8 (macOS/Linux). Etapas longas em segundo plano.
| # | Etapa | Comando / ação | Verificar |
|---|---|---|---|
| 1 | Olhar | ffprobe; folha de contato ffmpeg -i raw/<take> -vf fps=1/5,scale=216:384,tile=9x2 -frames:v 1 work/<take>/sheet.jpg e olhe para ela | parede vazia acima da cabeça? já editado? |
| 2 | Transcrever | $PY tools/transcribe.py <take> --prompt "<nomes, jargões>" | revisar nomes de ferramentas; lacunas > 3 s → re-transcrever janela |
| 3 | Rosto | $PY tools/face_track.py <take> --split <panel_height> | imprime speaker_y |
| 4 | Plano de batida | uma cena por ideia, tipicamente 3-7 s, cada widget fixado a uma palavra falada (cue = início da palavra). Cenas mudam conteúdo, nunca layout | |
| 5 | Arquivo de plano | work/<take>/showcase.json a partir de examples/split/showcase.json: video ("../../raw/<file>"), split, speaker_y, safe, scenes_module, scenes[] {kind, start, end, cue{...}}, handle na cena de seguir; _note registra os números dos rostos | |
| 6 | Cenas | tools/scenes_<slug>.py a partir de examples/split/scenes_5skills.py: um sc_<kind>(i, s) -> (html, js) por tipo, dicionário RENDER, CSS/JS opcionais. Coordenadas dentro da caixa segura (952 de largura); ids s{i}-*; tempos de cue absolutos. sc_comment, sc_follow são o CTA | |
| 7 | Construir | $PY tools/showcase_build.py <take>; em work/<take>/sc: npx hyperframes lint public → 0 erros; npx hyperframes snapshot public -o ../snaps --no-end --describe false --at <meio de cada cena>; ler folhas, corrigir | texto dentro do painel, nada abaixo do cabeçalho |
| 8 | Renderização rápida | $PY tools/finish.py <take> --seconds 12; ler work/<take>/sc/quick_sheet.jpg | |
| 9 | Renderização completa | $PY tools/finish.py <take> (segundo plano) → final/<take>/, verificar, qa/sheet.jpg | ler a folha |
| 10 | Relatório | caminho, duração, cenas, resultado da verificação. Se algo novo foi aprendido, adicione a esta habilidade |
Regras do painel
- Widgets ilustram a frase sendo falada agora: um cartão de repositório quando eles nomeiam o repositório, um medidor quando eles comparam, um tachado quando dizem "não isto".
- Cada cena desaparece 0,25 s antes da próxima (o construtor faz isso); dentro de uma cena, elementos aparecem em suas palavras de cue.
- Números na tela devem ser contagens reais da gravação.
- Os tipos de cena construídos em
showcase_build.py(hook,repo,cta, …) são anteriores à caixa segura de 45% e podem transbordá-la; escreva tipos emtools/scenes_<slug>.pybaseados emexamples/split/scenes_5skills.pyem vez disso. - Texto em Farsi / Árabe: classe
.fa(RTL no elemento, nuncadir="rtl"no<html>),letter-spacing: 0, dígitos viafa(), um zero grande como Latin0. - Sem tweens sobrepostos em uma propriedade, sem
Math.random/from:"random", slides de entrada carregamautoAlpha:0no estado de origem. - Se qualquer clipe de origem for HDR (HLG), mapeie o tom primeiro (
TONEMAPemtools/story_assets.py) —finish.pypara em "promoção automática de HDR". hyperframes snapshotnão é prova da renderização — a etapa 8 é.