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

发布: (2026年1月6日 GMT+8 18:46)
3 min read
原文: 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

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

技术是赋能者,而非救世主

为什么思考的清晰度比你使用的工具更重要。Technology 常被视为一种魔法开关——只要打开,它就能让一切改善。新的 software,...

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...