基于MCP协议构建视频智能分析工具链:从语音转录到语义搜索
1. 项目概述与核心价值最近在折腾一些视频内容处理相关的自动化工作流发现一个挺有意思的开源项目叫vidnavigator/vidnavigator-mcp-starter。乍一看这个名字可能有点摸不着头脑它其实是一个基于MCPModel Context Protocol的启动器专门为视频导航和分析任务设计的。简单来说它就像是一个“翻译官”和“调度员”能让你的大语言模型比如 ChatGPT、Claude 等直接“看懂”和“操作”视频内容。想象一下这个场景你有一个长达几小时的会议录像、产品演示视频或者在线课程你想快速找到某个特定话题被讨论的片段或者想提取视频中提到的所有关键点并生成摘要。传统做法要么是手动拖进度条要么依赖一些基础的语音转文字工具但后者往往缺乏对视频内容结构的深度理解。vidnavigator-mcp-starter的出现就是为了解决这个问题。它通过 MCP 协议将复杂的视频处理能力如帧分析、语音识别、场景分割、物体检测等封装成一套标准化的“工具”然后暴露给 LLM。这样你只需要用自然语言向 LLM 描述你的需求比如“帮我把视频里所有提到‘预算’的部分找出来并总结每个部分的要点”LLM 就能调用背后的视频工具链自动完成任务。这个项目非常适合内容创作者、知识管理者、研究分析师以及任何需要频繁处理视频信息的人。它不是一个端到端的应用而是一个开发起点或集成组件为开发者提供了将视频智能接入现有 AI 工作流的桥梁。接下来我会深入拆解它的设计思路、核心组件并分享如何从零开始搭建和定制属于你自己的视频导航智能体。2. 核心架构与 MCP 协议解析要理解vidnavigator-mcp-starter首先得弄明白它的基石——Model Context Protocol。MCP 是 Anthropic 提出的一种开放协议旨在标准化大型语言模型与外部工具、数据源之间的交互方式。你可以把它想象成 LLM 世界的“USB 标准”或“插件接口规范”。在没有 MCP 之前每个 AI 应用想要连接不同的数据库、API 或本地工具都需要编写特定的、紧耦合的集成代码非常繁琐且难以复用。MCP 的核心思想是解耦与标准化。它定义了三类核心资源工具供 LLM 调用的函数每个工具都有明确的名称、描述、输入参数和输出格式。例如extract_video_transcript就是一个工具LLM 知道它可以传入一个视频 URL 来获取字幕。资源供 LLM 读取的静态或动态数据比如一个文件的内容、数据库查询的结果。资源通过 URI 标识LLM 可以按需请求读取。提示词模板预定义的对话模板用于引导 LLM 在特定上下文中更好地工作。vidnavigator-mcp-starter项目本质上就是一个MCP 服务器。它实现了针对视频领域的一系列工具和资源并遵循 MCP 协议与 LLM 客户端如 Claude Desktop、第三方 MCP 客户端进行通信。当你在 Claude 的对话框中输入“分析这个视频”时Claude 会通过 MCP 协议向这个服务器发送请求服务器调用本地的ffmpeg、whisper或其他视频处理库执行任务再将结果格式化后返回给 Claude最后由 Claude 组织成自然语言回复给你。这种架构带来了几个显著优势模型无关性只要 LLM 客户端支持 MCP就可以使用这套视频工具不受限于某个特定模型。开发效率开发者只需专注于实现视频处理的后端逻辑无需关心与每个 LLM 的前端集成。可组合性这个视频 MCP 服务器可以和其他 MCP 服务器如文件系统、网络搜索、数据库查询一起工作让 LLM 的能力呈指数级增长。项目的目录结构通常清晰地反映了这一架构vidnavigator-mcp-starter/ ├── src/ │ ├── server.ts # MCP 服务器主入口 │ ├── tools/ # 视频工具实现 │ │ ├── transcribe.ts # 语音转文字工具 │ │ ├── summarize.ts # 视频摘要工具 │ │ └── navigate.ts # 时间戳导航工具 │ └── resources/ # 资源定义如视频元数据 ├── scripts/ # 辅助脚本如安装依赖 ├── build/ # 编译输出目录 ├── mcp.json # MCP 服务器配置文件 └── package.json其中mcp.json是这个服务器的“身份证”定义了它的名称、版本、命令行调用方式以及支持的能力范围。3. 环境准备与依赖部署在开始动手之前我们需要准备好“战场”。这个项目基于 Node.js 生态同时严重依赖一些底层的多媒体处理库。下面是我在 Ubuntu 22.04 和 macOS 上实测通过的部署流程Windows 用户可以通过 WSL2 获得类似体验。3.1 基础运行环境搭建首先确保你的系统已经安装了Node.js版本 18 或以上推荐 LTS 版本和npm或yarn。你可以通过node --version和npm --version来检查。如果没有建议通过nvm来安装和管理 Node.js 版本这样可以灵活切换。接下来是几个关键的系统级依赖它们负责繁重的音视频处理FFmpeg: 音视频处理的“瑞士军刀”用于视频切片、格式转换、帧提取等。这是必须的。# Ubuntu/Debian sudo apt update sudo apt install ffmpeg # macOS (使用 Homebrew) brew install ffmpeg安装后运行ffmpeg -version确认安装成功。Python 3 及 pip: 部分 AI 模型如用于场景检测的可能需要 Python 环境。# 通常系统已自带检查版本 python3 --version pip3 --versionC/C 编译工具链: 用于编译一些 Node.js 原生模块。# Ubuntu/Debian sudo apt install build-essential # macOS xcode-select --install3.2 项目依赖安装与初始化克隆项目代码并安装 Node.js 依赖git clone https://github.com/vidnavigator/vidnavigator-mcp-starter.git cd vidnavigator-mcp-starter npm install # 或 yarn install注意如果安装过程中遇到关于sharp或xenova/transformers等库的错误通常是因为网络问题或缺少系统库。可以尝试设置镜像源或者根据错误信息单独安装系统依赖。例如sharp可能需要libvips。安装完成后项目根目录下的package.json会列出所有依赖。核心依赖可能包括modelcontextprotocol/sdk: 官方 MCP SDK用于构建服务器。whisper-node或类似库用于语音识别ASR。xenova/transformers: 在浏览器或 Node.js 中运行 Hugging Face 模型可能用于零样本分类或嵌入。fluent-ffmpeg: Node.js 的 FFmpeg 包装库让调用更便捷。puppeteer或playwright: 如果项目需要从网页抓取视频可能会用到。3.3 MCP 客户端配置以 Claude Desktop 为例要让这个服务器真正工作起来你需要一个支持 MCP 的客户端。目前最方便的是Claude Desktop应用。定位配置文件macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.jsonLinux:~/.config/Claude/claude_desktop_config.json编辑配置文件如果文件不存在就创建它。然后添加你的vidnavigator-mcp-starter服务器配置。{ mcpServers: { vidnav: { command: node, args: [ /ABSOLUTE/PATH/TO/YOUR/vidnavigator-mcp-starter/build/server.js ], env: { WHISPER_MODEL: base // 可选环境变量指定 Whisper 模型大小 } } } }关键点vidnav是给这个服务器起的任意名字。command和args必须指向你项目编译后的入口文件。通常你需要先运行npm run build来生成build/server.js。env部分可以用来传递环境变量比如指定使用哪个尺寸的 Whisper 模型tiny,base,small,medium,large模型越大精度越高但消耗的内存和时间也越多。重启 Claude Desktop保存配置文件后完全退出并重启 Claude Desktop 应用。在聊天界面如果配置成功你有时会看到一条系统提示或者当你输入“/”时能看到可用的工具列表。实操心得配置文件路径一定要用绝对路径相对路径会失败。另外第一次启动时Claude 会尝试运行你的服务器命令如果 Node 模块或系统依赖有问题可能会在 Claude 的后台日志中报错。在 macOS 上可以通过Console.app查看claude-desktop的日志来排查问题。4. 核心工具链深度解析与实战项目提供的工具是它的灵魂。我们来看看vidnavigator-mcp-starter可能实现了哪些核心视频处理工具以及它们背后是如何工作的。4.1 语音转录工具从声音到文字的结构化提取这是最基础也是最常用的工具我们命名为transcribe_video。它的作用是接收一个视频文件路径或 URL返回带时间戳的完整字幕。内部工作流程输入验证与预处理工具首先检查输入是本地路径还是远程 URL。如果是 URL可能会先调用下载模块。接着使用ffmpeg从视频中提取出纯净的音频流通常是.wav或.mp3格式因为后续的语音识别模型处理音频比处理视频容器更高效。# 类似这样的 ffmpeg 命令在后台执行 ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 output.wav参数解释-vn移除视频-acodec pcm_s16le指定 PCM 编码-ar 16000设置采样率16kHz 是许多 ASR 模型的理想输入-ac 1转为单声道。语音识别将预处理后的音频喂给语音识别引擎。开源首选是OpenAI 的 Whisper。项目可能集成whisper-node或直接调用 Whisper 的 Python 库。模型选择Whisper 有从tiny(约 75MB) 到large(约 3GB) 多个尺寸。对于英文内容base或small在精度和速度上平衡得很好。中文或其他语言small或medium更可靠。这个选择可以通过前面提到的环境变量WHISPER_MODEL控制。运行方式如果追求极致性能并且机器有 GPU可以配置为使用whisper.cpp或支持 GPU 的版本。但对于 starter 项目通常使用 CPU 版本的xenova/transformers来运行 Whisper兼容性最好。后处理与结构化输出Whisper 的输出是带时间戳的片段列表。工具需要将这些片段整理成更易读的格式比如 SRT 字幕格式或一个结构化的 JSON 数组每个元素包含start、end和text字段。这个结构化的文字稿是后续所有分析的基础。调用示例与 LLM 交互 当你在 Claude 中输入“请转录这个视频/Users/me/Videos/meeting.mp4”。 Claude通过 MCP会调用transcribe_video工具参数为{ “file_path”: “/Users/me/Videos/meeting.mp4” }。 服务器执行上述流程返回 JSON 格式的字幕。Claude 接收到后可能会说“已完成转录。这是视频的前三分钟内容‘...’ 需要我为您总结吗”4.2 视频摘要与章节化工具化冗长为精要仅有文字稿还不够我们需要理解内容。summarize_video或chapterize_video工具在此基础上进行语义层面的加工。实现策略基于转录文本的摘要这是最简单的方法。将完整的转录文本可能超过上下文长度发送给 LLM并给出提示词“你是一个专业的视频内容总结助手。请根据以下带时间戳的转录文本生成一个简洁的摘要并提取出 3-5 个关键章节标题及其对应的时间点。”技巧对于超长文本可以采用“映射-归约”策略。先将文本按时间或段落切分成块让 LLM 分别总结每个块再将分块总结交给 LLM 进行最终汇总。这可以有效克服上下文窗口限制。结合视觉信息的摘要更高级的方法会融合视觉特征。工具可以关键帧提取使用ffmpeg按固定间隔如每 10 秒或基于场景变换检测抽取关键帧。图像描述使用多模态模型如 BLIP、GPT-4V或图像分类模型为关键帧生成文字描述例如“幻灯片展示标题为‘Q3财报’”、“两个人在白板前讨论”。多模态融合将时间对齐的文本转录和图像描述一起输入给 LLM让它生成更全面、准确的摘要和章节。例如LLM 会发现“当演讲者说到‘市场份额增长’时幻灯片正好显示一幅柱状图”从而增强总结的可信度。输出设计 这个工具的输出应该是一个结构化的对象例如{ summary: 本次会议主要回顾了上一季度的销售业绩讨论了新产品发布的路线图并明确了下一阶段的营销重点..., chapters: [ {start: 0, end: 350, title: 开场与上季度回顾}, {start: 351, end: 720, title: 新产品特性演示}, {start: 721, end: 1200, title: QA 与后续计划} ], key_points: [销售额同比增长15%, 新版本将于下月发布, 将加大社交媒体投入] }这样的结构使得 LLM 能够轻松引用比如回答用户“关于新产品演示部分具体说了什么”4.3 语义搜索与导航工具直达你关心的时刻这是“导航”二字的精髓所在——search_in_video。用户问“视频里哪里讲了‘客户反馈’”工具需要快速定位到相关片段。核心技术向量检索文本嵌入将转录文本中每个句子或按固定时间窗口如每30秒的文本通过一个嵌入模型如all-MiniLM-L6-v2转换为一个高维向量例如384维。这个向量代表了这句话的语义。向量存储将所有句子的向量及其对应的时间戳存储起来。在 starter 项目中为了简化可能直接使用内存存储如hnswlib-node或简单的 JSON 文件。生产环境则会用到专业的向量数据库如ChromaWeaviate。查询与检索当用户输入查询词“客户反馈”时工具使用同一个嵌入模型将查询词也转换为向量。计算查询向量与所有句子向量的相似度常用余弦相似度。返回相似度最高的前 K 个句子及其时间戳。工具实现要点增量索引如果视频很长嵌入所有文本可能很慢。可以考虑首次转录时建立索引并缓存后续搜索直接使用缓存。混合搜索除了语义搜索也可以结合关键词匹配如正则表达式提供更灵活的搜索能力。例如用户想找“所有包含图表的片段”这可能需要结合视觉工具。结果呈现工具返回的不仅仅是时间戳最好能附上上下文文本。例如{ “timestamp”: 1250, “text”: “...根据我们收集的客户反馈界面易用性是最受好评的一点...”, “score”: 0.87 }。LLM 可以据此生成更友好的回复“在视频约 20 分 50 秒处提到了客户反馈...”4.4 视觉分析工具让模型“看见”画面如果项目进阶可能会包含analyze_scenes或detect_objects工具。这些工具利用计算机视觉模型来分析视频帧。场景分割使用PySceneDetect库或基于光流/直方图差异的自定义算法检测镜头切换的时刻将视频自动分割成不同的场景。这对于快速浏览视频结构非常有用。物体/人脸识别使用YOLO或MobileNet等模型识别视频中出现的特定物体如“汽车”、“咖啡杯”或人脸。可以统计出现频率或定位到特定物体出现的时段。OCR光学字符识别使用Tesseract.js或PaddleOCR识别视频帧中的文字如幻灯片标题、屏幕上的代码、路牌等。这对于教程类视频尤其有价值。这些视觉工具的输出可以与文本转录、音频信息进行对齐和融合构建一个多模态的视频内容索引使得搜索和问答的能力更加强大。例如用户可以问“找出视频中所有白板上写了字的片段。”5. 自定义扩展与高级集成指南vidnavigator-mcp-starter作为一个 starter 模板其强大之处在于可扩展性。你可以根据特定需求轻松添加新的工具。5.1 如何添加一个自定义工具假设我们想添加一个get_video_metadata工具用于提取视频的基本信息时长、分辨率、编码格式。在src/tools/目录下创建新文件例如metadata.ts。定义工具使用 MCP SDK 提供的Tool类型。// src/tools/metadata.ts import { z } from zod; // 用于参数验证 import { Tool } from modelcontextprotocol/sdk/server.js; import { exec } from child_process; import { promisify } from util; const execAsync promisify(exec); export const getVideoMetadataTool: Tool { name: get_video_metadata, description: 获取视频文件的元信息如时长、分辨率、编码格式等。, inputSchema: { type: object, properties: { filePath: { type: string, description: 本地视频文件的路径。 } }, required: [filePath] }, // 这是工具被调用时执行的函数 handler: async (args: { filePath: string }) { try { // 使用 ffprobe (FFmpeg 的一部分) 获取元数据 const { stdout } await execAsync( ffprobe -v quiet -print_format json -show_format -show_streams ${args.filePath} ); const metadata JSON.parse(stdout); // 提取关键信息 const videoStream metadata.streams.find((s: any) s.codec_type video); const format metadata.format; const result { filePath: args.filePath, duration: format.duration, size: format.size, format: format.format_name, video: { codec: videoStream?.codec_name, width: videoStream?.width, height: videoStream?.height, frameRate: videoStream?.r_frame_rate, }, audio: metadata.streams.filter((s: any) s.codec_type audio).map((a: any)({ codec: a.codec_name, channels: a.channels, sampleRate: a.sample_rate })) }; return { content: [ { type: text, text: JSON.stringify(result, null, 2) // 格式化输出 } ] }; } catch (error) { return { content: [ { type: text, text: 获取元数据失败: ${error instanceof Error ? error.message : String(error)} } ], isError: true }; } } };在服务器主文件中注册工具打开src/server.ts导入你新创建的工具并将其添加到服务器初始化时的工具列表中。// src/server.ts import { getVideoMetadataTool } from ./tools/metadata.js; // 注意编译后是 .js 文件 // ... 在创建 Server 的代码部分 ... const server new Server( { name: vidnavigator-mcp-starter, version: 0.1.0, }, { capabilities: { tools: [/* 其他工具 */, getVideoMetadataTool] // 添加到这里 } } );重新编译并重启运行npm run build然后重启你的 MCP 客户端如 Claude Desktop。新的工具就应该可用了。5.2 集成外部 AI 服务Starter 项目可能默认使用本地运行的模型如 Whisper。但对于更强大的模型如 GPT-4、Claude 3、Gemini Vision你可能希望集成它们的 API。在工具内部调用 API例如在summarize_video工具中你可以将转录文本发送到 OpenAI 的 Chat Completions API 或 Anthropic 的 Messages API而不是使用本地的小模型。注意成本与延迟长视频的完整转录文本可能很长API 调用成本不菲。需要权衡是发送全文还是先本地预处理如提取关键句再发送。环境变量管理API 密钥等敏感信息务必通过环境变量传入不要硬编码在代码中。例如在handler函数中通过process.env.OPENAI_API_KEY读取。多模态 API 集成如果你想实现高级的视觉问答可以集成 GPT-4V 或 Gemini Pro Vision。流程是提取关键帧 - 编码为 base64 - 连同文本问题一起发送给多模态 API。注意事项图片编码后体积巨大会显著增加 token 消耗和成本。务必对图片进行合理的压缩和裁剪并设置清晰的预算监控。5.3 性能优化与缓存策略随着处理视频增多性能成为关键。转录结果缓存对同一个视频文件其转录文本是不变的。可以将转录结果以视频文件MD5.json的形式存储在本地缓存目录。工具被调用时先检查缓存是否存在且未过期如果存在则直接读取避免重复运行耗时的 Whisper 识别。向量索引持久化语义搜索的向量索引构建也比较耗时。可以将索引文件如.hnsw文件与视频文件关联保存。下次搜索时直接加载索引。异步处理与任务队列对于超长视频如 2 小时以上处理时间可能超过 HTTP 请求超时时间。可以考虑将工具设计为异步模式。即工具调用立即返回一个“任务ID”然后服务器在后台处理。同时提供另一个get_task_status工具让 LLM 可以轮询或让用户稍后查询结果。这需要引入一个简单的任务队列如bull和结果存储。资源清理视频处理会产生临时文件如提取的音频、关键帧图片。务必在工具执行完毕后或定期清理避免磁盘空间被占满。6. 典型应用场景与工作流构建理解了工具之后我们来看看如何将它们组合起来解决真实世界的问题。6.1 场景一会议纪要自动生成目标将一场团队会议录像自动转化为结构化的会议纪要包括议题、结论、行动项。工作流触发用户将会议视频文件拖入某个监控文件夹或通过聊天机器人发送视频链接。自动转录transcribe_video工具被调用生成带时间戳的全文稿。智能章节化chapterize_video工具分析文稿结合说话人变化如果音频能分离将会议划分为“项目回顾”、“问题讨论”、“下周计划”等章节。提取行动项与决策LLM 被提示仔细阅读“问题讨论”和“下周计划”章节识别出所有以“AI 将负责...”、“决定采用方案B”、“需要跟进XXX”等模式表达的行动项和决策点。生成结构化输出LLM 将以上信息整理成 Markdown 格式的会议纪要并附上关键论点的时间戳链接。最终文档被自动保存到 Notion、Confluence 或发送到团队频道。价值将数小时的人工听录、整理工作压缩到几分钟内自动完成且格式统一信息可追溯。6.2 场景二教育视频的知识点索引与问答目标为一个在线课程视频库创建可搜索的知识图谱并支持自然语言问答。工作流批量预处理对课程库所有视频运行transcribe_video和chapterize_video建立基础的文本和结构索引。构建语义索引对每个视频的每个章节文本运行嵌入模型生成向量并存入向量数据库。同时将章节标题、时间戳、视频ID作为元数据关联。用户问答学生提问“第三章讲梯度下降时老师提到的那个优化技巧是什么”系统将问题转换为向量在向量数据库中进行语义搜索找到最相关的几个视频章节片段。LLM 综合这些片段的内容生成一个准确、简洁的答案并引用来源视频和时间点。智能导航学生可以进一步要求“带我去看看这个技巧的演示部分。” LLM 可以调用search_in_video工具定位到该视频中演示该技巧的精确时间点甚至可以控制视频播放器跳转。价值变被动观看为主动探索极大提升了学习效率和知识检索的深度。6.3 场景三自媒体内容分析与竞品调研目标分析热门博主的视频内容风格、话题分布和流行元素。工作流数据采集通过puppeteer等工具自动从平台下载目标博主的最新 N 个视频。多维度分析话题分析对每个视频的摘要进行聚类分析可使用嵌入向量进行聚类得出该博主最常谈论的 5 个核心话题。情感分析对转录文本进行情感分析了解其内容基调是积极、消极还是中立。视觉元素分析使用detect_objects和analyze_scenes工具统计视频中高频出现的视觉元素如特定品牌 logo、产品特写、户外场景比例等和镜头切换频率节奏感。结构化信息提取让 LLM 从文案中提取“价格提及”、“优惠码”、“合作品牌”等商业信息。生成分析报告LLM 将上述分析结果整合成一份数据驱动的分析报告指出该博主的内容策略、受众偏好和商业化特点。价值为内容创作、市场投放提供量化的决策依据告别“凭感觉”分析。7. 常见问题、故障排查与优化建议在实际部署和使用过程中你肯定会遇到各种问题。这里记录了一些常见坑点和解决思路。7.1 安装与依赖问题问题npm install失败提示sharp或某些原生模块编译错误。排查这通常是因为缺少系统级的编译工具或库。错误信息会指明缺失什么。例如sharp需要libvips。解决Ubuntu:sudo apt install libvips-dev pkg-config build-essentialmacOS:brew install vips pkg-config全局检查node -p process.arch和node -p process.platform确保架构和平台正确。有时需要强制重新安装npm rebuild或删除node_modules和package-lock.json后重装。问题运行服务器时报错Cannot find module xenova/transformers或类似。排查可能是在 TypeScript 源码中引用了但实际安装的版本路径有变化或者需要额外安装。解决确认package.json中确实有该依赖并尝试npm install xenova/transformers。如果是网络问题可以设置 npm 镜像或使用yarn。7.2 运行时与功能问题问题Claude Desktop 无法连接到 MCP 服务器或者连接后工具列表为空。排查步骤检查配置文件claude_desktop_config.json的路径和命令参数绝对正确。特别是args中的路径必须指向编译后的.js文件而不是.ts源文件。检查服务器日志在终端手动运行你的服务器命令如node /path/to/build/server.js看是否有错误输出。确保服务器能正常启动不报错退出。检查 Claude 日志如前所述在系统日志中查看 Claude 的报错信息。验证 MCP 协议有些第三方 MCP 客户端如mcp-cli可以用来测试服务器是否正常响应隔离 Claude 客户端的问题。问题transcribe_video工具运行极其缓慢或者内存占用爆炸。排查这很可能是 Whisper 模型过大如使用了large模型或没有正确利用硬件加速。解决降级模型通过环境变量WHISPER_MODELsmall使用更小的模型。对于中文small通常是性价比之选。启用 GPU如果你有 NVIDIA GPU 且安装了 CUDA可以寻找支持 GPU 的 Whisper Node.js 绑定库或者通过 Python 调用 GPU 版的 Whisper然后通过 Node.js 子进程调用 Python 脚本。这比较复杂但速度是数量级的提升。优化音频确保在调用 Whisper 前音频已被预处理为单声道、16kHz 采样率这能减少输入数据量。问题语义搜索search_in_video的结果不准确找不到相关内容。排查嵌入模型不匹配确保索引和查询使用的是同一个嵌入模型。如果模型更新了所有索引需要重建。文本分块策略不当如果按固定时间如1分钟分块一个完整的句子可能被切到两个块里导致语义不完整。尝试按句子边界或固定字数如200字分块并允许少量重叠。查询表述语义搜索不是关键词搜索。尝试用更完整的句子去查询而不是零散的几个词。例如用“视频中关于项目风险管理的方法有哪些”代替“风险管理”。阈值过滤可以设置一个相似度分数阈值如 0.7低于此阈值的结果不返回避免返回不相关的内容。7.3 扩展与进阶问题问题想处理 YouTube 等在线视频但工具只支持本地文件路径。解决扩展transcribe_video工具的输入模式。可以先用youtube-dl或yt-dlp这样的命令行工具在工具handler中先下载视频到临时目录再进行后续处理。记得处理好临时文件的清理。// 在 handler 内部 if (input.url.startsWith(https://www.youtube.com/)) { const tempDir await mkdtemp(path.join(os.tmpdir(), vid-)); const tempFile path.join(tempDir, video.mp4); await execAsync(yt-dlp -f best[extmp4] -o ${tempFile} ${input.url}); // 使用 tempFile 进行处理... // 处理完成后清理 tempDir }问题视频很长LLM 的上下文窗口装不下完整的转录文本进行分析。解决采用“分层总结”或“映射-归约”策略。映射先将长文本按章节或固定长度切分成多个片段。并行处理让 LLM 分别总结每个片段可以并行调用 API 以提高速度。归约将所有片段的总结再交给 LLM 进行一次全局总结提炼出最终的核心观点和章节。 这种方法能有效处理远超单次上下文限制的长文档。最后这个项目的魅力在于它打开了一扇门让 LLM 的能力从纯文本扩展到了丰富的视频世界。你可以从 starter 出发根据你的具体需求不断添加新的工具比如情感分析、说话人分离、甚至基于视频内容生成新的短视频片段。