资讯动态

video-analyzer:用 Llama 3.2 Vision 与 Whisper 构建本地视频理解流水线的完整实践

发布时间:2026/10/14 17:25:40 来源:尧图企业网站定制
人工智能AI 应用大模型计算机视觉语音本地部署视频处理【免费下载链接】video-analyzerAnalyze videos using LLMs, Computer Vision and Automatic Speech Recognition项目地址https://gitcode.com/gh_mirrors/vi/video-analyzer点击查看免费下载本文基于开源项目 video-analyzer 的主包文档展开完整讲解其关键帧提取 语音转写 → 视觉 LLM 逐帧分析 → 视频整体重建描述的三阶段处理流水线并覆盖安装步骤、全部命令行参数、三级级联配置体系、JSON 输出结构与基于 DSPy 的提示词自动调优流程。读完后可在本地或任意 OpenAI 兼容 API 上搭建一条开箱即用、完全可配置的视频分析管线。项目定位与核心特性video-analyzer 是一个结合视觉语言模型如 Llama 3.2 11B Vision与 OpenAI Whisper 的视频分析工具从视频中抽取关键帧送入视觉模型获取画面细节再把逐帧描述与可选的语音转写文本综合成一段完整的视频内容描述。README 列出的核心特性如下 可完全本地运行不依赖云服务或 API Key☁️ 也可接入任意 OpenAI API 兼容的 LLM 服务OpenRouter、OpenAI 等以获得速度与时扩展性 基于帧差的关键帧智能提取 使用 Whisper 完成高质量语音转写️ 通过 Ollama 与 Llama3.2 11B Vision 模型完成帧分析 输出自然语言形式的视频内容描述 自动处理低质量音频 输出详细的 JSON 分析结果⚙️ 通过命令行参数或配置文件高度可配置。依赖见 requirements.txtopencv-python、numpy、torch、openai-whisper、faster-whisper、requests、Pillow、pydub等setup.py 通过console_scripts入口注册了video-analyzer命令指向 video_analyzer/cli.py 的main。三阶段处理架构README 将系统描述为三个阶段以下逐阶段结合源码说明其实现细节。阶段一帧提取与音频处理帧提取由 video_analyzer/frame.py 中的VideoProcessor.extract_keyframes实现算法要点目标帧数计算target_frames 视频时长(分钟) × frames.per_minute内置默认配置为每分钟 60 帧并受视频总帧数与max_frames约束至少为 1自适应采样以total_frames // (target_frames × 2)为步长扫描采样密度高于目标以积累足够候选帧差分析将候选帧转灰度后用cv2.absdiff求平均差异超过类常量FRAME_DIFFERENCE_THRESHOLD 10.0的进入候选集与配置项frames.analysis_threshold的默认值 10.0 一致最终选择按差异分取 Top N再按帧号重排恢复时间顺序逐帧保存为output/frames/frame_N.jpg。若指定了max_frames且候选更多则在候选中均匀采样例如 5 分钟视频取 5 帧约等于每分钟 1 帧而不是取前 5 帧。音频处理由 video_analyzer/audio_processor.py 的AudioProcessor完成先用 FFmpeg 抽取音频为 16kHz、单声道、pcm_s16le的 WAV 文件视频无音轨时FFmpeg 报 Output file does not contain any stream直接跳过转写FFmpeg 失败时回退到 pydub转写使用faster-whisper参数为beam_size5、开启 VAD 过滤min_silence_duration_ms500、启用词级时间戳--language指定的语言会先对照内置语言白名单校验非法代码自动回退到自动检测无有效语音或转写异常时返回None主流程会打印 Could not generate reliable transcript. Proceeding with video analysis only. 并继续纯视觉分析——这正是 README 所说自动处理低质量音频的落地方式。阶段二逐帧分析video_analyzer/analyzer.py 的VideoAnalyzer.analyze_frame对每个帧调用一次视觉模型提示模板为 frame_analysis.txt通过替换{PREVIOUS_FRAMES}占位符注入此前所有帧的分析文本使模型在时间轴上保持上下文连续用户通过--prompt传入的问题经_format_user_prompt加前缀 I want to know … 后注入{prompt}占位符提示末尾追加 This is frame {N} captured at {T} seconds. 标明帧序号与时间戳帧图片经 LLMClient.encode_image 做 Base64 编码后随请求发送num_predict固定为 300temperature取自配置。模板本身是一套结构化的帧笔记指令要求模型依次记录 Setting/Scene、Action/Movement、New Information、Continuity Points并以 Key continuation points 列出供后续帧关注的 2–3 个元素用现在时态、避免主观推断。阶段三视频重建analyzer.py 的 reconstruct_video 将阶段二的产物综合为最终描述提示模板为 describe.txt依次替换{FRAME_NOTES}全部帧笔记按时间顺序、带帧号与时间戳、{FIRST_FRAME}第一帧分析文本、{TRANSCRIPT}语音转写全文与{prompt}用户问题该次调用不附带图片num_predict为 1000模板要求模型以首帧分析建立开场、按时间顺序推进叙事、纳入音频信息并给出一份提交前自查清单无矛盾、元素齐全、未看过视频的人也能读懂等。更完整的设计与修改指南见 docs/DESIGN.md。项目结构主包目录布局README 目录项之一对应仓库实际结构video-analyzer/ ├── video_analyzer/ # 主包 │ ├── cli.py # 命令行入口与三阶段编排 │ ├── config.py # 级联配置与客户端/模型解析 │ ├── frame.py # OpenCV 关键帧提取 │ ├── audio_processor.py # 音频抽取与 Whisper 转写 │ ├── analyzer.py # 逐帧分析与视频重建 │ ├── prompt.py # 提示词加载器 │ ├── clients/ # ollama.py / generic_openai_api.py / llm_client.py │ ├── config/default_config.json # 内置默认配置 │ └── prompts/frame_analysis/ # 默认提示模板frame_analysis.txt / describe.txt ├── video-analyzer-tune/ # DSPy 提示词自动调优子包 ├── video-analyzer-ui/ # Web UI 子包 ├── docs/ # USAGES / DESIGN / 示例输出 ├── setup.py └── requirements.txt三阶段的编排逻辑集中在 cli.py 的 main按--start-stage判断依次执行 Stage 1音频帧提取、Stage 2逐帧分析、Stage 3视频重建结果写入output/analysis.json最后根据keep_frames决定是否调用cleanup_files清理frames/与audio.wav临时文件。环境要求与安装系统要求Python 3.11 或更高版本setup.py 中python_requires声明为3.8以 README 的 3.11 为推荐前提FFmpeg音频处理必需本地运行 LLM 时使用 OpenRouter 等云服务时不需要至少 16GB 内存推荐 32GBGPU 显存至少 12GB或 Apple M 系列芯片且内存至少 32GB。安装步骤克隆仓库git clone https://gitcode.com/gh_mirrors/vi/video-analyzer.git cd video-analyzer创建并激活虚拟环境python3 -m venv .venv source .venv/bin/activate # Windows 下为 .venv\Scripts\activate安装包pip install . # 常规安装 # 或 pip install -e . # 开发模式安装安装 FFmpeg# Ubuntu/Debian sudo apt-get update sudo apt-get install -y ffmpeg # macOS brew install ffmpeg # Windows choco install ffmpegOllama 配置本地视觉模型按 Ollama 官方说明安装 Ollamaollama.ai拉取默认视觉模型ollama pull llama3.2-vision启动服务ollama serveOpenAI 兼容 API 配置可选若希望改用 OpenRouter、OpenAI 等 OpenAI 兼容服务从服务提供方获取 API Key通过命令行配置# OpenRouter video-analyzer video.mp4 --client openai_api --api-key your-key --api-url https://openrouter.ai/api/v1 --model gpt-4o # OpenAI video-analyzer video.mp4 --client openai_api --api-key your-key --api-url https://api.openai.com/v1 --model gpt-4o或写入工作目录下的config/config.json{ clients: { default: openai_api, openai_api: { api_key: your-api-key, api_url: https://openrouter.ai/api/v1 } } }注意README 提示在 OpenRouter 上为模型名追加:free可免费使用 llama 3.2 11b vision。客户端的创建逻辑见 cli.py 的 create_clientclients.default为ollama时构造 OllamaClient调用/api/generate为openai_api时构造 GenericOpenAIAPIClient调用{api_url}/chat/completions内置 3 次重试、429 时读取Retry-After头等待。配置缺失校验在 config.py 的 get_clientopenai_api缺少api_key或api_url会抛出ValueError。使用指南完整的参数说明与更多用例见 docs/USAGES.md。快速开始# 本地分析默认 Ollama video-analyzer video.mp4 # 云端分析OpenRouter video-analyzer video.mp4 \ --client openai_api \ --api-key your-key \ --api-url https://openrouter.ai/api/v1 \ --model meta-llama/llama-3.2-11b-vision-instruct:free # 自定义提示词 更大 Whisper 模型 video-analyzer video.mp4 \ --prompt What activities are happening in this video? \ --whisper-model large全部命令行参数参数说明默认值示例video_path输入视频文件路径必填video.mp4--config配置目录路径config/--config /path/to/config/--output分析结果输出目录output/--output ./results/--clientLLM 客户端ollama 或 openai_apiollama--client openai_api--ollama-urlOllama 服务地址http://localhost:11434--ollama-url http://localhost:11434--api-keyOpenAI 兼容服务的 API Key无--api-key sk-xxx...--api-urlOpenAI 兼容 API 地址无--api-url https://openrouter.ai/api/v1--model视觉模型名llama3.2-visionOllama--model gpt-4-vision-preview--duration处理的视频时长秒无整段视频--duration 60--keep-frames分析后保留提取的帧False--keep-frames--whisper-modelWhisper 模型尺寸或本地模型路径medium--whisper-model large--start-stage起始处理阶段1–31--start-stage 2--max-frames处理的最大帧数指定后在候选帧中均匀采样而非只取前 N 帧sys.maxsize--max-frames 100--log-level日志级别DEBUG/INFO/WARNING/ERROR/CRITICALINFO--log-level DEBUG--prompt关于视频的问题--prompt What activities are shown?--language转写语言由配置决定内置默认en不传则按配置自动检测--language es--deviceWhisper 运行设备cpu--device cuda--temperatureLLM 生成温度0.2内置默认配置为0.0--temperature 0.2参数与配置的映射并非简单同名覆盖config.py 的 update_from_args 实现了若干特化规则值得注意--api-key单独出现未显式--client时会自动把默认客户端切换为openai_api--model写入的是当前默认客户端的model字段即它同时兼容 Ollama 模型名与 OpenRouter 模型名--whisper-model/--language/--device写入audio子配置--temperature写入clients.temperature--start-stage、--max-frames属于纯命令行参数不落配置。处理阶段--start-stage控制从哪个阶段开始便于断点续跑帧与音频处理帧分析视频重建。例如先跑完阶段一再中断可用video-analyzer video.mp4 --start-stage 2 --max-frames 50 --keep-frames从帧分析阶段继续前提是--keep-frames保留了帧文件。配置系统README 说明工具采用级联配置命令行参数优先级最高其次是用户配置工作目录下的config/config.json最后是默认配置。从 config.py 的源码看其具体语义是若存在用户config.json则整体加载该文件而非与内置默认逐项合并找不到用户配置时才回退到内置的 default_config.json先查--config目录再回退到安装包内的副本命令行参数随后覆盖对应字段。内置默认配置 video_analyzer/config/default_config.json 全文如下以仓库实际文件为准{ clients: { default: ollama, temperature: 0.0, ollama: { url: http://localhost:11434, model: llama3.2-vision }, openai_api: { api_key: , model: meta-llama/llama-3.2-11b-vision-instruct, api_url: https://openrouter.ai/api/v1 } }, prompt_dir: prompts, prompts: [ { name: Frame Analysis, path: frame_analysis/frame_analysis.txt }, { name: Video Reconstruction, path: frame_analysis/describe.txt } ], output_dir: output, frames: { per_minute: 60, analysis_threshold: 10.0, min_difference: 5.0, max_count: 30, start_stage: 1, max_frames: 2147483647 }, response_length: { frame: 300, reconstruction: 1000, narrative: 500 }, audio: { whisper_model: medium, sample_rate: 16000, channels: 1, quality_threshold: 0.2, chunk_length: 30, language_confidence_threshold: 0.8, language: en, device: cpu }, keep_frames: false, prompt: }各字段含义客户端设置clientsclients.default默认 LLM 客户端ollama/openai_apiclients.temperature生成温度0.0–1.0越高越有创造性clients.ollama.url/clients.ollama.modelOllama 服务地址与视觉模型名clients.openai_api.api_key/api_url/modelOpenAI 兼容服务的 Key、端点与模型名。帧分析设置framesper_minute每分钟目标提取帧数直接决定 extract_keyframes 的目标帧数analysis_threshold关键帧检测阈值与frame.py中FRAME_DIFFERENCE_THRESHOLD10.0一致从源码结构看当前实现直接使用该类常量min_difference/max_count/max_frames帧间最小差异、提取上限与命令行--max-frames对应的默认上限2147483647即不限制。响应长度设置response_lengthframe300/reconstruction1000分别对应 analyzer.py 中逐帧分析与视频重建两次调用的num_predict取值narrative为增强叙述预留的长度配置当前主流程的两阶段提示中未消费该字段。音频处理设置audiowhisper_modelWhisper 模型尺寸tiny/base/small/medium/large或本地模型路径默认mediumsample_rate16000 Hz/channels1与audio_processor.py中 FFmpeg 抽取参数一致language强制语言代码null表示自动检测内置默认值为endeviceWhisper 运行设备cpu/cudaquality_threshold/language_confidence_threshold/chunk_length转写质量与语言置信度相关阈值配置。通用设置prompt_dir自定义提示词目录配合prompts列表使用prompts提示文件清单Frame Analysis与Video Reconstruction分别按索引 0/1 被 analyzer.py 加载output_dir结果输出目录keep_frames是否保留帧图片prompt自定义分析问题。提示docs/USAGES.md 中的示例配置文件为讲解用途个别数值如frames.per_minute: 10、response_length一组值与仓库内置默认值不同实操时以上面的default_config.json实际内容为准。输出分析完成后工具在output_dir默认output/生成analysis.json包含四部分metadata分析元数据——所用客户端、模型、Whisper 模型、frames_per_minute、已处理时长、提取/处理的帧数、起始阶段、音频语言、转写是否成功transcript语音转写如有含全文text与带词级时间戳和概率的segmentsframe_analyses逐帧分析结果每帧的模型响应及 Ollama 返回的统计信息video_description最终视频描述。README 给出的示例输出节选The video begins with a person with long blonde hair, wearing a pink t-shirt and yellow shorts, standing in front of a black plastic tub or container on wheels. The ground appears to be covered in wood chips. As the video progresses, the person remains facing away from the camera, looking down at something inside the tub. ……完整样例见 docs/sample_analysis.json。若不想保留中间文件默认行为会自动删除frames/目录与audio.wav加--keep-frames可保留便于复查帧提取质量或供调优子包使用见下文。提示词模板与提示词调优双模板机制主包默认使用两个提示文件由default_config.json的prompts列表声明frame_analysis.txt每帧调用一次占位符为{PREVIOUS_FRAMES}此前帧笔记与{prompt}用户问题describe.txt末尾调用一次占位符为{FRAME_NOTES}、{FIRST_FRAME}、{TRANSCRIPT}、{prompt}。video_analyzer/prompt.py 的PromptLoader按三级顺序查找提示文件安装包资源pkg_resources→ 包目录开发模式→ 用户prompt_dir目录支持绝对/相对路径。替换全部为纯字符串替换因此任何保留占位符的自定义模板都可以直接替换使用。仓库根目录的 test_prompt_loading.py 验证了包内默认提示 临时目录自定义提示两条加载路径。用 video-analyzer-tune 自动优化提示词仓库内的子包 video-analyzer-tune 提供基于 DSPy MIPROv2 的提示词优化器它把上述两个提示包进一条与主包逻辑一致的 DSPy 流水线用 LLM-as-judge 对候选提示打分1–5 分最终描述质量按--description-weight加权自动找到更优的指令文本并写成新的.txt文件——主包不受任何影响只需在配置中指向新文件。工作流程摘自 video-analyzer-tune/README.md对若干代表性视频运行分析并保留帧pip install video-analyzer-tune video-analyzer my_video.mp4 --keep-frames编辑output/analysis.jsonvideo_description.response必须改为理想的最终描述建议同时逐条编辑frame_analyses[i].response为理想的帧笔记两级都给出样例信号更强创建training_data.json每个视频一条记录{ examples: [ { output_dir: output/video1 }, { output_dir: output/video2 } ] }运行调优器video-analyzer-tune --training-data training_data.json --output-dir tuned_prompts/将打印出的配置片段贴入config/config.json之后video-analyzer即自动使用调优后的提示prompt_dir: tuned_prompts, prompts: [ {name: Frame Analysis, path: frame_analysis_tuned.txt}, {name: Video Reconstruction, path: describe_tuned.txt} ]调优器常用 CLI 参数参数默认说明--training-data必填training_data.json 路径--output-dirtuned_prompts调优提示输出目录--clientollamaollama或openai_api--modelllama3.2-vision优化运行使用的视觉模型--num-candidates10每个模块生成的提示变体数5–20--num-trials20优化试验次数10–50--description-weight0.7最终描述质量在总分中的权重0.0–1.0其余权重给帧分析质量--log-levelINFO日志级别官方建议使用 3–5 个风格多样的视频样例、同时编辑帧笔记与最终描述、调优与推理使用同一模型。卸载、协议与贡献卸载pip uninstall video-analyzer项目采用 Apache License见 LICENSE。贡献流程审阅设计、通过 GitHub Discussions 提议变更、提交 PR见 docs/CONTRIBUTING.md。小结video-analyzer 的价值在于把视频理解拆成了三条可独立配置、可断点续跑的管线OpenCV 帧差关键帧提取、faster-whisper 语音转写、视觉 LLM 的双提示词分析-重建。默认全本地Ollama llama3.2-vision Whisper medium即可运行需要规模或更强模型时切换--client openai_api一行即可。所有行为——帧密度、Whisper 模型与设备、温度、输出目录、提示词——都通过命令行 用户配置 内置默认的级联体系收敛配合video-analyzer-tune还可以把提示词针对自有内容自动化调优构成一条从部署到定制的完整闭环。赞分享人工智能AI 应用大模型计算机视觉语音本地部署视频处理【免费下载链接】video-analyzerAnalyze videos using LLMs, Computer Vision and Automatic Speech Recognition项目地址https://gitcode.com/gh_mirrors/vi/video-analyzer点击查看免费下载相关推荐video-analyzer 设计深解关键帧提取、Whisper 转写与视觉 LLM 视频重建的完整技术管线video analyzer 设计深解关键帧提取、Whisper 转写与视觉 LLM 视频重建的完整技术管线 本文基于仓库内的设计文档 docs/DESIGN人工智能AI 应用大模型计算机视觉语音本地部署视频处理用 Llama 3.2 Vision 构建 100% 本地运行的 OCR 应用Ollama 模型服务与 Streamlit 界面实战用 Llama 3.2 Vision 构建 100% 本地运行的 OCR 应用Ollama 模型服务与 Streamlit 界面实战 本指南围绕开源仓库 ai示例工程Daft 音频转写实践用 Whisper 构建列式数据与本地文件两条批量转写流水线Daft 音频转写实践用 Whisper 构建列式数据与本地文件两条批量转写流水线 本文基于 Daft 官方示例文档 docs/examples/audio大数据数据分析数据工程AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑