video-qa-gates
Julgue por medição. Olhar para um vídeo e dizer "parece bem" é como 4 segundos de congelamento passam despercebidos.
| Script | Mede | Falha quando |
|---|---|---|
scripts/qa_video.py | fluxo de áudio presente; tamanho; duração (+-tol ou máxima); maior trecho quase parado (em cópia de 10 fps para que desvio de fundo lento não esconda uma parada); silêncio (-50 dB, >=0,3 s); loudness integrado (padrão -14 LUFS +-1,5); pico verdadeiro (<= -1 dBFS) | qualquer limite excedido |
scripts/opening_density.py | fração de células 8x8 "planas" (desvio padrão de brilho < 5) nos primeiros segundos, mediana e máximo | abertura é principalmente fundo vazio; menos de N quadros utilizáveis (= não medido) |
scripts/subtitle_lint.py | linhas por legenda, caracteres por linha, tempo mínimo de exibição, caracteres/segundo, sobreposições | qualquer violação; zero legendas analisadas = não medido |
python3 scripts/qa_video.py out.mp4 --expect-size 1080x1920 --max-duration 30
python3 scripts/opening_density.py out.mp4 --seconds 3
python3 scripts/subtitle_lint.py out.vtt --max-chars 20
bash tests/run.sh # constrói clipes sintéticos com ffmpeg e verifica se cada defeito é detectado pelo motivo correto
Notas de design (por que é construído dessa forma)
- Saída 3 é "não foi possível medir". Falta do ffmpeg, arquivo ilegível ou <N quadros utilizáveis não devem virar verde.
- Meça uma cópia reduzida a 10 fps para congelamentos. Raios de luz girando ou brilho no fundo podem fazer uma cena congelada parecer "viva" em precisão total; a cópia barata elimina esse ruído. O limite é
--max-freeze(padrão 4 s); um congelamento que vai até o fim do clipe também conta. - Quadros de flash/preto são ignorados na densidade (luminância média <8 ou >247): eles não dizem nada sobre a cena.
- Calibre os limites com seus próprios exemplos bons e ruins, e registre-os. Meça algumas aberturas que você considera boas e algumas que considera planas, e defina os limites entre elas. Os padrões são pontos de partida; seus números serão diferentes.
- A entrada de teste pode estar errada, não o portão. Um padrão
testsrc2são grandes blocos de cor e é medido como "vazio"; um vídeo de ruído foi o controle honesto. Quando um portão e sua entrada de teste discordam, descubra qual está errado. - Estes são proxies para "parece um short real". Passar não garante que seja divertido ou atraente; a reclamação de um humano ("parece um slide deck", "a legenda duplica o texto na tela") deve se tornar um novo portão mensurável.
Combine com
cold-read-comprehension-reviewpara "se um espectador entende" (o que os números não conseguem medir).llm-adaptation-fidelity-checkquando o roteiro é adaptado de um texto fonte.llm-verdict-gate+ci-gate-forgery-testpara o processo ao redor.
Portões extras que valem a pena adicionar (não implementados aqui)
Auditoria de tela (todas as caixas de texto na tela: sobreposições, áreas seguras da interface da plataforma, intrusão da banda de legenda); lista de permissão de strings na tela (antifalsificação); piso de tamanho de texto como % da largura do quadro; ritmo de corte (comprimento médio/máximo de corte); taxa de erro de caracteres legenda-vs-fala via STT (< = 0,08); proibição de emoji no DOM renderizado; taxa de duplicação legenda/texto na tela. Estes precisam do DOM/linha do tempo do seu renderizador, então não podem ser genéricos.
Dependência de execução: instale requirements.txt com python3 -m pip install -r requirements.txt. Pillow deve ser pelo menos 12.3.0; dependências opcionais de modelo listadas acima são separadas.