System Architecture
这套系统不是围绕「能识别什么」组织的,是围绕「怎么在三十分钟内只识别该识别的那部分」组织的。先用最便宜的一路信号粗筛出候选范围,三路重识别只跑那个范围,最后在一个可解释的加权判定处收敛。原始素材全程不出这台机器。
System Map
左边是一集没人看过第二遍的正片,右边是若干条带文案、带封面、带判据的切片。中间四段流水线,每一段都产出可以打开检查的文件,而不是只留在模型里的印象。底部那条轨是四路信号——它不是流水线的旁注,而是流水线真正在生产的东西。
总体架构图(窄屏可横向滚动)
.mp4.mov / .mxf45min720P 起refs明星参考照 每位 1~3 张transcode480P 代理流shots镜头分割motion帧间差分序列scoring降级态,只用视觉动作一路snap入出点吸附到镜头边界top-n按最小间隔去重asr台词转写 · 本机vision剧情识别 · 接口faces人脸归属 · 本机scoring终评 · 四路加权render双版切片 + 封面copywriting引用真实台词FOUR SIGNALS · 流水线真正在生产的东西
情绪词命中密度。语速与音量是 P1。
← asr帧间差分 + 镜头切换密度 + 动作标签。
← motion · shots · vision整条轨迹投票定身份,不做单帧判定。
← faces场景标签的变动率。音乐起止是 P1。
← vision为什么②和③之间要多打一遍分。「只识别候选范围」和「打分需要这些信号」互为前提——不先打分就不知道该识别哪里,不先识别就打不出分。
解法是让最便宜的那一路先单独跑一遍:视觉动作只需要帧间差分和镜头边界,不调任何模型。用它圈出候选,三路重识别只跑那个范围,第二遍再带着全部信号重打。全片 613 个镜头,人脸只跑其中约 100 个。
Degradation
现场演示最怕的不是效果差,是中途报错停住。所以每一路识别都有对应的降级行为,自动触发,不需要人工干预。
| 触发条件 | 降级行为 | 对结果的影响 |
|---|---|---|
| 剧情识别不可用 | rule_only |
视觉动作只用帧间差分与切换频率;场景转折那一路标记为降级 |
| 人脸不可用 / 无参考照 | binary_lead_presence |
主演在场退化为二值;「明星高光」预设失去主导信号 |
| 文案模型不可用 | template_fill |
模板填充并标记待复核,等人工改写 |
降级会明说,不假装判断过。某一路信号没有输入时,结果里标明这一路处于降级状态,而不是给它记 0 分。
这两件事看起来一样,含义完全不同:「没输入」是缺料,「判断为零」是结论。混在一起的分数不能用来做决定——使用者会以为「这一段确实没有转折」,而真相是「这一路根本没跑成」。
Stage Map
阶段之间靠文件交接,每一步的中间产物都能单独打开检查。这也是为什么调完权重只需重算最后一步——上游产物直接读缓存,实测 0.3 秒。
| 阶段 | 职责 | 产物 | 48.9 分钟素材实测 |
|---|---|---|---|
transcode | 介质校验 · 480P 代理流 | proxy.mp4 | 76 s |
shots | 镜头分割,全链路的时间轴基准 | shots.json | 30 s |
motion | 帧间差分时间序列,整片算一次 | motion.json | 28 s |
asr | 台词转写 · 词级时间戳 | asr.json | ~180 s |
vision | 关键帧剧情识别 | vision.json | ~300 s |
faces | 人脸检测 · 轨迹投票定身份 | faces.json | ~120 s |
scoring | 四路信号加权,候选搜索与边界吸附 | scoring.json | <1 s |
First Principles
这些不是代码风格,是这个系统之所以成立的前提。绕过任何一条,剩下的部分都会失去意义。
01 · 护城河
开源切片项目走的都是「语音转文本 → 大模型找金句」,服务的是信息密度在语音里的内容。剧集的爆点在画面里。照搬的结果是找到一堆话密的片段,漏掉所有名场面。开源能给的是转码、字幕、镜头分割这些工程件,判断标准得自己来。
02 · 燃料
人工复核的留用与弃用,是这套系统将来学会自己判断的唯一训练标签来源。没有原因字段,攒再多操作记录也归纳不出规则。代码里对这个字段做了断言,不是防御性编程。
03 · 成本
识别阶段全跑 480P,只在最终渲染时回到原始分辨率。单这一项就让识别耗时降一个数量级——这是算力问题最划算的解法,不用等硬件。