video-qa-gates
以測量為準,而非目視。看著影片說「好像沒問題」就是讓 4 秒的靜止畫面得以出貨的原因。
| 腳本 | 測量項目 | 失敗條件 |
|---|---|---|
scripts/qa_video.py | 音訊串流存在;尺寸;持續時間(±容差或最大值);最長近似靜止片段(以 10 fps 降格複製,避免緩慢背景漂移掩蓋停滯);空白音(-50 dB,≥0.3 秒);整合響度(預設 -14 LUFS ±1.5);真實峰值(≤ -1 dBFS) | 任一限制超標 |
scripts/opening_density.py | 前幾秒內「平坦」8x8 網格區塊(亮度標準差 < 5)的比例,中位數與最大值 | 開場多為空白背景;可用影格少於 N 格(= 無法測量) |
scripts/subtitle_lint.py | 每條字幕的行數、每行字元數、最短顯示時間、每秒字元數、重疊 | 任何違規;解析出零條字幕(= 無法測量) |
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 # 使用 ffmpeg 建立合成片段,並驗證每個缺陷都能被正確偵測
設計筆記(為何如此建構)
- 退出碼 3 代表「無法測量」。 缺少 ffmpeg、檔案無法讀取或可用影格少於 N 格時,絕不能回傳綠色。
- 以 10 fps 降格複製來測量靜止畫面。 旋轉光線或背景發光會讓靜止場景在全精度下看起來「有生命」;便宜的複製會去除那些雜訊。限制值為
--max-freeze(預設 4 秒);一直持續到片段結尾的靜止畫面也會被計算。 - 閃爍/全黑影格在密度測量中被跳過(平均亮度 <8 或 >247):它們無法反映場景內容。
- 根據你自己的優良與不良範例來校準門檻,並記錄下來。 測量一些你認為不錯的開場和一些你認為平淡的開場,然後將限制值設定在兩者之間。預設值只是起點;你的數字會不同。
- 可能是測試輸入錯了,而不是門檻錯了。
testsrc2圖案是大色塊,會被測量為「空」;雜訊影片則是誠實的對照組。當門檻與其測試輸入不一致時,找出哪邊錯了。 - 這些都是代理指標,用以反映「感覺像真正的短影音」。通過檢測並不保證影片有趣或吸引人;人類的抱怨(「看起來像投影片」、「字幕重複螢幕上的文字」)應該成為新的可測量門檻。
與以下工具搭配使用
cold-read-comprehension-review:用於「觀眾能否理解」(數字無法衡量的部分)。llm-adaptation-fidelity-check:當腳本改編自原始文本時使用。llm-verdict-gate與ci-gate-forgery-test:用於配套流程。
值得加入的額外檢測項目(此處未實作)
畫面審核(每個螢幕文字框:重疊、平台 UI 安全區、字幕條侵入);螢幕文字字串允許清單(防止偽造);文字尺寸下限(以畫面寬度百分比表示);剪輯節奏(平均/最大剪輯長度);透過語音辨識計算字幕與語音的字元錯誤率(≤ 0.08);渲染 DOM 中禁止表情符號;字幕/螢幕文字重複比例。這些需要你的渲染器的 DOM/時間軸,因此無法通用化。
執行時期依賴:使用 python3 -m pip install -r requirements.txt 安裝 requirements.txt。Pillow 至少需為 12.3.0 版;上述選擇性模型依賴項則分開列出。