# Como o corte seco decide cada corte

## 1. Achar as pausas

- Envelope do som em janelas de 10 ms. Com `--voz`, mede no áudio só da voz. Sem ele, no áudio do próprio vídeo.
- Limiar de silêncio: 30 dB abaixo da fala (percentil 90 do envelope), e pelo menos 10 dB acima do fundo (percentil 5). `--limiar` força outro valor.
- Pausa é um trecho abaixo do limiar com pelo menos `--pausa-min` (0,25 s). A pausa depois da última fala fica intacta, porque ali costuma estar o cartão final.
- Se a fala e o fundo estão a menos de 40 dB de distância, o script avisa. Quase sempre é trilha já mixada.

## 2. Onde o corte pode cair dentro da pausa

- Folga de 0,06 s depois do fim da palavra e 0,07 s antes da próxima (bordas no limiar).
- Consoante fraca no começo da próxima palavra: a borda anda pra trás até 0,12 s enquanto o som ainda estiver acima do "som fraco" (12 dB abaixo do limiar, ou 6 dB acima do fundo, o que for maior). Esse trecho fica protegido, com mais 0,04 s de folga.
- Quanto sai: a pausa menos `--pausa-max` (0,15 s), arredondado pra quadro inteiro. Se não couber entre as folgas, sai menos.
- Começo do vídeo: sai tudo até 0,08 s (`--inicio`) antes da primeira palavra.
- Trava final: se o trecho escolhido tiver qualquer janela de voz acima do limiar, o corte é descartado.

## 3. Não cortar no ataque de efeito sonoro

- Com `--sfx`: cada som do plano protege do começo do som (ou 0,3 s antes do pico, o que vier depois) até 0,06 s depois do pico. Aceita o `plano_sfx.json` do `helpers/plano_sfx.py`, uma lista de eventos (`t`) ou uma lista com `peak`.
- Com `--voz`: onde o vídeo tem som acima do limiar e a voz não tem, é efeito. O começo desse som (até 0,10 s) fica protegido.
- Se o melhor lugar pega um ataque, o corte encolhe um quadro por vez até sair de cima. Se não der, a pausa fica e aparece no relatório.

## 4. Qual quadro escolher

Entre as posições possíveis, fica a de menor mudança de imagem: soma da diferença entre quadros vizinhos no trecho que sai (imagem em 96 px, cinza). Com `--sem-grafismo`, mede só nos grafismos. Assim o pulo cai com os grafismos parados e a pessoa fica sendo a única coisa que "salta", o que parece um corte normal. Empate: fica a posição mais no meio da pausa.

## 5. Montar o vídeo

- Imagem: `select` pelos números dos quadros que ficam, `setpts` refeito, x264 CRF 16 (`slow` até 3 min, `medium` acima). Um decodificador só, exato no quadro.
- Som: cortado em numpy nas mesmas posições (amostra = quadro × taxa ÷ fps), com micro fade de 8 ms em cada emenda.
- Volume: -14 LUFS em 2 passadas, sempre linear. Se o pico real passar do teto, entra um limitador com atraso compensado (não desloca o som). Depois do AAC o pico é medido de novo; se passou de -0,5 dBTP, grava outra vez com o teto mais baixo.

## 6. Conferência automática

- Duração da imagem e do som contra a soma dos trechos mantidos.
- Cada quadro da saída contra o quadro esperado da entrada e os vizinhos (±2). Um deslocamento de 1 quadro já aparece aqui: no teste, 2 trechos deslocados de propósito derrubaram a conta de 1657 pra 1615 quadros e o som pra 33 ms de desvio.
- Cada trecho de som com mais de 0,7 s contra a entrada, por correlação.
- Pausas acima de `--pausa-max` + 0,07 s que ficaram na saída.

## Campos do relatório (`SAIDA.corte.json`)

- `cortes`: `pausa` (começo e fim na entrada), `removido` (o que saiu), `dur`, `sobra` (silêncio que ficou), `imagem` (quanto a imagem mudava no trecho), `forcado` nos pedidos por `--cortar`.
- `mantidas`: pausas que ficaram e o motivo.
- `mapa`: `[início na entrada, fim na entrada, início na saída]` de cada trecho. Tempo novo = início na saída + (tempo antigo - início na entrada), pro trecho que contém o tempo antigo.
- `conferencia`: os números do item 6.

## Resultado de referência

Reel "uma IA editou" (59,73 s, 30 fps, 47 efeitos, com `--voz`, `--sfx`, `--sem-grafismo` e a tomada repetida em `--cortar`): 19 pausas cortadas + 1 corte pedido, 4,5 s fora, saída 55,23 s. Imagem e som batendo com a entrada, 1657 de 1657 quadros no lugar, desvio de som 0,1 ms, -14 LUFS.
