视频分析工具
此项目的初始自述文件。
特性
此工具的计划功能如下
- 将视频中的语音音频转录为文本脚本
- 回答用户关于视频内容的询问
- 目标检测
- 视频字幕生成
- 文本提取
- 图形/图表提取
建筑
请参阅 设计.md 有关集成管道的更多详细信息,请参阅文件。
模型
AI管道中使用的模型包括:
- OpenVINO/双元音-arge-v3-int8-ov -该模型托管在处理语音识别的ASR MCP上。
- YOLOv8n -该模型托管在YOLO MCP上,该MCP处理视频帧内的对象检测。
- 句子转换器/全MiniLM-L6-v2 -该模型是用于构建Vector存储的文本嵌入模型。
- Qwen/Qwen3-0.6B -该模型是整个应用程序的主要LLM驱动程序。
先决条件
您将需要:
- 操作系统:Windows 10/11
- Python 3.14
- pnpm 10.19.0
- 节点 22.21.0
- FFmpeg (视频/音频处理所需)
- 下载地址:https://ffmpeg.org/download.html - 必须在系统PATH中
- 协议编译器
手动构建说明
构建视频分析师Tauri应用程序
只需在视频分析应用程序目录中运行以下命令:
pnpm tauri dev设置python环境
在中运行以下命令 video-anlayst-backend 构建一个python环境。
python -m venv video-analyst-env在启动后端服务器python脚本之前,您必须激活视频分析环境。为此,请激活python环境。
.\video-analyst-env\Scripts\activate如果这是您第一次创建此python环境,请根据 requirements.txt 在 video-analyst-backend:
pip install -r requirements.txt有关更多构建说明,请参阅 BUILD_COMMANDS.md 文件。
从gRPC原型文件生成python脚本
要为python后端生成protobuf,请从视频分析后端目录运行以下命令:
python -m grpc_tools.protoc -I./proto --python_out=. --pyi_out=. --grpc_python_out=. ./proto/video_analyst.proto注意:在运行此命令之前,请确保您已激活python环境。
下载所需型号
运行以下python脚本在本地下载模型:
./video-analyst-backend/download_models_local.py部署构建说明
您可以关注 部署_部署.md 文件。
如何使用?
手动启动
在中运行以下命令启动后端服务 video-analyst-backend 目录:
python start_server.py然后,在中运行以下命令启动Tauri应用程序 video-analyst-app 目录:
pnpm tauri dev可执行文件开始
如果已运行部署脚本以获取可执行文件,则可以运行.exe程序。
- 启动应用程序后:
a) 该应用程序将首次要求您上传一个1分钟的.mp4视频文件。 仅支持.mp4文件。不支持其他视频文件 b) 如果有以前的会话,应用程序将直接加载到聊天界面,显示过去的聊天会话。您可以点击“+”按钮开始上传新视频进行分析。
- 等待视频预处理完成。
- 视频预处理完成后,您可以继续与助手聊天。
已知问题
- “未找到ffmpeg”
- 从以下位置安装ffmpeghttps://ffmpeg.org/download.html - 将ffmpeg添加到系统PATH - 重新启动终端/命令提示符
- “无法解决导入问题”
- 安装缺少的依赖项: pip install -r requirements.txt 或 - 使用基本版本: python run_basic.py 相反
- 转录不起作用
- 在开发过程中,OpenVINO优化的蒸馏Whisper模型最初是通过将设备设置为“cpu”加载到RAM上的。然而,在整个开发过程中,当切换到“cuda”以获得更快的测试时间时,这使得张量都在gpu张量中,而gpu张量不适用于此OpenVINO转换的量化蒸馏Whisper模型。
- 视频内容提取不准确
- 目前,整个流程依赖于YOLO MCP生成并添加到矢量存储中的字幕。最初的计划是将音频转录与视频每个块的摘要字幕数据相结合。 - 由于转录此时不起作用,用于建立载体存储的上下文比最初预期的要有限得多。
我学到了什么?
大型LLMs与本地量化LLMs
我已经构建了几个GenAI应用程序,但它们主要依赖于现有的API端点与更大的LLM通信,如anthropic的Claude-Sonnet和OpenAI的ChatGPT4o。我有幸通过这些LLM进行推断,以实现许多高度可实现的产出。HuggingFace模特不被允许是有原因的,但我现在不能分享。有了HuggingFace模型,这就打开了大量微调、量化的模型,这使得为这项任务选择合适的模型变得更加困难。在寻找各种嵌入和Transformer库之间的正确兼容性方面吸取了很多经验教训。
gRPC
我过去的很多开发经验都要求我构建REST API端点。这不是我第一次看到远程过程调用。我见过它在各种硬件到软件端点通信以及游戏引擎中的网络中的使用。但是,重新拿起它来为这个应用程序开发gRPC管道,可以作为对方法论的复习和补充。
锈
我在2018年左右尝试过Rust,但由于我参与的大量项目都使用了C++,所以我没有使用它。重新学习语言并适应借用检查器机制的想法无疑是一个挑战。
视频分析管道
设计管道最困难的部分之一是弄清楚如何在没有CLIP的情况下将视频分割到Vector存储中。我在设置通过OpenVINO优化的量化CLIP时遇到了问题。由于时间有限,我决定使用非多模态方法来处理这个管道,即用YOLO为帧添加字幕,将文本字幕处理成构建矢量存储。通过这种方法,我了解了在决定构建向量存储的最佳分块方法时的局限性和复杂性。决定是按固定帧数/秒对其进行分块,还是添加另一个MCP代理,该代理将使用用于分块的剪辑标记来确定包含口语单词的视频片段。我个人认为,目前在我的管道中实施的方法是最不理想的方法,可以改进。您可以参考 需要改进的地方 本文档的一节。
需要改进的地方
AI管道
最初,我想构建这个应用程序,以便在所有支持OpenVINO的型号中从我的Intel CPU运行。然而,我在开发过程中遇到了python模块兼容性问题以及可用RAM有限(约4GB)。推理速度无法在规定的截止日期内进行开发和测试。所以我不得不换成CUDA支持的pytorch,以加快推理速度和开发时间。
如果我有更多的时间,我会重新审视管道,用OpenVINO支持的模型替换模型,以真正实现量化模型的正确交付。
此外,我认为与依赖YOLOv8n进行准确的对象检测相比,使用多模式嵌入可能会实现更好的Vector数据存储内容摄取(只是发现它不太可靠)。我会:
- 将文本嵌入模型替换为转换为OpenVINO IR格式的CLIP模型,以处理传入的图像帧以及来自ASR模型的文本转录。
- 保留YOLOv8n,但我不会生成标题,而是获取检测到的对象的边界框,并将这些裁剪的边界框传递给SmolVLM或MobileVLM等VLM。(如果OpenVINO支持SmolVLM2会更好,但遗憾的是,python模块版本不匹配,阻碍了Optimum支持SmolVLS2转换为IR)
- 将最终的Qwen LLM替换为SmolVLM2或MobileVLM,以处理图像+文本上下文以及用户查询。这也将允许用户传递CLIP可以摄取的相关图像,以基于用户提交的图像获得更相关的上下文。
- 如果我有更多的时间,我会实现文档生成MCP。事实上,在整个后端连接到gRPC服务器之前,我最初写了一个。然而,在整合开发之后,它被遗漏了。
- 另一个专用于日记化的MCP服务器。在ASR模型的基础上,我认为集成日记化模型来检测和识别视频中的多个人会很有趣。
- 另一个专用于OCR的MCP服务器。我认为让VLM MCP执行相同的操作就足够了,而不是托管另一个AI模型。
- 为了进一步优化内存占用,我会在提取内容时对YOLO模型和转录模型进行清理。除非需要与待集成的视频助手进行特定的MCP交互。
提示
我只有时间写出基本的系统提示,并将用户查询附加到检索到的上下文之上,以便Qwen LLM继续进行。我会创造:
- 基于ReACT的提示,允许Qwen LLM进一步动态访问我为初始预处理步骤之外的进一步分析准备的MCP服务器。
- 在用户查询和主服务器之间添加了特定的护栏,以确保LLM不会接收到恶意或有毒的查询。
硬件
如果我有更多的时间和硬件可用性,我会探索所有潜在的优化方法并构建脚本,以确保应用程序能够最佳地部署到目标硬件。考虑到我上面讨论的对所需管道的调整,我只是没有足够的RAM来处理基于CPU的推理。
部署
我制作了自动化脚本来构建后端和前端应用程序的可部署可执行格式。然而,准备集成到Github Actions中的脚本会更加顺利,这将有助于构建这个项目,并部署在单个可执行包以及CI/CD管道方法中。
