video-qa-gates
Beurteile durch Messung. Ein Video anzusehen und zu sagen „sieht gut aus“ ist der Grund, warum 4-Sekunden-Einfrierungen die Sendung erreichen.
| Skript | Misst | Fehlschlag bei |
|---|---|---|
scripts/qa_video.py | Audiospur vorhanden; Größe; Dauer (+-Toleranz oder Maximum); längste annähernd stehende Phase (auf einer 10-fps-Kopie, damit langsamer Hintergrunddrift keinen Stillstand verdeckt); tote Stille (-50 dB, >= 0,3 s); integrierte Lautstärke (Standard -14 LUFS +-1,5); True Peak (<= -1 dBFS) | Überschreitung eines Limits |
scripts/opening_density.py | Anteil „flacher“ 8x8-Rasterzellen (Helligkeits-Stdabw. < 5) in den ersten Sekunden, Median und Maximum | Eröffnung besteht hauptsächlich aus leerem Hintergrund; weniger als N verwertbare Frames (= nicht gemessen) |
scripts/subtitle_lint.py | Zeilen pro Cue, Zeichen pro Zeile, minimale Anzeigedauer, Zeichen/Sekunde, Überlappungen | Verstoß gegen eine Regel; null geparste Cues = nicht gemessen |
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 # erstellt synthetische Clips mit ffmpeg und prüft, ob jeder Fehler aus dem richtigen Grund erkannt wird
Entwurfsnotizen (warum es so gebaut ist)
- Exit 3 bedeutet „konnte nicht messen“. Fehlendes ffmpeg, nicht lesbare Datei oder < N verwertbare Frames dürfen nicht grün werden.
- Messe einen auf 10 fps herunterskalierten Kopie für Einfrierungen. Sich drehende Lichtstrahlen oder Glühen im Hintergrund lassen eine eingefrorene Szene bei voller Auflösung „lebendig“ aussehen; die billige Kopie entfernt dieses Rauschen. Das Limit ist
--max-freeze(Standard 4 s); eine Einfrierung, die bis zum Ende des Clips läuft, zählt ebenfalls. - Blitz-/Blackout-Frames werden bei der Dichte übersprungen (mittlere Leuchtdichte < 8 oder > 247): Sie sagen nichts über die Szene aus.
- Kalibriere Schwellenwerte anhand deiner eigenen guten und schlechten Beispiele und protokolliere sie. Miss einige Eröffnungen, die du für gut hältst, und einige, die du für flach hältst, und setze die Grenzen dazwischen. Die Standardwerte sind Ausgangspunkte; deine Zahlen werden abweichen.
- Die Testeingabe kann falsch sein, nicht das Gate. Ein
testsrc2-Muster sind große Farbblöcke und wird als „leer“ gemessen; ein Rauschvideo war die ehrliche Kontrolle. Wenn ein Gate und seine Testeingabe sich widersprechen, finde heraus, welches falsch liegt. - Dies sind Stellvertreter für „fühlt sich wie ein echter Kurzfilm an“. Das Bestehen garantiert nicht, dass es unterhaltsam oder attraktiv ist; die Beschwerde eines Menschen („sieht aus wie eine Diashow“, „Untertitel duplizieren den Bildschirmtext“) sollte zu einem neuen messbaren Gate werden.
Kombiniere es mit
cold-read-comprehension-reviewfür „versteht ein Betrachter es“ (das, was Zahlen nicht messen können).llm-adaptation-fidelity-checkwenn das Skript aus einem Quelltext adaptiert wurde.llm-verdict-gate+ci-gate-forgery-testfür den umgebenden Prozess.
Zusätzliche Gates, die es wert sind, hinzugefügt zu werden (hier nicht implementiert)
Bildschirmaudit (jeder on-screen Textbox: Überlappungen, platform-UI sichere Bereiche, Übergriff der Untertitelzone); Positivliste für on-screen Zeichenketten (Anti-Fälschung); minimale Textgröße als % der Bildbreite; Schnittrhythmus (durchschnittliche/maximale Schnittlänge); Zeichenfehlerrate Untertitel vs. Sprache via STT (<= 0,08); Emoji-Verbot im gerenderten DOM; Duplikationsverhältnis Untertitel/on-screen Text. Diese benötigen das DOM/Zeitleiste deines Renderers, daher können sie nicht generisch sein.
Laufzeitabhängigkeit: Installiere requirements.txt mit python3 -m pip install -r requirements.txt. Pillow muss mindestens 12.3.0 sein; optionale Modellabhängigkeiten sind oben separat aufgeführt.