剧集高光切片引擎 Highlight Clipping Engine

System Architecture

一集正片进来,四路信号出去。

这套系统不是围绕「能识别什么」组织的,是围绕「怎么在三十分钟内只识别该识别的那部分」组织的。先用最便宜的一路信号粗筛出候选范围,三路重识别只跑那个范围,最后在一个可解释的加权判定处收敛。原始素材全程不出这台机器。

7流水线阶段,各自落盘可断点续跑
4信号加权融合,权重外置可现场调
3降级预案,单点失败不中断链路
0原始素材外发,只有文本出域

System Map

一张图:从一集正片到一批可发布切片。

左边是一集没人看过第二遍的正片,右边是若干条带文案、带封面、带判据的切片。中间四段流水线,每一段都产出可以打开检查的文件,而不是只留在模型里的印象。底部那条轨是四路信号——它不是流水线的旁注,而是流水线真正在生产的东西

总体架构图(窄屏可横向滚动)

MEDIA BOUNDARY · 介质不出域 原始素材、代理流、抽帧 —— 全程留在本机,不出这条线;只有文本(台词、场景描述)可外发走接口。
INPUT

一集正片

  • .mp4.mov / .mxf
  • 45min720P 起
  • refs明星参考照 每位 1~3 张
看过一遍就不会再看第二遍的四十多分钟。
STAGE 1 · 拆解

转码与结构化

  • transcode480P 代理流
  • shots镜头分割
  • motion帧间差分序列
proxy.mp4 · shots.json · motion.json 识别全程走代理流,只在渲染回原始源。
实测 613 个镜头 / 48.9 分钟。
STAGE 2 · 粗筛

第一遍打分

  • scoring降级态,只用视觉动作一路
  • snap入出点吸附到镜头边界
  • top-n按最小间隔去重
候选窗口 · 候选镜头 这一遍的分数不是结论,只为圈定范围。
三路识别共用它,不各跑一遍。
STAGE 3 · 识别

三路并行

  • asr台词转写 · 本机
  • vision剧情识别 · 接口
  • faces人脸归属 · 本机
asr.json · vision.json · faces.json 只跑候选范围。台词转全片要 18 分钟,
转候选窗口 3 分钟。
STAGE 4 · 产出

收敛与渲染

  • scoring终评 · 四路加权
  • render双版切片 + 封面
  • copywriting引用真实台词
mp4 ×2 · 封面 · 文案 · 清单 入出点吸附镜头边界。
→ 交人工复核
FEEDBACK · 反哺 oplog 记下每一次 keep / drop / trim。弃用必须带原因——那是这套系统将来学会自己判断的唯一训练标签来源,没有它,攒再多操作记录也归纳不出规则。 P2 · 待建

FOUR SIGNALS · 流水线真正在生产的东西

对白情绪

情绪词命中密度。语速与音量是 P1。

← asr
无台词 → 该路记降级,不记 0 分

视觉动作

帧间差分 + 镜头切换密度 + 动作标签。

← 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.mp476 s
shots镜头分割,全链路的时间轴基准shots.json30 s
motion帧间差分时间序列,整片算一次motion.json28 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,只在最终渲染时回到原始分辨率。单这一项就让识别耗时降一个数量级——这是算力问题最划算的解法,不用等硬件。