关于 Talkthrough
Talkthrough 将带旁白的录屏和公开视频链接处理为可搜索证据,供编码 Agent 和团队调查 bug、会议或演示。其本地流程结合转录、关键帧、OCR 和现实时间戳,不会向问题跟踪工具提交内容。
主要功能
- 01本地音视频转录
- 02提取关键帧并进行 OCR
- 03锚定现实时间戳
- 04搜索转录和屏幕文字
- 05可选说话人分离
- 06提供问题和会议工作流提示词
适用场景
- 01根据带旁白的录屏起草 bug 报告
- 02查找录音中的发言和画面
- 03提取会议决策和行动项
- 04将录屏事件与系统日志关联
MCP 相关
MCP 服务提供处理本地媒体或公开视频链接、获取转录和画面、搜索证据及标记说话人的工具,并提供 bug 分诊、研讨会规格、演示、会议和日志关联提示词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx talkthrough-mcpTALKTHROUGH_WHISPER_MODELWhisper model (tiny|base|small|medium|large-v3|large-v3-turbo). Default: small. Use large-v3-turbo for non-English narration; the process_media `model` param overrides per call.TALKTHROUGH_OCRSet to 'off' to disable OCR of keyframes. Default: on.TALKTHROUGH_OCR_LANGRecognition script for on-screen text: a language code (ru, ja, ko, ar, hi, ...) or a RapidOCR pack name (eslav, cyrillic, ...). Default: Latin+Chinese.TALKTHROUGH_HOMEJob store root. Default: ~/.talkthroughTALKTHROUGH_MAX_DOWNLOAD_BYTESHard cap for one process_url download. Default: 2147483648 (2 GiB).本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
9收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | |
| force | boolean | 否 | |
| model | any | 否 | |
| diarize | any | 否 | |
| language | any | 否 | |
| vocabulary | any | 否 | |
| recorded_at | any | 否 | |
| num_speakers | any | 否 |
详细介绍
talkthrough-mcp
快速入门 · 工具 · 基准测试 · 常见问题 · 故障排除 · 更新日志 · 贡献指南
别写 Bug 报告,记录下来。
给 Claude Code 或 Codex 一段带旁白的 .mov/.mp4,或一个公开视频链接,
talkthrough 就能在本地将其转换为可搜索的转录文本、精确帧、OCR 和
墙上时钟时间戳,让你的 Agent 写出有证据支撑的问题草稿,或调查修复方案。
也适用于会议、研讨会、产品演示和生产事故。

示意图——/talkthrough:bug 流程动画,并非屏幕录制:录制内容在本地建立索引(转录文本 · 关键帧 · OCR · 墙上时钟时间),汇总证据检查点,并准备好使用你自己的跟踪工具(gh、Jira、GitHub MCP 服务)提交草稿——talkthrough 本身绝不会离开你的设备,也不会发布任何内容。
真实运行,无动画:
- ▶ 观看带声音的演示(1:18) — 未经剪辑的会话:输入一段带旁白的录制内容,输出一份可直接提交的
bug-report.md。 - 无声录制 → 问题草稿 —
整个流程都以文件形式提供,可重新运行:一个由 Playwright 录制、没有音频的
.mp4,以及未经编辑的 Agent 输出。每个数字都可复现——处理该文件会生成job_id 8703a66bbe77a7d0(作业 ID 即 sha256 前缀,因此shasum -a 256可以预测它),17 个关键帧 / 4 个唯一帧,以及 0 个转录片段,因为没有音轨。
快速开始
一条命令,无需系统依赖:ffmpeg 会回退到捆绑版本,
OCR 仅需通过 pip 安装,whisper 模型会在首次使用时自动下载。唯一的前置条件是 uv(brew install uv 或
curl -LsSf https://astral.sh/uv/install.sh | sh)。
冷启动设置分为两个独立阶段:uvx 首先解析兼容的 Python
版本和固定的服务环境,然后首次调用 process_media 时会下载
缺失的媒体/模型资源。插件更新可能会创建新环境;如果系统中没有 ffmpeg,还会再次下载约 80 MB 的捆绑 ffmpeg;共享的
Whisper/OCR/说话人分离缓存以及预热后无需联网的任务仍可复用。
请参阅故障排除。
Claude Code
有两种安装方式——任选其一,不要同时安装(插件已包含服务;同时安装会导致重复注册):
仅服务——提供 9 个工具和 6 个提示词,不会在系统中安装其他内容。适合精简设置,或需要在多个客户端中自行管理 MCP 服务的情况:
claude mcp add -s user talkthrough -- uvx --python ">=3.11,<3.14" "talkthrough-mcp[diarization,url]"
完整插件——包含相同的服务,另提供原生斜杠命令
(/talkthrough:bug、/talkthrough:triage-recording、……),为你处理相关流程;还提供现成的分类子 Agent,以及教会 Claude 工作流的 Agent 技能。适合获得开箱即用的最佳体验:
/plugin marketplace add korovin-aa97/talkthrough-mcp
/plugin install talkthrough@talkthrough
其他 MCP 客户端
Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
Cursor
~/.cursor/mcp.json (or project .cursor/mcp.json):
{
"mcpServers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
更多信息:integrations/cursor/
OpenAI Codex CLI
~/.codex/config.toml (or project-scoped .codex/config.toml in trusted projects):
[mcp_servers.talkthrough]
command = "uvx"
args = ["--python", ">=3.11,<3.14", "talkthrough-mcp[diarization,url]"]
更多信息:integrations/codex/
Gemini CLI
~/.gemini/settings.json:
{
"mcpServers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
Cline / Roo Code
cline_mcp_settings.json (via MCP Servers UI):
{
"mcpServers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
更多信息:integrations/cline/
OpenClaw
~/.openclaw/openclaw.json:
{
"mcp": {
"servers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
}
OpenCode
opencode.json (project) or ~/.config/opencode/opencode.json:
{
"mcp": {
"talkthrough": {
"type": "local",
"command": [
"uvx",
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
],
"enabled": true
}
}
}
Goose
~/.config/goose/config.yaml:
extensions:
talkthrough:
enabled: true
type: stdio
cmd: uvx
args: ["--python", ">=3.11,<3.14", "talkthrough-mcp[diarization,url]"]
更多信息:integrations/goose/
GitHub Copilot CLI
~/.copilot/mcp-config.json:
{
"mcpServers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
Windsurf
~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"talkthrough": {
"command": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
Zed
settings.json (Zed):
{
"context_servers": {
"talkthrough": {
"source": "custom",
"command": {
"path": "uvx",
"args": [
"--python",
">=3.11,<3.14",
"talkthrough-mcp[diarization,url]"
]
}
}
}
}
更多信息:integrations/zed/
其他任何 MCP stdio 客户端都使用相同的服务命令:uvx --python ">=3.11,<3.14" "talkthrough-mcp[diarization,url]"。
integrations/ 中提供了各引擎对应的文件夹,其中包含完全相同的代码片段和验证步骤;
Agent 可通过 llms-install.md 自行安装。
谁说了什么(说话人分离)——已包含在上述配置中
多人录音(会议、访谈、讨论会)可以标注 S1/S2/… 说话人标签。每个安装按钮、代码片段以及上面的插件都已包含 [diarization] 引擎,因此只需询问 Agent“谁说了什么”即可使用——说话人分离仍仅会在每次调用时按需运行
(process_media(path=..., diarize=true, num_speakers=<count if known>)),
其模型会在首次使用时下载一次。
想使用不含说话人分离引擎的精简服务?请改用命令 uvx --python ">=3.11,<3.14" talkthrough-mcp(MCP 注册表条目也会解析为此精简形式)——此时显式设置 diarize=true 会返回一行安装修复提示。详情请参阅
说话人。
更新到 0.4.4
更新插件或生成的配置,然后在重新连接 MCP 客户端之前,预热其确切固定版本的启动器:
uvx --python ">=3.11,<3.14" "talkthrough-mcp[diarization,url]==0.4.4" --version
输出应显示 0.4.4 和两个扩展项。这会准备好依赖项;首次录音仍可能需要下载模型/工具。冷启动环境可能会超过客户端的启动超时。请参阅 启动恢复。 现有任务无需迁移。
从 0.3.x 升级
重新生成的配置和插件都包含 [diarization,url]。你为 0.3.x 手动编写的配置——uvx --python ">=3.11,<3.14" talkthrough-mcp,或不带 url extra 的版本固定配置——会原地升级服务,并列出新的
process_url 工具,
但在添加该 extra 之前,只能处理直接的 https:// 媒体链接:
YouTube 和视频页面会返回一行安装修复说明。将 url 添加到命令中(uvx --python ">=3.11,<3.14" "talkthrough-mcp[diarization,url]"),
重启客户端,并使用 talkthrough-mcp --version 检查(0.4.1+);该命令会列出环境中已有的 extras。服务每次启动时也会将相同信息写入 stderr,因此客户端的 MCP 日志中也会显示。
本地检出(开发)
git clone https://github.com/korovin-aa97/talkthrough-mcp
claude mcp add talkthrough -- uv run --directory /path/to/talkthrough-mcp talkthrough-mcp
然后,在你的 Agent 中:
处理
~/Desktop/recording.mov并进行分流,或者直接调用triage-recording服务提示词。
工具
| 工具 | 功能 |
|---|---|
process_media(path, recorded_at?, vocabulary?, language?, model?, diarize?, num_speakers?, force?) | 导入视频/音频文件:本地 STT、关键帧、OCR、墙上时钟时间、可选的说话人标签。返回简洁摘要。按内容哈希实现幂等——重复调用会立即返回;对已处理的任务设置 diarize=true,可在不重新转录的情况下添加说话人。 |
process_url(url, recorded_at?, vocabulary?, language?, model?, diarize?, num_speakers?, refresh?, force?) | 唯一的网络工具:只下载一次公开的视频/音频 URL(直接的 https:// 媒体链接、一个 YouTube 视频,或 yt-dlp 可读取的任何公开视频页面——需安装 [url] extra),将源文件保留在任务中,然后运行相同的本地流水线。重复调用相同 URL 时会返回已存储的任务,不会访问网络,除非设置 refresh=true;force=true 会从保留的源文件重新构建;不会存储原始 URL。 |
get_transcript(job_id, start_ms?, end_ms?, format?) | 分页返回转录内容,格式为 segments、text 或 srt(启用说话人分离时会在说话人前添加标签,并附带名单头);内容被截断时会返回 next_start_ms。 |
get_frames(job_id, at_ms? | start_ms?+end_ms?, max_frames?, include_duplicates?) | 返回最接近指定时间戳的关键帧图像,或在时间范围内均匀抽取的图像(默认只含唯一帧,每次最多 6 张);每一帧都会提供其绝对 path。 |
get_moment(job_id, start_ms, end_ms) | “单条发言”合集:转录片段 + 最多 3 张帧图 + 对应的 OCR 文本 + 墙上时钟时间范围(启用说话人分离时还会包含 speakers_in_range)。 |
search(job_id, query, speaker?, match_mode?) | 在转录文本和屏幕 OCR 文本中进行子串搜索。默认仍为 all_words;any_word 可扩大词汇召回范围。匹配结果包含 t_ms/t_wall、帧引用,以及启用说话人分离时的说话人信息。可选筛选器接受原始标签或已保存的姓名。 |
label_speakers(job_id, labels, evidence?) | 以原子方式为匿名说话人标签保存经过核实的姓名。原始 S1/S2 标签仍为规范标签;留空或设为 null 会移除姓名。 |
extract_frame(job_id, at_ms, crop?) | 当关键帧未捕捉到目标时刻时,从源视频中按精确时间戳重新提取全分辨率图像(可选裁剪);返回文件的绝对 path。URL 任务会从保留的源文件解码,不访问网络。 |
list_jobs() | 最近处理的录制内容,包括源路径、时长、墙上时钟开始时间、数量;启用说话人分离时还包括说话人数量;URL 任务则包括提供方/ID。 |
每个工具的描述都附带 10 个以上的用法示例,因此 Agent 无需额外提示就能选择合适的工具。
服务端提示词(MCP 客户端中的斜杠命令)
| 提示词 | 工作流 |
|---|---|
bug | 一段录制内容 → 有证据支持的 GitHub 问题草稿(静音、无旁白的录制也适用) |
triage-recording | 有旁白的录屏 → 精确的发现结果 JSON(按 bug/功能/问题分类,并提供帧证据) |
spec-from-workshop | 录制的研讨会 → 结构化规格说明,包含引用的决策和未解决问题 |
backlog-from-demo | 产品演示 → 带时间戳证据的优先级待办列表 |
meeting-actions | 会议音频 → 行动项、决策和未解决问题 |
correlate-with-logs | 录制中的发言 ↔ 按实际时间窗口匹配的系统日志 |
如果你的客户端不显示 MCP 提示词,相同的提示词也以纯文本文件形式存放在 examples/prompts/。
triage-recording 使用的发现结果规范是 examples/output-contract.schema.json。
也可作为技能使用(无需 MCP)
同一工作流也以跨引擎 Agent Skill 的形式提供,位于 .agents/skills/talkthrough/ — Claude Code、
Codex CLI($talkthrough)、Cursor、Copilot、Gemini CLI、Goose 和其他兼容 SKILL.md 的工具均可读取。未接入 MCP 的 Agent 可以直接使用
CLI:talkthrough-mcp process recording.mov --json 会打印与 MCP 工具返回内容相同的摘要,而且两种方式共用同一个任务存储。
实际时间锚定
一旦确定录制开始时间,每个带时间戳的结果都会包含 t_ms(相对于视频的时间)和 t_wall(ISO 8601 实际时间)。时间判定优先级如下:
recorded_at参数(Agent/用户覆盖值)→ 可信度exact- QuickTime
com.apple.quicktime.creationdate标签,包含本地时区(QuickTime Player 录制;macOS 26 之前由 ⌘⇧5 写入)→high - 容器
creation_time标签(UTC)→medium— macOS 26 及以上版本中,⌘⇧5/ReplayKit 屏幕录制会使用此标签(不再包含creationdate标签);若t_wall需要使用本地时区,请传入recorded_at= - 文件 mtime 减去时长(录制器会在录制结束时完成文件写入)→
low - 无法确定 → 工具仍可仅使用相对时间
t_ms
其重要性在于:「上传旋转图标卡在这里」可以转化为在服务器日志中搜索前后 ±30 秒的时间窗口。
说话者(可选说话人分离)
安装 [diarization] 附加组件后(每份生成的配置均包含该组件 —
参见快速入门),
process_media(diarize=true) 会标注说话者及其发言内容 — 所有处理均在本地完成
(使用 sherpa-onnx 运行时,不需要
torch、账号或 GPU):
- 说话人按首次出现的顺序依次标记为
S1、S2……;新的说话人分离任务会在词语边界处分割说话人变更,而旧任务仍会如实报告片段级精度。每个转录片段都有一个speaker,工具也会在各处展示它——get_transcript中包含发言时长的名单、get_moment中的speakers_in_range、search命中结果中的speaker、文本/SRT 格式中的S1:前缀,以及list_jobs中的说话人数。 - 知道人数?请传入
num_speakers。 以精确的 k 为目标进行聚类,可避免人数未知模式的主要故障:相似的声音被合并,或一个声音被拆分。它是目标,不是保证:聚类器收敛后的簇数可能少于 k;如果重新运行后没有任何变化,载荷会注明这一点(labels_changed: false)。Agent 会收到工具指南的指示,要求传入人数;你自己调用时也请这样做。 - 已经处理过录音? 对其调用
process_media(diarize=true)会仅重新运行说话人分离——不会重新运行 whisper,标签会写入现有任务。更改num_speakers也一样。说话人分离阶段仍会重新扫描完整音频:长录音需要数分钟。 - 完整重建不会影响已命名任务的安全性。 如果任务中有已启用或待审核的名称,
force=true还必须搭配diarize=true;否则调用会在更改已存数据前拒绝执行。成功强制重建时,会在暂存区完成重建,并将每个先前的身份移至待审核状态,以便与新名单核对。任何处理或提交失败都会保留之前的清单和帧。 - 标签初始为匿名。检查自我介绍、呼语或视频证据后,调用
label_speakers,即可在不同会话中保留已核实的映射,例如S1→ "Alice"。名单可以提供有范围限制的 OCRname_candidates,但这些只是原始提示,绝不会自动保存。原始标签会与speaker_name一同保留。如果后续说话人分离修订更改了标签,已核实的名称将不再处于启用状态,而会作为有范围限制的证据移至speaker_names_pending_review,不会被静默丢弃。请重新检查当前名单,并通过label_speakers明确确认或移除每个受影响的标签。 - 在 0.3.1 之前生成的视频任务会保留原有的扁平 OCR,并可能返回
name_candidates_note,以解释为何没有提示。无需迁移即可完整读取这些任务;force=true, diarize=true会重新生成带行信息的 OCR,同时保留已保存的身份供审核。
模型会从固定且经过校验和验证的 URL 下载一次(总计约 47 MB),保存到 ~/.talkthrough/models/;与流水线的其他部分一样,预热后的运行不会产生网络请求。在 M 系列 CPU(4 线程)上的速度:一场 26 分钟的会议约需 2 分钟完成说话人分离(RTF ≈ 0.08),不包括转录耗时。内存:对超过 1 小时的会议进行说话人分离时,预计峰值 RSS 约为 1–1.5 GB(在一段实际的 73 分钟录音上测得);阶段完成后会释放内存。
| 角色 | 模型 | 下载大小 | 权重许可 |
|---|---|---|---|
| 分段 | pyannote segmentation-3.0(由 k2-fsa 导出的 ONNX) | 7 MB | MIT |
| 嵌入(默认) | NeMo en_titanet_small | 40 MB | Apache-2.0(依据其 NGC 模型卡,即 NeMo Toolkit 许可证) |
| 嵌入(备选) | WeSpeaker en_voxceleb_resnet34_LM | 27 MB | CC-BY-4.0 |
| 嵌入(备选) | 3D-Speaker campplus_sv_en_voxceleb_16k | 30 MB | Apache-2.0 |
默认模型在真实会议接受度评估中胜出(RU/EN/ES,以及一场 3 位说话人、时长 26 分钟的会议):它是唯一能在 num_speakers=3 时分离出全部 3 位真实说话人的候选模型,速度是第二名的 2 倍。
通过 TALKTHROUGH_DIARIZATION_EMB_MODEL 选择其他嵌入模型(或者为离线机器指定自己的 .onnx 文件);通过 TALKTHROUGH_DIARIZATION_THRESHOLD 调整未知说话人数的敏感度(参见 docs/TROUBLESHOOTING.md)。坦诚的质量说明见 Limitations。
隐私
所有操作都在本地运行:录音不会离开你的机器,语音由本地 whisper 模型转录,OCR 和说话人分离通过本地 ONNX 推理完成,并且不会收集遥测数据。处理本地文件时,网络仅用于一次性下载工具和模型(ffmpeg 构建版本、whisper 模型、OCR 模型、说话人分离模型——后者由 URL 和 sha256 固定)。唯一有意进行的例外是 process_url:它会从你指定的提供商或 CDN 下载公开来源内容,仅此一次,除此之外不会进行任何操作——不会上传媒体,不会调用云端 STT 或大模型;下载完成后,该任务中的所有工具都将再次不使用网络。原始 URL(可能包含签名令牌)不会保存:任务只保留哈希、公开的提供商 ID 或主机名,以及长度受限的标题。说话人分离不会保留声纹数据库:语音嵌入仅存在于进程内存中,只有匿名轮次标签(S1/S2)会写入磁盘。你的 Agent 只能在现有会话中看到 MCP 工具返回的负载(文本和选定帧);talkthrough 本身不会调用大模型。
语言
Whisper 支持的约 99 种语言都可用于旁白:系统会自动检测每段录音的语言,摘要会同时报告 language 和 language_probability,让 Agent 判断检测结果是否可靠(开头的静音或音乐可能干扰检测——遇到这种情况,可设置 language="ru" 并指定 force=true)。说话人分离基于声学特征——它识别的是声音,而非词语——因此与语言无关,在所有这些语言中都能正常工作。
根据所需语言选择模型——可以逐次调用(model= 参数,转录结果不通顺时,Agent 会自行调整),也可以设置服务默认值(TALKTHROUGH_WHISPER_MODEL):
| 模型 | 大小 | 最适合 |
|---|---|---|
small(默认) | 464 MB | 在 CPU 上处理英语和主要语言的旁白 |
large-v3-turbo | ~1.5 GB | 非英语推荐——接近 large 的质量,速度接近 small |
medium | ~1.5 GB | turbo 的保守替代方案 |
tiny / base | 75–145 MB | 快速草稿、CI |
*.en 变体 | — | 仅限英语,速度稍快、效果稍好 |
适用于所有语言的提示:通过 vocabulary="Term1, Term2" 提供产品名称(可引导解码器保留术语);还请注意,工作流提示词要求 Agent 使用旁白所用的语言撰写摘要,同时逐字保留引文——服务不会翻译(精确引文是证据;翻译是 Agent 的工作)。
屏幕文字(OCR)默认使用 RapidOCR 的拉丁字母和中文模型。识别其他文字系统时,请将 TALKTHROUGH_OCR_LANG 设为对应语言——ru/uk(→ eslav 包)、ja、ko、ar、hi、el、th,或任何 RapidOCR 包名称(例如 cyrillic)——然后使用 force=true 重新处理;相应的识别模型只会下载一次。无论选择哪种设置,都不会影响语音语言支持。
配置
| 环境变量 | 默认值 | 含义 |
|---|---|---|
TALKTHROUGH_WHISPER_MODEL | small | 默认的 whisper 模型(tiny/base/small/medium/large-v3/large-v3-turbo);model 工具参数可覆盖每次调用的设置 |
TALKTHROUGH_OCR | on | 设为 off 可跳过 OCR |
TALKTHROUGH_OCR_LANG | Latin+Chinese | 屏幕文本的识别脚本:语言代码(ru、ja、ko、ar、hi 等)或 RapidOCR 包名称(eslav、cyrillic、latin 等);模型只需下载一次 |
TALKTHROUGH_OCR_PARAMS | — | 高级设置:原始 RapidOCR 参数的 JSON 对象,会合并到派生参数之上,例如 {"Rec.lang_type": "cyrillic"} |
TALKTHROUGH_DIARIZE | off | 设为 on 可默认启用说话人分离(需要 [diarization] 额外依赖;若未安装则会降级并发出警告);显式指定的 diarize 工具参数始终优先 |
TALKTHROUGH_DIARIZATION_THRESHOLD | 0.5 | 未知 num_speakers 时的聚类灵敏度:检测到的说话人数少于预期时调低;多于预期时调高 |
TALKTHROUGH_DIARIZATION_SEG_MODEL | pyannote-segmentation-3-0 | 分段模型:允许列表中的名称或本地 .onnx 路径(离线预置) |
TALKTHROUGH_DIARIZATION_EMB_MODEL | nemo_en_titanet_small | 嵌入模型:允许列表中的名称(参见说话人)或本地 .onnx 路径 |
TALKTHROUGH_DIARIZATION_THREADS | min(4, cpus) | 两种说话人分离模型使用的 ONNX 线程数 |
TALKTHROUGH_MAX_SECONDS | 7200 | 媒体时长上限(process_url 下载前也会根据提供方元数据进行检查) |
TALKTHROUGH_MAX_FRAMES | 600 | 每个任务的关键帧预算,分布于整个时长范围内(长录制中,1 秒的选择间隔下限会自动增大到 duration/budget) |
TALKTHROUGH_MAX_DOWNLOAD_BYTES | 2147483648(2 GiB) | 单次 process_url 下载的硬性上限,在传输前和传输过程中都会执行 |
TALKTHROUGH_HOME | ~/.talkthrough | 任务存储根目录(URL 任务会将下载的源文件保存在 jobs/<id>/source/ 下) |
命令行
该流水线也提供命令行接口,适合在 Agent 会话之外预处理长录制内容(存储采用内容寻址,因此 Agent 随后可以即时查询同一任务):
talkthrough-mcp process ~/Videos/long-session.mov # prints the summary
talkthrough-mcp process demo.mov --json # machine-readable
talkthrough-mcp process sync.m4a --diarize --num-speakers 3 # who said what
talkthrough-mcp process-url "https://youtu.be/nHfGfEiVdE8" # one public URL, downloaded once
talkthrough-mcp gc --keep-days 30 # clean the job store (sources go with their jobs)
talkthrough-mcp serve # stdio MCP server (default)
talkthrough-mcp --version # package version + which extras this environment has
--json 也会在失败时保持标准输出为机器可读格式(0.4.1),包括缺少参数或选项未知的情况:进程以代码 2 退出,标准错误输出人类可读的 error: … 行,标准输出则包含一个 JSON 文档:{"error": {"type": "UnsupportedUrlError", "message": "…"}}。--version 还会显示环境中有哪些可选依赖——当手写的配置启动了最小化服务(未安装 url 额外依赖的启动器)时,这是最快的检查方式。此类服务会声明支持 process_url,但只能读取直接媒体链接;服务每次启动时也会在标准错误中输出同一行。
首次运行说明:如果缺少系统级 ffmpeg,会下载一次 static-ffmpeg;首次转录时会下载 whisper 模型(small 约为 460 MB);两者都会缓存。之后,使用默认模型时,在 Apple Silicon CPU 上的处理速度约为实时速度的 3 倍,且包含 OCR(处理一段 2 分钟的片段约需 40 秒);同一文件再次运行则会即时完成。进度会以 MCP 进度通知的形式流式输出,命令行接口会打印各阶段的行。更多信息:docs/TROUBLESHOOTING.md。
Windows
CI 会在 windows-latest 上运行 lint、单元测试套件、完整的命令行接口冒烟测试和说话人分离冒烟测试(使用 Windows 版 static-ffmpeg、whisper tiny 转录、OCR、即时幂等重跑,以及通过原生 sherpa-onnx 技术栈断言说话人名单)。注意:每个任务的锁始终会串行化线程;POSIX 还会使用 fcntl 进行跨进程锁定。路径含空格时请加引号(uv run talkthrough-mcp process "C:\Videos\Screen Recording.mp4")。如果遇到问题,请提交 issue。
支持的输入
视频:.mov .mp4 .webm .mkv .ogv — 仅音频:.m4a .mp3 .wav .ogg
.flac(仅适用于转录工具;帧工具会说明其不可用的原因)。
URL(通过 process_url,自 0.4.0 起支持):指向上述媒体文件之一的直接 https:// 链接;一个公开视频 YouTube 视频(watch、youtu.be、shorts、已结束的直播);或 yt-dlp 可读取的任何公开视频页面——公开视频 Instagram Reels、TikTok、Wikimedia Commons 文件页面(均在发布当天经过验证)、yt-dlp 其余约 1800 个站点提取器支持的内容,以及带有纯 HTML5/HLS 播放器的页面(上文生成的配置已包含 [url] 附加项,它会引入 yt-dlp)。始终匿名访问:若某个站点要求匿名客户端登录(此处使用的 yt-dlp 无法访问 Vimeo),则会说明原因并拒绝。源文件只下载一次,保存在任务中,之后的问题不会再次获取。以下内容不受支持:播放列表、频道、正在进行的直播、私人视频、会员专享视频、年龄限制视频或受 DRM 保护的视频、Cookie 或登录信息——若某个站点将视频隐藏在登录页或机器人拦截墙之后,系统会明确拒绝,而不会尝试绕过限制(尤其是 Instagram 会限制匿名访问频率)。你有责任确保自己有权下载和处理所指向的内容;talkthrough 不会绕过任何限制。
限制
了解这些实际限制,方便你快速判断:
- 说话人标签按词标注,新任务中默认选择启用。 每个 Whisper 单词都会按与说话人分离轮次的最大重叠度进行分配,因此即使快速交替发言会被拆分,原始标签也会保留。旧任务仍可读取,并会如实报告
attribution_precision="segment";使用force=true重新处理即可添加词级时间戳。如果说话人分离引擎未检测到独立轮次,短于一秒的插话(“yeah”“mhm”)仍可能被合并;严重串话也会降低聚类质量(分割模型最多跟踪 2 个同时发声的人)。质量相当于 pyannote-3.x-generation。未提供提示时,较适合处理约 2–8 位说话人;已知人数时请传入num_speakers——无论人数多少,它都能消除最严重的失败模式,也是处理大型会议(10 人以上)的推荐方式。 - URL 导入每次只处理一个公开视频,且不支持登录。 支持直接 HTTPS 媒体链接、单个公开视频 YouTube 视频,以及 yt-dlp 可读取的公开视频页面;播放列表、频道、直播、受限或受 DRM 保护的内容,以及任何隐藏在登录页或机器人拦截墙之后的内容,都会被拒绝并说明原因。站点可能会发生变化;昨天可用的页面,明天可能需要更新版 yt-dlp。服务提供商的上传日期并非录制时间,因此除非容器带有可用的创建时间戳,或你传入
recorded_at,否则 URL 任务的wall_clock为null。绝不会使用下载文件的修改时间。 - 内存:冷启动运行预留约 2 GB。 Whisper、OCR 模型和帧处理会在同一个进程中运行。在 0.4.0 发布前的 QA 测试中,使用
tiny模型和 OCR 处理一段 78 秒视频时,RSS 峰值为 1.6 GB(包括下载);默认的small模型需要更多内存,更大的模型也会按比例增加。8 GB 笔记本可以应付;内存更紧张时,请使用较小的模型,或在 Agent 会话开始前运行 CLI。 - 关键帧 + 转录,不做运动分析。 场景切换之间的故障可能不会出现在帧集中;
extract_frame可以重新检查任意时刻,但逐帧运动推理应由多模态模型负责。 - STT 质量取决于你选择的模型。 默认的
small优先考虑速度;非英语旁白建议使用model="large-v3-turbo"(参见语言)。 - OCR 擅长读取清晰的界面文字; 对微小或低对比度文字只能尽力识别。
- 挂钟时间的可信度取决于录制器元数据——最差情况下请传入
recorded_at=(参见上文的逐级说明)。 - Windows 注意事项——POSIX 锁会退化为无操作;参见上文的 Windows 部分。
对比情况
| talkthrough | 云端录制 SaaS | 会议记录工具 | 典型的视频分析 MCP | |
|---|---|---|---|---|
| 完全在本地运行 | ✅ | ❌ | ❌ | 不定 |
| 支持任意本地视频/音频文件 | ✅ | 通过浏览器/应用捕获 | 仅限会议 | ✅ |
| 公开视频 URL:下载一次,与任务一同保留,并在本地分析 | ✅ | 不适用 | 不适用 | 临时下载,通常在云端分析 |
| 按挂钟时间锚定(日志关联) | ✅ | ❌ | ❌ | ❌ |
| 标注说话人及其发言内容 | ✅ 本地处理,可选择启用 | 部分支持 | ✅ 云端 | ❌ |
| 附带 Agent 工作流(提示词、技能、发现结果规范) | ✅ | ❌ | ❌ | ❌ |
| 对屏幕文本进行 OCR,并支持搜索 | ✅ | 部分支持 | ❌ | 少见 |
常见问题
为什么不直接把视频上传给多模态模型(例如 Gemini)?
对于短小且不敏感的视频片段,可以这么做。视频越长、敏感度越高,取舍就越明显:一小时的屏幕录制每个问题大约需要一百万个 token,文件会离开你的设备,而且你仍然无法将某条备注对应到 14:32:07 UTC,以便搜索服务器日志。talkthrough 会先在本地建立一次索引,然后你可以基于该索引回答任意数量的后续问题。
为什么不用 screenpipe?
用途不同。screenpipe 会持续录制你的设备,从现在开始(商业许可证)。它无法打开队友或客户刚发给你的 .mov 文件。talkthrough 可以分析交给它的任何文件——两者可以很好地配合使用。
已经有能“观看”视频的 Agent 技能。为什么还需要带索引的服务? 这类技能会将受预算限制的帧转储到上下文窗口中(长视频通常会稀疏抽帧),往往还会调用云端 STT 处理音频,而且不会保留任何内容。talkthrough 会建立持久的本地索引——包含可全文搜索的转录文本和 OCR 内容——按需检索精确帧,将所有内容锚定到实际时间,并能在不重新处理视频的情况下回答下一个问题。
我用 Jam 提交 Bug 报告——还需要这个吗? 浏览器 Bug 继续用 Jam:录制时捕获的控制台和网络信息是很好的证据。talkthrough 能处理浏览器扩展无法覆盖的内容——桌面应用、移动设备录屏、运维事故、会议以及任何文件,而且无需账号,还能通过实际时间与服务器端日志关联。
需要用哪种 Agent 模型来驱动它?
在 v0.4.0 中,以下六种模型配置对 URL 摄取运行了 61 个隔离的行为测试单元(YouTube、TikTok 页面、没有语音的 Instagram 短视频、拒绝处理播放列表以及缺失实际时间的问题),还测试了 0.3.2 的完整性修复;首次尝试暴露出两个产品问题并修复后,每种模型配置下的每个测试单元都通过了(Codex 需要为开放式的 process_url 逐个工具授权,服务现在会在 URL 任务缺少实际时间时自行说明)。在 v0.3.0 中,我们使用 6 种模型配置(Claude haiku/sonnet/opus、两种推理强度下的 Codex gpt-5.5,以及 gpt-5.4-mini)运行了 210 个隔离的 Agent 测试单元,覆盖 5 段真实录制、35 个逻辑场景,以及安全性和说话人标签测试样例。所有 102 项由大模型判定的完整网格结果和每一项机械校验零分都经过人工审查;新增的 30 项说话人行为测试均已通过,旧版服务对照测试确认没有由此版本导致的回归。这是一份模型漂移快照,而非排行榜:请参阅 docs/MODEL-NOTES.md 中的当前矩阵。benchmarks/ 中的图表和说明仍是历史 v0.2.0 快照。
我不能直接用 ffmpeg + whisper 编写脚本吗?
可以——这正是这条处理流水线的做法。你需要自行重建的内容包括:带感知去重的场景变化检测、OCR、转录文本与 OCR 搜索、实际时间处理链、内嵌用法示例的 MCP 工具、六个工作流提示词,以及发现结果规范。只需运行一条 uvx 命令,不必花一下午拼接各种工具。
这真的完全在本地运行吗?有什么内容会离开我的设备?
不会有任何内容上传。处理本地文件时,网络仅用于一次性下载(ffmpeg 构建版本、whisper/OCR/说话人分离模型)。process_url 是唯一会在运行时访问网络的工具,而且只会下载:它会获取你指定的公开来源,且只获取一次。没有遥测。请参阅隐私;SECURITY.md 将违反这一承诺视为安全漏洞。
面向 Agent 和工具
机器可读的入口,方便 AI Agent 无需人工阅读文档即可安装和使用此服务:
llms-install.md— 面向 Agent 的分步安装说明llms.txt— 文档索引.agents/skills/talkthrough/SKILL.md— 教授工具工作流的 Agent Skill;Codex CLI($talkthrough)会在检出目录中自动发现此文件,Claude Code、Cursor、Copilot、Gemini CLI 及其他兼容 SKILL.md 的工具也可读取AGENTS.md— 面向为此仓库贡献代码的编码 Agent 的说明server.json— MCP 注册表清单integrations/— 各引擎适配器,均由单一事实来源生成并经过漂移测试(包括integrations/claude-code/中的 Claude Code 插件)docs/URL_ACCEPTANCE_CORPUS.md—process_url发布 QA 所用的实时 URL 语料库(需手动运行,需要网络;CI 保持离线)
路线图
云端 STT · 嵌入/语义搜索 · 托管/远程模式 · .mcpb 包 · whisper.cpp 后端
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。