video-qa-gates
用测量数据做判断。看一眼视频然后说“看起来还行”正是导致4秒卡顿上线的做法。
| 脚本 | 测量项 | 失败条件 |
|---|---|---|
scripts/qa_video.py | 音频流存在;尺寸;时长(±容差或最大);最长近静止片段(基于10fps的副本,使缓慢的背景漂移不会掩盖停滞);死寂(-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,绝不能显示为通过。
- 使用10fps降采样副本来测量卡顿。 旋转的光线或背景中的辉光会使静止场景在全精度下看起来“有生命”;降采样副本会过滤掉这些噪声。限制是
--max-freeze(默认4秒);一直持续到片段末尾的卡顿也会计入。 - 闪屏/黑帧在密度测量中被跳过(平均亮度 <8 或 >247):它们无法说明场景内容。
- 根据你自己的好例子和坏例子校准阈值,并记录下来。 测量几个你认为好的开场和几个你认为平淡的开场,在它们之间设定限制。默认值是起点;你的数字会不同。
- 测试输入可能出错,但门控本身没错。
testsrc2模式是大色块,会被测量为“空”;噪声视频是诚实的对照。当门控与其测试输入不一致时,找出哪一方错了。 - 这些是 “感觉像真正的短视频”的代理指标。通过测试并不能保证视频有趣或吸引人;人的抱怨(“看起来像幻灯片”,“字幕重复屏幕上的文字”)应该成为新的可量化门控。
搭配使用
cold-read-comprehension-review用于“观众是否能理解它”(数字无法衡量的东西)。llm-adaptation-fidelity-check当脚本是从源文本改编时。llm-verdict-gate+ci-gate-forgery-test用于整个处理流程。
值得添加的额外门控(此处未实现)
屏幕审计(每个屏幕文字框:重叠、平台UI安全区、字幕带入侵);屏幕字符串白名单(防伪造);文本大小下限(占帧宽度的百分比);剪辑节奏(平均/最长剪辑长度);通过STT的音视频字数错误率(<= 0.08);渲染DOM中的表情符号禁止;字幕/屏幕文字重复率。这些需要你的渲染器的DOM/时间线,因此无法通用。
运行时依赖:使用 python3 -m pip install -r requirements.txt 安装 requirements.txt。Pillow 必须至少为 12.3.0 版本;上面列出的可选模型依赖是独立的。