A skill decidia a edição sem saber que o JSON dela agora passa por uma tela de revisão antes de virar FCPXML. Isso não é detalhe de fluxo: a etapa 5 traduz cada ação para o vocabulário dela, e sem conhecer essa tradução a intenção da IA se perde no caminho — que é exatamente como uma decisão vira "arbitrária" aos olhos de quem revisa. Novo criterios/10-revisao-humana.md, com o que o app faz com cada ação: - cut cobrindo >=60% da frase remove a linha; tocando só uma borda vira trim encaixado na fronteira de palavra. Corte de meia frase é ambíguo — passa do limiar e apaga a linha toda quando a intenção era aparar a hesitação. - zoom ou text sobre uma frase marca ênfase, e ênfase significa DUAS coisas: zoom mais legenda dinâmica; as demais frases ficam com legenda comum. A escala vira o nível (1.15→leve, 1.3→média, 1.5→forte). - sem ação, o nível é derivado do peak_emphasis; a decisão da IA sempre ganha. - reason é exibido ao lado da frase na tela — é o que o editor lê antes de manter ou desfazer. Deixou de ser campo de log. Consequência prática que faltava em 05-zoom.md: não espalhar zoom "por segurança", porque cada um promove a frase em duas dimensões ao mesmo tempo. Na dúvida, deixar sem — promover custa uma tecla, despromover custa mais. Cada arquivo de critério ganhou cabeçalho de escopo (o que cobre, em que fase), no mesmo padrão dos docs do Engine, para ler só o necessário. Todas as afirmações numéricas do novo critério foram verificadas contra fcpxml/phrase_review.py rodando, não assumidas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.7 KiB
04 — Reanálise do material que sobrou
Escopo: Renormalizar a ênfase sobre o que sobrou, antes de escolher zooms. Quando: Fase 4 — ver a ordem de trabalho em
../SKILL.md.
Não escolha zooms com os números da análise bruta.
O problema
Ênfase e energia são relativas ao conjunto analisado. Energia é normalizada contra o momento mais alto da gravação; ênfase deriva dela.
Se esse momento mais alto foi cortado — uma piada, um grito, uma conversa de bastidor — tudo que sobrou continua pontuado contra uma referência que o espectador nunca verá. As notas do corte final ficam artificialmente comprimidas, e o ranking aponta para as palavras erradas.
Caso real: o pico do vídeo era "Amor, eu tô intacto!" (energia 1,00), descartado na triagem. Todo o material restante estava sendo medido contra ele.
A solução
Depois de definir os cortes, renormalize sobre os sobreviventes. Chame a
ferramenta refine_voice_timeline, passando a mídia e a lista de
cortes que você já decidiu:
refine_voice_timeline(media_path, cuts=[{start, end}, ...], min_gap=8.0)
Ela devolve, numa chamada só, a comparação bruto × sobreviventes, os picos re-ranqueados e os candidatos a zoom. É barata: renormaliza os números já medidos, sem reabrir o áudio.
Efeito medido no mesmo material:
| Bruto | Só o que sobrou | |
|---|---|---|
| Ênfase média | 0,179 | 0,197 |
| "Aquela" | 0,39 | 0,42 |
| "mastopexia" | 0,26 | 0,34 |
| "devolver" | — | 0,35 |
"mastopexia" só virou candidata legítima depois da reanálise.
As janelas que ela propõe
A seção Zoom Candidates da resposta já vem com três coisas resolvidas:
- Pega a palavra de conteúdo mais enfática de cada frase. Artigos e conectivos são filtrados — um "a" falado alto continua sendo um artigo. Sem esse filtro, o ranking bruto apontava para "o", "a", "eu": picos de entrega, não de sentido.
- Estende a janela até o fim da frase, não do segmento (ver
05-zoom.md). - Mantém distância mínima entre zooms.
São candidatos, não obrigações. Corte a lista pelo ritmo
(07-ritmo.md). Os tempos continuam na mídia original — vão direto para
apply_voice_actions.
max_zooms limita a lista, mas prefira cortá-la você mesmo: o corte por
ritmo é decisão editorial, não um teto numérico.
Princípio geral
"Qual o momento mais forte da gravação?" e "qual o momento mais forte do vídeo final?" são perguntas diferentes sempre que a métrica for relativa.
Toda métrica normalizada precisa ser recalculada quando o conjunto muda — senão ela responde a pergunta errada, silenciosamente.