Twelve Labs 这一类“视频语义检索模型”在做什么?
1.. 先把视频拆成一堆“可啃的小块”
典型做法:
-
-
时间上采样
-
把长视频按时间切片,比如每 1~2 秒抽一小段(多帧)。
-
对语音部分做 VAD(Voice Activity Detection),把“有人说话”的片段切出来。
-
-
空间上预处理
-
对每一小段选几帧关键帧,送进图像 / 视频编码器(Vision Transformer、时序 Transformer 或 3D CNN )。
-
对画面中的人脸、文字(OCR)、UI 元素(按钮、输入框、对话框)做额外检测,这些将作为后面高权重信号。
-
-
结果:原本一个一个 MP4,变成了很多“时间片段”,每个片段里有:
-
-
若干帧图像
-
对应的音频片段
-
可能还有屏幕上的文本 / UI 结构
-
2. 把“谁在说话 / 谁出现在画面里”变成向量
这里其实就是多模态联合编码,套路非常 CLIP-ish:
-
-
视觉侧
-
用预训练视觉编码器(ViT + 时序模块)把每个时间片段编码成一个向量v。
-
如果要知道“谁”,会叠加一个人脸识别模型,把同一个人跨帧对齐;对于 PPT 页、logo 等,会用专门的 OCR + layout 识别。
-
-
音频侧
-
语音 → ASR 得到文本;再用文本编码器(类似 BERT / LLM embedding)得到语义向量。
-
同时保留说话人 embedding(speaker embedding),标记“哪个人”在说话。
-
-
文本侧(字幕、PPT 内容)
-
把字幕、屏幕上的文字、PPT OCR 出来的文本,统统丢给同一个文本编码器,得到向量 t。
-
-
多模态融合
-
常见做法:把同一时间片段的视觉向量 v、音频文本向量和屏幕文本向量拼在一起,用一个小 Transformer 做融合,得到一个统一的视频片段 embedding z。
-
这一步是“统一向量空间”的关键:所有模态都映射到同一个 d 维空间里,语义对齐。
-
-
这时,每几秒视频就变成一个向量,可以把它看成一颗“视频 token”。
3. 训练:让“查询”和“片段向量”在同一语义空间对齐
怎么做到“自然语言一问,就能在长视频里精确跳到某一片段”?
-
-
构造正负样本(对比学习)
-
正样本:用户查询(或人工写的描述) ↔ 真正相关的视频片段。
-
负样本:同一个 batch 里其他不相关片段统统当负例。
-
loss 就是 CLIP 那套 InfoNCE:让相关的 query–clip 距离更近,不相关的更远。
-
-
训练查询编码器
-
再搞一个文本编码器 Eq(query)E_q(\text{query}),把自然语言检索语句编码成向量 qq。
-
训练时,强迫 qq 靠近正确片段的 z+z^+,远离同批里的其他 z−z^-。
-
-
无监督 / 弱监督增强
-
对于没有人工标 query 的视频,可以用标题、描述、章节标题、自动摘要等粗粒度文本作为弱监督,使得整段视频的 embedding 跟这些文本对齐。
-
再加上一些“自监督任务”:例如预测下一片段、判断两个片段是否相邻、是否同一场景等等,让模型对时间结构更敏感。
-
-
训练完之后就得到:
一个统一空间:自然语言 query 向量和“几秒钟的视频片段向量”可以直接算相似度。
4. 语义在系统里是怎么用的?
有了那串视频语义向量:
-
-
检索
-
用户问:“主持人第一次提到价格折扣是哪一段?”
-
把 query 编成 qq,在所有 ziz_i 里算相似度,top-k 就是候选片段,直接 seek 到对应时间位置播放。
-
这就是“可检索的视频 token”。
-
-
自动摘要 / 分章节
-
用这些片段向量做聚类:相似 ziz_i 合并成“主题段落”。
-
每个簇再送进 LLM 总结,就变成“这一分钟大概在讲什么”。
-
拼起来就是自动生成的大纲 / 章节标题。
-
-
时间轴上的“语义字幕条”
-
UI 上可以把每个片段的主题、主要人物、动作用文字标出来,让用户在时间轴上“按含义快进”——这就是你那句“加一层语义字幕”的产品形态。
-
-
小结
像 Twelve Labs 这一类的视频理解系统,做的事情大致是:先把长视频切成一小段一小段,每一段同时看画面、听声音、读字幕和屏幕上的文字,再用一个多模态编码器把这些信息“压”成一个向量。可以把这个向量理解成几秒钟视频的“语义指纹”:谁在说话、画面上是谁、在做什么动作、PPT 翻到哪一页,都被揉进了这一串数字里。整条视频就变成了一串这样的“视频 token”,后端只要拿自然语言问题来跟它们对比相似度,就能做检索、分章节甚至自动生成摘要。