把会议录像做摘要,VideoAgent 经 TaoToken 调语言模型

把会议录像做摘要,VideoAgent 经 TaoToken 调语言模型 1. 会议录像摘要的瓶颈不在“剪”而在长上下文的结构化调用把会议录像做摘要VideoAgent 要调语言模型先到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_intro 拿 Key再把 Base URL 设为 https://taotoken.net/api。很多同学第一次跑 VideoAgent卡住的地方不是装不上依赖而是转写完成后摘要请求发不出去401、404、model not found、连接超时根因通常都在供应商配置这一层。VideoAgent 出自港科大 HKUDS 实验室项目在 GitHub 上以 MIT 协议开源核心能力包括视频理解、语义检索、自动摘要、语义剪辑和二创。放到会议场景里最实用的链路其实很窄两小时会议录像先做音视频分离和语音转写再按时间段切成若干片段最后把片段送进语言模型生成“决策、待办、风险、时间戳”四类结构化要点。这里真正消耗 Token 的环节是结构化摘要生成调用语言模型而不是本地转写。本地转写可以用 Whisper 类模型完成但要把口语转写稿压缩成可执行的会议纪要仍然需要语言模型做语义归纳、去重、角色归属和时间对齐。所以本文不重复讲 VideoAgent 的剪辑 demo而是把它当成一个“会议内容处理流水线”来用素材进、转写稿出、分段摘要、汇总纪要。中间的语言模型调用全部指向 TaoTokenBase URL 使用https://taotoken.net/apiKey 使用YOUR_API_KEY占位。下面从 Key 获取、环境变量、最小请求、Claude Code / Codex / CC Switch 配置、排障、成本控制六个层面展开最后给出一份可以直接复用的会议要点笔记模板。需要先明确一个边界VideoAgent 首次运行通常会下载 Whisper、CosyVoice 等本地模型这一步对机器磁盘和网络有要求。如果你的目标只是“两小时会议录像自动摘要”可以不走完整二创链路只复用它的转写和分段结果然后把分段文本通过 TaoToken 送给语言模型。这样部署更轻排障也更聚焦。2. 在 VideoAgent 里把语言模型供应商切到 TaoTokenKey、Base URL、模型名VideoAgent 本身是 Python 生态里的开源框架具体调用哪家模型取决于它的配置文件或环境变量。最稳妥的做法是把它当作 OpenAI 兼容客户端来接设置 API Key、Base URL、模型名三项。TaoToken 的 Base URL 固定为https://taotoken.net/api不要手工在后面加/v1也不要在末尾多写斜杠。Key 到控制台创建创建入口在文末 CTA 里也会给出。先准备三个环境变量放在.env或 shell 启动脚本里# 从 TaoToken 控制台创建 API Key 后替换 export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_MODELYOUR_MODEL_NAME如果你使用的 VideoAgent 分支读取的是 OpenAI 标准环境变量可以再做一层映射。注意这里只映射 OpenAI 风格变量不要把所有工具都套成ANTHROPIC_*Claude Code 和 Codex 的配置方式不同后面会分开写。export OPENAI_API_KEY$TAOTOKEN_API_KEY export OPENAI_BASE_URL$TAOTOKEN_BASE_URL export OPENAI_API_BASE$TAOTOKEN_BASE_URL export OPENAI_MODEL$TAOTOKEN_MODEL模型名不要凭记忆填。先到 TaoToken 的模型对话页查看可用模型 ID再填入TAOTOKEN_MODEL。如果你用的是 Python 项目可以先用一个最小脚本验证 Key 和 Base URL 是否可用再启动 VideoAgent 完整流程。这个最小脚本不依赖 VideoAgent只验证语言模型通道import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) resp client.chat.completions.create( modelos.environ[TAOTOKEN_MODEL], messages[ {role: system, content: 你是一个会议纪要助手只输出 JSON。}, {role: user, content: 把这句话压缩成待办下周三前由王工完成接口联调李工提供测试账号。}, ], temperature0.2, ) print(resp.choices[0].message.content)如果这段能返回内容说明 Key、Base URL、模型名三项已经通了。接下来再把同样的配置填进 VideoAgent 的模型配置。常见做法有两种一种是在config.yaml、config.json或.env里写api_key、base_url、model另一种是让框架读取环境变量。无论哪种核心都是把base_url写成https://taotoken.net/api把api_key写成YOUR_API_KEY的实际值。这里有一个容易忽略的点有些框架会把 Base URL 和路径拼接成{base_url}/chat/completions也有些 SDK 会拼成{base_url}/v1/chat/completions。TaoToken 文档给出的 Base URL 是https://taotoken.net/api所以配置时以文档为准。如果出现 404优先检查是不是自己多加了/v1或者复制 Key 时带了空格和换行。另外不要把 Key 硬编码进 Git 仓库。推荐做法是本地.env文件加到.gitignoreCI 或云函数环境里用环境变量注入。会议录像本身可能含敏感信息Key 和素材都不要上传到公开仓库。3. 可复现的最小摘要请求从 segments.json 到结构化要点笔记VideoAgent 的转写结果通常可以整理成 JSON每段包含开始时间、结束时间和文本。我们不需要一次把两小时全文塞给模型而是先分段摘要再汇总。这样做有三个好处降低单次上下文长度、减少超时、方便定位哪一段提取失败。假设你已经得到segments.json结构如下[ { start: 00:00:00, end: 00:08:30, text: 主持人介绍项目背景确认本次会议目标是评审 v2.3 上线范围。 }, { start: 00:08:30, end: 00:21:10, text: 王工汇报接口联调进度提出测试账号权限不足需要李工在周三前提供。 } ]下面这段 Python 代码可以直接运行。它读取segments.json逐段调用 TaoToken 上的语言模型要求返回 JSON最后把每段结果汇总成一份会议要点笔记。代码里保留了YOUR_API_KEY和YOUR_MODEL_NAME两个占位符替换后即可本地执行。import json import os import time from openai import OpenAI client OpenAI( api_keyos.environ.get(TAOTOKEN_API_KEY, YOUR_API_KEY), base_urlhttps://taotoken.net/api, ) MODEL os.environ.get(TAOTOKEN_MODEL, YOUR_MODEL_NAME) PROMPT_TEMPLATE 你是会议纪要助手。请把下面这段会议转写稿压缩成 JSON。 要求 1. 只输出 JSON不要输出解释、不要加 markdown 代码块。 2. 字段包括 topic、decisions、todos、risks、questions、timestamp。 3. todos 里尽量提取负责人和截止时间没有就写“未指定”。 4. 不要编造转写稿里没有出现的信息。 时间范围{start} - {end} 转写稿 {text} def clean_json(text: str) - str: text text.strip() if text.startswith(): text text.strip() if text.startswith(json): text text[4:].strip() return text def summarize_segment(seg: dict) - dict: prompt PROMPT_TEMPLATE.format( startseg[start], endseg[end], textseg[text], ) resp client.chat.completions.create( modelMODEL, messages[{role: user, content: prompt}], temperature0.2, ) content resp.choices[0].message.content try: return json.loads(clean_json(content)) except json.JSONDecodeError: return { topic: 解析失败, decisions: [], todos: [], risks: [], questions: [], timestamp: f{seg[start]} - {seg[end]}, raw: content, } def main(): with open(segments.json, r, encodingutf-8) as f: segments json.load(f) results [] for i, seg in enumerate(segments): print(f处理第 {i 1}/{len(segments)} 段{seg[start]} - {seg[end]}) results.append(summarize_segment(seg)) time.sleep(0.5) # 降低并发避免触发限流 with open(meeting_notes.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(已生成 meeting_notes.json) if __name__ __main__: main()这段代码故意做成了“分段调用 本地落盘”的形式。两小时会议录像可以切成 8 到 20 段每段 5 到 10 分钟。段太短会导致调用次数多、Token 开销上升段太长又容易让模型漏掉中间信息。实际使用时可以先按发言人变化、议题切换、PPT 翻页点来切不一定严格按等长时间切。生成meeting_notes.json后再跑一次汇总请求把所有分段 JSON 合并成最终纪要。汇总提示词可以这样写import json import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) with open(meeting_notes.json, r, encodingutf-8) as f: segment_notes json.load(f) prompt f下面是一场会议的逐段摘要 JSON。请合并成一份最终会议纪要。 要求 - 删除重复项保留有明确时间点的信息。 - 待办事项必须带负责人和截止时间没有写“未指定”。 - 输出 Markdown包含核心结论、决策记录、待办事项、风险与阻塞、待确认问题。 - 不要编造原文没有的信息。 分段摘要 {json.dumps(segment_notes, ensure_asciiFalse, indent2)} resp client.chat.completions.create( modelos.environ[TAOTOKEN_MODEL], messages[{role: user, content: prompt}], temperature0.2, ) print(resp.choices[0].message.content)最终得到的要点笔记可以整理成下面这个模板放进团队文档或 CSDN 博客的代码块里都合适# 会议纪要v2.3 上线范围评审 - 会议时间2026-01-15 14:00 - 16:00 - 录像时长02:00:00 - 参会人主持人、王工、李工、产品负责人 - 原始素材meeting_20260115.mp4 ## 核心结论 1. v2.3 上线范围锁定为接口联调、权限校验、日志上报三块。 2. 移动端适配不进入本次版本顺延到 v2.4。 ## 决策记录 | 时间点 | 决策 | 背景 | 负责人 | | --- | --- | --- | --- | | 00:18:20 | 测试账号由李工统一提供 | 王工反馈权限不足 | 李工 | | 00:42:10 | 移动端适配顺延 | 排期紧张 | 产品负责人 | ## 待办事项 | 时间点 | 待办 | 负责人 | 截止时间 | 状态 | | --- | --- | --- | --- | --- | | 00:21:10 | 提供测试账号 | 李工 | 下周三 | 待开始 | | 00:55:30 | 完成接口联调 | 王工 | 下周五 | 进行中 | ## 风险与阻塞 - 测试环境不稳定可能影响联调进度。 - 权限模块依赖外部团队存在排期不确定性。 ## 待确认问题 - 日志上报是否需要兼容旧版本协议 - 上线窗口是否与运维变更冻结期冲突到这里VideoAgent 负责“看懂视频、转写、分段”TaoToken 负责“结构化摘要生成调用语言模型”你得到的是可复制、可追溯、带时间戳的会议要点笔记。4. Claude Code、Codex、CC Switch 三套配置把日常摘要工作流也走 TaoToken会议摘要只是起点。如果你平时还用 Claude Code 写脚本、用 Codex 做代码解释或者用 CC Switch 管理多个供应商可以顺手把这几套工具也指到 TaoToken。注意Claude Code 使用ANTHROPIC_*变量Codex 使用config.toml两者不要混用。不要把ANTHROPIC_*套到 Codex 上否则会出现认证或路径不匹配。4.1 Claude Codesettings.json 与 ANTHROPIC_*Claude Code 的配置通常放在~/.claude/settings.json。把 Base URL 指到 TaoTokenKey 用YOUR_API_KEY占位模型名用你在模型对话页看到的实际 ID。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: YOUR_CLAUDE_MODEL_NAME } }保存后重启 Claude Code。如果你在终端里临时验证也可以直接导出环境变量export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_MODELYOUR_CLAUDE_MODEL_NAMEClaude Code 的 Base URL 同样是https://taotoken.net/api不要额外加/v1。如果出现 401先检查ANTHROPIC_AUTH_TOKEN是否等于刚创建的 Key如果出现 404检查ANTHROPIC_BASE_URL是否被误写成了带/v1的地址。4.2 Codexconfig.toml 单独配置Codex 不使用ANTHROPIC_*而是读取config.toml。下面是一个供应商配置示例把base_url指向 TaoTokenenv_key指向你本地存放 Key 的环境变量名。model YOUR_MODEL_NAME model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在 shell 里设置export TAOTOKEN_API_KEYYOUR_API_KEY这样 Codex 和 Claude Code 可以共用同一个 Key但配置文件互不干扰。再次强调Codex 不要写ANTHROPIC_BASE_URLClaude Code 也不要写model_providers两套配置各走各的。4.3 CC Switch 三件套配置名、Base URL、API Key如果你用 CC Switch 管理多个模型供应商新增条目时填三件套即可配置名称TaoToken Base URLhttps://taotoken.net/api API KeyYOUR_API_KEY保存后切换到这个配置再重启对应的 CLI 工具。CC Switch 的作用是帮你切换供应商不改变工具本身的配置格式。所以 Claude Code 仍然读ANTHROPIC_*Codex 仍然读config.toml只是它们背后的 Base URL 和 Key 可以统一由 CC Switch 管理。如果你还没有创建 Key可以到 TaoToken 控制台创建https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_keys 。创建后先复制到密码管理器再填入各工具配置避免反复创建。5. 两小时会议录像的问答式摘要语义检索、时间戳与待办提取VideoAgent 的会议摘要不只是“生成一段总结”它还可以结合语义检索做问答。比如你拿到一份两小时录像后不必从头看可以直接问“嘉宾在第几分钟提到成本问题”或者“找出所有人讨论排期的片段。”这类问题依赖 VideoAgent 的语义索引而最终答案的生成仍然可以走 TaoToken 上的语言模型。一个实用的会议处理流程可以拆成五步本地转写用 Whisper 类模型把音轨转成带时间戳的文本。分段整理按议题、发言人、PPT 翻页点切成segments.json。语义索引需要 VideoAgent 的语义搜索能力时建立画面、语音、文字的联合索引。结构化摘要把每段文本通过 TaoToken 调用语言模型生成 JSON。汇总输出合并 JSON生成 Markdown 纪要保留时间戳和负责人。如果会议里有很多人发言可以在转写稿里做说话人分离再在提示词里要求模型区分“谁提出了什么”。但要注意说话人分离的准确率依赖原始音质模型只能基于转写稿归纳不能凭空补全身份。提示词里可以加一句“如果转写稿没有标明发言人不要猜测姓名”。对于待办提取建议单独做一轮请求而不是和摘要混在一起。因为待办需要更严格的字段约束比如负责人、截止时间、验收标准。可以这样写提示词请从下面转写稿中只提取待办事项输出 JSON 数组。 每个待办包含task、owner、deadline、evidence。 evidence 是原文中支持这条待办的短句必须逐字引用不要改写。 如果截止时间没有明确说写“未指定”。这种“证据引用”机制可以显著减少模型编造。你后续人工核对时只要看evidence就能快速定位到录像时间点。对于风险与阻塞可以要求模型区分“已确认风险”和“潜在风险”。已确认风险是会上明确说“会延期”“有依赖”的内容潜在风险是“可能”“如果”“需要确认”的内容。这样输出到纪要里团队一眼就能看出哪些需要立即处理。6. 排障清单401、404、429、超时与模型名不匹配这一节把常见报错和排查顺序列清楚。会议摘要流水线一旦跑通后面就是稳定调用但第一次配置时90% 的问题都集中在 Key、Base URL、模型名、并发和 JSON 解析。6.1 401 UnauthorizedKey 没有填或者填的是占位符YOUR_API_KEY。Key 复制时带了空格、换行、中文引号。环境变量没有生效当前 shell 和运行进程不在同一个会话。用了旧 Key 或已删除的 Key。Claude Code 里把 Key 填到了ANTHROPIC_API_KEY但工具读取的是ANTHROPIC_AUTH_TOKEN。以实际工具文档为准两个都检查一遍。处理方式重新从控制台创建 Key复制后先写入.env再source .env然后重启工具。不要在终端里直接echo $TAOTOKEN_API_KEY把 Key 打印到日志里。6.2 404 Not FoundBase URL 写成了https://taotoken.net/api/v1而文档要求https://taotoken.net/api。Base URL 末尾多了斜杠或者路径里多了chat/completions。模型名不存在某些网关会返回 404 而不是 400。请求路径被框架二次拼接实际请求发到了错误地址。处理方式先用第 2 节的最小 Python 脚本验证。如果最小脚本能通说明 Key 和 Base URL 没问题问题在 VideoAgent 或 CLI 工具自身的路径拼接。此时去看框架的模型配置文件确认base_url字段没有被加上额外后缀。6.3 429 Too Many Requests分段摘要并发太高一次性发了几十个请求。免费或低额度套餐有频率限制。同一 Key 被多个工具同时使用。处理方式在分段循环里加time.sleep(0.5)到time.sleep(2)或者把并发数降到 1 到 2。会议摘要不是实时业务串行处理完全可接受。如果确实需要高并发先到控制台确认当前套餐的并发上限。6.4 超时与上下文截断单段文本太长模型处理时间超过客户端超时。两小时全文一次性送入上下文超过模型上限。网络抖动导致连接中断。处理方式每段控制在 5 到 10 分钟转写稿单段字符数控制在几千字以内。超时参数可以适当调大但更推荐分段。如果模型返回内容被截断检查max_tokens是否设置过小或者提示词要求输出太长。6.5 模型名不匹配把 Claude 的模型名填给了 Codex。把 Codex 的模型名填给了 Claude Code。模型名拼写错误或者大小写不一致。用的模型在当前账号下不可用。处理方式统一从 TaoToken 模型对话页复制模型 ID。Claude Code 用 Claude 系列模型名Codex 用对应模型名VideoAgent 的摘要脚本用通用模型名。不要凭记忆手写。6.6 JSON 解析失败模型输出了 markdown 代码块json.loads直接失败。提示词没有强调“只输出 JSON”。模型在 JSON 前后加了“好的以下是结果”。处理方式在提示词里写“只输出 JSON不要输出解释、不要加 markdown 代码块”。同时在代码里加清洗函数去掉首尾的 和json标记。如果仍然失败把原始输出落盘人工检查后再调整提示词。7. 成本控制与隐私边界Token 消耗方在结构化摘要生成会议摘要的成本主要来自语言模型调用。VideoAgent 的本地转写、音视频分离、语义索引可以尽量放在本地但结构化摘要生成、待办提取、最终汇总仍然要调用语言模型。控制成本可以从四个方向入手第一分段粒度。段太短请求次数多系统提示词重复消耗段太长上下文大单次费用高还容易截断。两小时会议切成 10 到 15 段比较平衡。第二模型分级。初步分段摘要可以用成本更低的模型最终汇总再用能力更强的模型。待办提取这种结构化任务提示词写清楚后小模型也能做得不错。第三缓存中间结果。segments.json和meeting_notes.json都落盘。如果某一段失败只重试那一段不要全量重跑。最终汇总失败时直接读meeting_notes.json重试不用再调分段摘要。第四脱敏与裁剪。会议录像里可能包含客户名称、合同金额、内部系统地址、账号信息。送模型前先做替换比如把“张三”替换成“发言人A”把“https://internal.example.com”替换成“内部地址”。如果会议涉及生产库凭证、密钥、个人隐私不要直接送入模型。需要数据库操作时SQL 和命令由读者本地执行不要让模型直连生产库。隐私边界还有一条Key 不要写在博客、截图、Git 提交记录里。本文所有示例都用YOUR_API_KEY占位你本地替换时也不要把它提交到公开仓库。会议素材和转写稿建议加密存储摘要结果如果要分享先确认参会人是否同意。8. 从模型对话到 Coding Plan一条不绕路的 CTA如果你已经走到这里说明你需要的不是“再听一遍 VideoAgent 有多强”而是一条能跑通的会议摘要链路VideoAgent 负责转写和分段TaoToken 负责结构化摘要生成调用语言模型最终输出带时间戳的要点笔记。建议按这个顺序操作先到模型对话页验证模型可用性https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_chat如果日常摘要和编码任务比较多看 Coding Plan 是否合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_plan创建 API Key填入YOUR_API_KEYhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_keysClaude Code 用户再看一遍文档确认settings.json和ANTHROPIC_*没填错https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_claudecode最后再提醒一次配置要点官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentvideoagent_meeting_final Base URL 是https://taotoken.net/apiKey 占位符是YOUR_API_KEY。Claude Code 用settings.json和ANTHROPIC_*Codex 用config.tomlCC Switch 填“配置名、Base URL、API Key”三件套。把这三件事做对两小时会议录像的摘要流水线就能稳定跑起来剩下的只是提示词和分段策略的微调。