video-qa-gates
Jugez par les mesures. Regarder une vidéo et dire « ça a l'air correct », c'est ainsi que des blocages de 4 secondes passent en production.
| Script | Mesures | Échoue quand |
|---|---|---|
scripts/qa_video.py | présence d'une piste audio ; taille ; durée (+-tolérance ou maximum) ; plus longue séquence quasi-statique (sur une copie à 10 ips pour que les fonds animés lents ne cachent pas un blocage) ; silence audio (-50 dB, >= 0,3 s) ; loudness intégré (-14 LUFS +-1,5 par défaut) ; true peak (<= -1 dBFS) | toute limite dépassée |
scripts/opening_density.py | fraction de cellules 8x8 « plates » (écart-type de luminance < 5) dans les premières secondes, médiane et maximum | l'ouverture est principalement un fond vide ; moins de N images exploitables (= non mesuré) |
scripts/subtitle_lint.py | lignes par sous-titre, caractères par ligne, durée d'affichage minimale, caractères/seconde, chevauchements | toute violation ; zéro sous-titre analysé = non mesuré |
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 # génère des clips synthétiques avec ffmpeg et vérifie que chaque défaut est détecté pour la bonne raison
Notes de conception (pourquoi la construction est ainsi)
- Le code de sortie 3 signifie « impossible à mesurer ». L'absence de ffmpeg, un fichier illisible ou moins de N images exploitables ne doit jamais donner un résultat positif.
- Mesurez une copie réduite à 10 ips pour les blocages. Des rayons lumineux tournants ou une lueur en arrière-plan donnent l'impression qu'une scène figée est « vivante » en pleine précision ; la copie bon marché supprime ce bruit. La limite est
--max-freeze(4 s par défaut) ; un blocage qui dure jusqu'à la fin du clip compte aussi. - Les images flash/noir sont ignorées dans la mesure de densité (luminance moyenne <8 ou >247) : elles n'apportent rien sur la scène.
- Calibrez les seuils à partir de vos propres exemples bons et mauvais, et enregistrez-les. Mesurez quelques ouvertures que vous considérez bonnes et quelques-unes que vous considérez plates, puis placez les limites entre elles. Les valeurs par défaut sont des points de départ ; vos chiffres seront différents.
- L'entrée de test peut être erronée, pas la mesure. Un motif
testsrc2est constitué de gros blocs de couleur et mesuré comme « vide » ; une vidéo de bruit était le contrôle honnête. Quand une mesure et son entrée de test ne sont pas d'accord, trouvez ce qui est erroné. - Ce sont des proxy pour « donne l'impression d'un vrai court métrage ». Réussir ne garantit pas que c'est amusant ou attrayant ; une plainte humaine (« ressemble à un diaporama », « le sous-titre duplique le texte à l'écran ») doit devenir une nouvelle mesure quantifiable.
Associez-le avec
cold-read-comprehension-reviewpour « est-ce qu'un spectateur le comprend » (ce que les chiffres ne peuvent pas mesurer).llm-adaptation-fidelity-checklorsque le script est adapté d'un texte source.llm-verdict-gate+ci-gate-forgery-testpour le processus environnant.
Mesures supplémentaires à ajouter (non implémentées ici)
Audit d'écran (chaque boîte de texte à l'écran : chevauchements, zones de sécurité de l'interface plateforme, intrusion de la bande de sous-titres) ; liste blanche de chaînes à l'écran (anti-falsification) ; taille de police minimale en % de la largeur du cadre ; rythme de coupe (longueur moyenne/maximale des plans) ; taux d'erreur caractère sous-titre/parole via STT (<= 0,08) ; interdiction des émojis dans le DOM rendu ; ratio de duplication sous-titre/texte à l'écran. Celles-ci nécessitent le DOM/timeline de votre rendu, donc elles ne peuvent pas être génériques.
Dépendance runtime : installez requirements.txt avec python3 -m pip install -r requirements.txt. Pillow doit être au moins en version 12.3.0 ; les dépendances optionnelles liées aux modèles sont listées séparément ci-dessus.