从原型到生产:构建多模态视频搜索引擎

发布: (2026年1月6日 GMT+8 18:46)
3 分钟阅读
原文: Dev.to

Source: Dev.to

概览

在上一篇文章中,我通过组合 CLIPWhisperArcFace,利用模型堆叠的方式实现了媒体搜索,能够通过视觉描述、对话和人脸来定位视频内容。假期期间,我把那个下午的 hack 改造成了一个更适合生产环境的系统。

在线演示

  • 演示站点:(桌面浏览器)
  • 入门代码:

示例工作流

  1. 视觉内容 标签页中,输入 “older man on phone, harbor background” → 点击 +
  2. 点击坐在港口旁、戴眼镜的那位年长男子的脸部。
  3. 对话(语义模式) 标签页中,输入 “Americans had launched their missiles” → 点击 +
  4. 播放生成的剪辑。

你已经在不依赖元数据、时间码或精确措辞的情况下,精准定位到目标镜头。语义搜索是模糊匹配的——例如,转录文本写的是 “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 提供了大量帮助。
Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…