Talking-Head Short — editor mestre
Escreva respostas concisas. Não repita transcrições ou logs longos. Corrija coisas editando spec.json com a ferramenta Edit, nunca reescrevendo-o. Cada script imprime um relatório compacto; leia, aja, siga em frente.
S=<este diretório do skill>/scripts, WD=<diretório de trabalho ao lado do arquivo bruto>/ths_<nome>.
0. Configuração (uma vez por máquina/sandbox)
bash $S/setup.sh → use o PY= impresso. Ele instala tudo do PyPI, incluindo um ffmpeg estático se nenhum existir.
Cada download tem um fallback automático. Sandboxes (execução de código do claude.ai, gratuito ou pago) geralmente bloqueiam HuggingFace, Mixkit e a API do Google Fonts, mas permitem GitHub:
- modelo de transcrição: HuggingFace → mirror no GitHub (whisper-base, depois whisper-tiny)
- música/SFX: Mixkit → pacote CC0 no GitHub (ids parecem com
pack:lofi_chill) - fontes: repositório do Google Fonts → jsDelivr → pacote OFL no GitHub (32 famílias) → fonte do sistema
- B-roll: Mixkit → nenhum (use cartões, ou peça ao usuário para enviar clipes)
Se a configuração imprimir "sem rede" / pip falhar: a sandbox está com a saída de rede DESLIGADA. Informe o usuário exatamente (uma mensagem):
"claude.ai → Configurações → Capacidades → Execução de código → Acesso à rede: Todos os domínios (ou adicione: pypi.org, files.pythonhosted.org, github.com, objects.githubusercontent.com, release-assets.githubusercontent.com, api.github.com, raw.githubusercontent.com, cdn.jsdelivr.net, huggingface.co, mixkit.co, assets.mixkit.co), depois inicie um novo chat e execute /talking-head-short novamente." Não tente a edição sem numpy/ffmpeg.
Apenas se todas as fontes falharem: peça uma transcrição colada →
$PY $S/align_text.py $WD transcript.txt. Os ativos são armazenados em cache em~/.ths_assets.
1. Analisar
$PY $S/analyze.py RAW $WD
Ele imprime a resolução, ponto do olho, duração limpa, preenchimentos/gaguejos/reinícios removidos automaticamente, CHECK (preenchimentos suaves, palavras de baixa confiança, pausas longas) e TEXT com timestamps a cada 8 palavras.
- Julgue os takes ruins você mesmo. Remova falsos começos, frases incompletas, "sabe tipo é", "meio que". Mantenha repetições retóricas. Reexecute com
--remove '[[s,e],...]'(segundos da fonte). A transcrição é armazenada em cache. - Olhe
$WD/frames.jpgapenas se o ponto do olho ou o enquadramento estiver em dúvida.
2. Briefing (na sua cabeça, depois 4 linhas para o usuário)
Escreva: tópico · mensagem central · arco emocional (gancho → … → recompensa) · linha do nicho (de NICHES) · tom (calmo/equilibrado/energético) · enquadramento bruto (aberto ou fechado).
Depois execute $PY $S/style.py RAW "<nicho>" --out $WD/style.json. Ele fornece a paleta adaptada com razões, fontes, direção de MG/B-roll/música/SFX e notas importantes.
Leia references/craft.md uma vez (as regras) e references/spec.md (o formato do spec).
3. Perguntar antes de construir (nunca renderizar primeiro)
Use AskUserQuestion se disponível; caso contrário, uma mensagem numerada compacta. Recomende a opção 1 a cada vez.
- Estilo: nicho detectado + tom (ex.: "Autoajuda · calmo-reflexivo") vs 1–2 alternativas.
- Fontes: o par da linha vs 2 alternativas com um contraste de estilo claro (sans líder + serifa/itálico chave, ou sans negrito chave + serifa itálico acento).
- Paleta: paleta da linha adaptada ao material vs paleta derivada do material vs uma cor de marca que o usuário fornecer.
- Densidade visual: Mínimo (legendas + 2–3 cartões) · Equilibrado (legendas + 4–6 cartões / B-roll) · Rico (mais MG + B-roll).
- Música: 3 candidatos licenciados de
$PY $S/assets.py music "<humor>"(id · título · tags), ou nenhum. - B-roll: sim (imagens licenciadas combinando com falas literais) / não. Pule qualquer pergunta que o usuário já respondeu. Aguarde as respostas.
4. Coletar ativos
- Fontes:
$PY $S/assets.py font "Família" ... - Música, SFX, vídeo: execute
assets.py music|sfx|video "<consulta>"para listar, depoisassets.py get <tipo> <id> $WD.- SFX por tom: calmo → "air woosh", "chime"; equilibrado → "whoosh", "pop"; energético → "swoosh", "impact" (usado uma vez).
- Fontes bloqueadas fazem fallback automaticamente (ids de pacote).
assets.py packlista todo o pacote CC0 offline.
5. Escrever spec.json, planejar, styleframes
- Escreva
$WD/spec.json(veja references/spec.md): legendas na ordem falada, cartões nas cláusulas certas, áudio. $PY $S/engine.py $WD --plan→ corrija cada ISSUE editando o spec (encurte ou mescle beats, mova ou remova legendas sob cartões), depois replaneje até que não haja mais ISSUES ou apenas aceitáveis.$PY $S/engine.py $WD --frames t1,...com 10–15 momentos: o ponto médio de cada cartão e final−0.3 s, e cada legenda no seu final−0.1 s. Olhe$WD/styleframes.jpge corrija qualquer coisa cortada, amontoada, desalinhada ou fora da paleta.- Mostre ao usuário os styleframes com uma linha ("pode renderizar?"). Itere apenas no que ele apontar.
6. Renderizar, mixar, QA
bash $S/render.sh $PY $WDrenderiza partes em paralelo e as concatena (≈5 min por minuto de vídeo em um laptop). Em uma sandbox com limite de tempo por comando, execute$PY $S/engine.py $WD --render --part i/Numa vez por parte, depois--concat N.$PY $S/mix.py $WD→final.mp4(limpeza de voz, música com ducking alinhada ao payoff, SFX, -14 LUFS).$PY $S/qa.py $WD→ olheqa_endframes.jpg. Cada final de beat e cartão deve mostrar texto e animação completos. Quadros flash devem ser nenhum.- Entregue o caminho do arquivo, mais 3 linhas sobre o que você escolheu e por quê. Mencione quaisquer ativos que não pôde baixar.
Inegociáveis (porquê: cada um foi apontado como amador)
- Legendas nunca são cortadas. A lead tem largura ≤ key e fica próxima. Dois estilos de fonte contrastantes em proporção áurea. Nunca legendar palavras de preenchimento sozinhas.
- Gráficos em movimento mostram o significado, terminam antes da mudança de cena e permanecem em um sistema visual. Sem bonecos palito ou clip art.
- Suave: um zoom com easing travado no olho entre cortes; sem quadros flash; transições variadas.
- Apenas correção de cor. Apenas ativos licenciados (Mixkit / Google Fonts OFL), com LICENSES.txt mantido em $WD.