从原型到生产:构建多模态视频搜索引擎
发布: (2026年1月6日 GMT+8 18:46)
3 min read
原文: Dev.to
Source: Dev.to
概览
在上一篇文章中,我通过组合 CLIP、Whisper 和 ArcFace,利用模型堆叠的方式实现了媒体搜索,能够通过视觉描述、对话和人脸来定位视频内容。假期期间,我把那个下午的 hack 改造成了一个更适合生产环境的系统。
在线演示
- 演示站点:(桌面浏览器)
- 入门代码:
示例工作流
- 在 视觉内容 标签页中,输入 “older man on phone, harbor background” → 点击 +。
- 点击坐在港口旁、戴眼镜的那位年长男子的脸部。
- 在 对话(语义模式) 标签页中,输入 “Americans had launched their missiles” → 点击 +。
- 播放生成的剪辑。
你已经在不依赖元数据、时间码或精确措辞的情况下,精准定位到目标镜头。语义搜索是模糊匹配的——例如,转录文本写的是 “What it was telling him was that the US had launched their ICBMs”,而查询仍然能够匹配。
架构
- 前端: 由 Nginx 提供服务的 Vue.js
- 后端: FastAPI
- 摄取工作进程: 独立进程,轮询新媒体,优雅地处理磁盘挂载/卸载(Watchdog 在 NFS/网络共享下不可靠)
- 数据库: 使用 pgvector 扩展的 PostgreSQL,用于向量相似度搜索
所有组件均通过 docker‑compose 编排。
特性
- 后台增强 – 工作进程持续处理新文件,提取视觉、音频和人脸嵌入。
- 语义对话搜索 – 使用 sentence‑transformer 嵌入;如 “Americans launched missiles” 之类的查询能够检索到包含 “US fired rockets” 的剪辑。
- 帧级精确播放 – 通过
requestVideoFrameCallback()将 HTML5 视频解码到 canvas。 - EDL 导出 – 将选中的场景加入队列,导出 CMX 3600 编辑决策列表,以便在 NLE 中往返使用。
- 统一查询 – PostgreSQL + pgvector 使向量相似度与元数据过滤能够在单一查询中完成。
代码
完整的源代码和 Docker 配置可在以下位置获取:
致谢
- 演示素材来自 Pioneer One,这是一部采用 Creative Commons 许可证的加拿大剧集。
- Claude Code 提供了大量帮助。