剧集高光切片引擎 Highlight Clipping Engine

Development Log

做了什么,以及更要紧的,什么坏了。

时间线在下面,但这一页真正值得看的是后半段:那些单元测试全绿、跑起真实素材才暴露的问题。它们不是这个项目独有的,是这类多模态系统的通用失败模式。

8流水线阶段全部实现
248测试,测试代码多于产品代码
4只有跑真实素材才暴露的失败
1质量基线仍待剪辑师标注

Timeline

时间线

从一份需求文档和一套只有函数签名的骨架开始。

What actually broke

四类只有跑真实素材才暴露的失败。

下面每一条都真实发生过,且都在单元测试全绿的情况下发生。把它们写出来比把功能列出来有用——功能表谁都能写,失败模式得付出代价才知道。

类型一

测试全绿,东西是坏的

单元测试验的是「函数按约定返回了值」,验不了「这个值对不对」。两者之间的缝隙,只有把真实素材灌进去、再用眼睛或另一套模型去查结果,才会显出来。

竖版切片里,演员贴在画面边缘

症状
裁切函数的六项测试全过;成片抽六帧检测,有脸的四帧里三帧演员被切到边上。
根因
整条切片用了一个静态裁切中心。源片缩放后,竖版窗口只覆盖画面两成多,而演员在几十秒里跨镜头移动,单个中心必然跟丢
教训
验收标准写的是「人不在画面边缘」,那就得真的去测人在哪儿——而不是测函数返回了一个 0 到 1 之间的数。改成分段裁切后,居中率从四分之一升到三分之三。

长镜头里的候选被静默丢弃

症状
某些素材跑完一条候选都没有,链路却报成功。
根因
切片入出点要吸附到镜头边界。当某个镜头本身比窗口上限还长时,吸附后时长必然超限,于是每个窗口都被悄悄跳过。
教训
长镜头在剧集里很常见。约束之间会互相打架,而「跳过不合法的输入」这种写法,会把打架的结果变成沉默。

类型二

失败伪装成成功

最危险的一类。程序没有报错,报告是绿的,数字看起来也合理——只是它们是编出来的。

降级状态自报「一切正常」

症状
某一路识别根本没跑成,结果里那一路的分数是 0,而「降级信号」列表是空的。
根因
那一路失败后返回了一堆空壳记录,列表非空,于是被判定为「有输入」。
教训
使用者看到分数 0 且不在降级列表里,会以为「这段确实没有转折」,真相是「这一路根本没跑成」。分辨「没输入」和「判断为零」正是这个字段存在的唯一理由,而这个 bug 恰好毁掉它的唯一价值。判定「可用」要看内容,不能看列表长度。

语音模型把提示词当成台词吐了回来

症状
没有对白的片段,转写结果里出现了一句完整的中文——内容正是我们喂给模型的那句提示。
根因
模型在静音段会复读提示词,而它给出的「无语音概率」是 0.57,刚好卡在 0.6 的阈值下面,靠置信度拦不住。
教训
候选片段是按画面动作选的,常常台词稀少甚至没有对白——正好是这个失效最容易发生的地方。而下游的文案会引用这句「台词」,直接违反「必须引用真实台词」的输出约定。

语种配错不报错,只是开始编

症状
拿英文素材做测试、却按中文配置跑,静音段吐出了一句视频平台的订阅引导语——训练数据里的东西。
根因
语种是配置项,配错不会抛异常,模型会尽力「翻译」成目标语言,产出流畅、自信、完全虚构的文本。
教训
用对语种时同一段返回空。这类失效没有任何报错可以捕捉,只能靠人知道去查——所以它被写进了代码注释和现场速查。

类型三

降级本身也会出问题

整套系统设计成「任一环节失败都降级继续」。但降级逻辑正确,不等于降级体验正确。

降级太慢,等于卡死

症状
没有配外部接口凭证时,剧情识别阶段「卡住」六分钟以上才继续。
根因
它对两百多帧逐帧发起请求、逐帧超时。降级路径是对的,只是走完要很久。
教训
现场演示时,凭证没配或额度用尽会被当成程序挂了,没人会等六分钟去验证它其实在正常降级。降级必须是快的。改成连续失败五次即熔断后,六分钟变成三十秒。

类型四

不改变行为,只改变外观

这类问题不会让任何测试变红,因为它不改变任何代码行为。它改变的是别人看到的东西。

官网截图会随系统外观翻转

症状
重新生成本站的界面截图时,整批从亮色变成了暗色。
根因
无头浏览器跟随宿主机器的深浅色偏好,而那天恰好是晚上、系统切到了深色。
教训
站点是主题自适应的,静态截图却只能是一个主题。不固定它,就意味着网站外观取决于「谁在什么时候跑了一次生成脚本」。已强制固定并加了回归测试。

一条 CSS 简写吃掉了所有版块间距

症状
页面各章节挤在一起,看起来只是「有点紧」,不像 bug。
根因
容器类里的内边距简写,特异性高于版块的元素选择器,把纵向间距整个覆盖成了零。
教训
这类问题最容易被改回去,因为它看起来不像错误。改成只设左右的单边属性,并加测试守住。

一条贯穿的规律:这些问题没有一个是被单元测试发现的。它们分别是被人工验收、被另一套模型去查结果、被真实素材的耗时、被肉眼看页面发现的。

所以这个项目里测试代码比产品代码还多,但真正起作用的不只是数量——而是每加一层验证,就换一种角度去看同一个东西:函数返回值、成片里人脸的位置、日志里的降级标记、页面上的像素。

Still open

还没解决的。

写出来比藏着有用——被问到时也能直接答。

事项说明
质量基线 最要紧的一项。需要剪辑师标出一集的 Top-5 名场面作为对照。没有它,整套系统能给出分数,却无法回答「找得准不准」——而那正是这个需求要解决的第一个问题。界面已经就绪,是半小时的一次性投入。
语音识别准确率 目前测得的数字来自合成语音,干净、无背景音、无叠音。真实剧集音轨会显著更难,那是乐观上界而非预期值,必须用真实素材重测。
人脸权重授权 预训练权重标注非商用。内部验证不受影响,对外交付前须采购授权、换模型或自训。
说话人分离 权重需先在平台接受用户协议,当前版本明确跳过。
自演进 复核时留下的留用、弃用与原因已在逐条记录,但还没有回路把它们变成判定规则的改进。这是下一阶段的事。