Community写作与编辑github.com

px-summarize-transcript

将会议转录稿转化为有据可查的决策、实质性声明、行动项和未决问题,附带说话人归属、时间戳证据和关联文件包,支持系列会议追踪。

px-summarize-transcript 是什么?

px-summarize-transcript 是一个 AI 助手技能,专门用于从会议转录文件(支持 .vtt、Teams 粘贴的 .txt 或 .md 格式)中提取结构化信息。它生成包含决策、实质性声明、行动项和未决问题的报告,每个条目都引用说话人、时间戳(如果转录中有)以及逐字原文引用。该技能支持行动项的所有者分配(显式、自愿、委派或推断),并能追踪系列会议中从上一次会议延续下来的项目。它适用于 Claude Code 等终端型 AI 代理,通过一系列 Python 脚本(位于 `./scripts/`)实现机械化处理:解析转录、构建说话轮次索引、生成报告、验证引用一致性并最终打包文件。用户通过命令如 `/px-summarize-transcript` 或自然语言提示来触发,脚本会创建与源文件同名的文件包(包括 .turns.md、.summary.md 等),并支持将转录归档到系列文件夹中。该技能的核心价值在于将模糊的会议对话转化为可审计、可操作的文档,帮助团队明确谁说了什么、决定了什么、下一步要做什么。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/prodagenx/px-summarize-transcript/tree/HEAD

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

px-summarize-transcript 是做什么的?

将会议转录稿转化为有据可查的决策、实质性事实陈述以及谁负责下一步。每个条目都引用说话人、时间戳(如果转录中有)以及逐字原文引用。Python 脚本负责机械化工作:解析、文件命名、前言生成和引用校验。你负责推理。

使用时机

  • 有 .vtt 文件、粘贴到 .txt 或 .md 中的 Teams 转录、[说话人] YYYY-MM-DD HH:MM:SS 格式的 Markdown 转录,或 姓名: 文本 行,需要从中提取决策和行动项。
  • 有人问谁说了什么、达成什么共识、或谁负责后续工作。
  • 有人问在周期性系列会议中上一次会议有哪些未决问题。
  • 会议成果需要与项目文档进行比对。

文件包布局(固定)

所有文件都位于转录稿自己的文件夹中,并使用相同的文件名。只有后缀不同。你不能将它们写入其他位置。如果用户要求使用其他文件夹,请解释文件包必须与转录稿在一起。file_transcript.py 可以将整个文件包移动到系列文件夹中,且其中的成员始终一起移动。

文件角色
<stem>.vtt / .txt / .md源转录稿。.md 和 .txt 会在原地合并前言;现有键值不会更改。
<stem>.source.md仅用于 .vtt:一个小的 Markdown "侧车"文件,存放 .vtt 的前言,因为 .vtt 文件必须以 WEBVTT 开头,无法存放前言本身。
<stem>.turns.md说话轮次索引。创建一次;除非传递 --rebuild,否则不会重写。
<stem>.summary.md报告。重新运行时写入 <stem>.summary.v2.md、.v3,依此类推。

格式和键: 输入格式, 前言规范。

操作步骤

脚本位于此 SKILL.md 旁边的 ./scripts/ 中。终端起始于用户的工作区,因此请先解析技能文件夹的绝对路径(个人安装通常在 ~/.claude/skills/px-summarize-transcript 或 ~/.agents/skills/px-summarize-transcript),并在每个终端中设置一次:

$S = "<此技能的绝对路径>\scripts"      # PowerShell
S="<此技能的绝对路径>/scripts"          # bash / zsh

下面的命令使用 PowerShell("$S\build_turns.py")。在 bash 中,写成 "$S/build_turns.py"。脚本仅使用标准库(Python 3.10+)。路径请加引号,因为文件名常包含空格。

一次只处理一个转录。对于文件夹或“所有待处理”,请参见多个转录。

  1. 归档转录稿(可选)。 在用户提出要求时执行,或者当工作区将转录稿放在系列文件夹中(例如 transcripts/<系列>/)且此转录稿尚未在其中时执行。--root 默认为 ./transcripts。

    python "$S\file_transcript.py" --list --root "<根目录>"
    python "$S\file_transcript.py" "<转录稿>" --series "<系列>" --root "<根目录>"
    

    重用适合该会议的现有系列。如果没有合适的,提出一个简短的短横线命名名称,并在创建前请用户确认。然后根据 status 执行操作:

    • moved:继续使用新的 source 路径。
    • already-filed:转录稿已经在根目录下的文件夹中,或在与系列同名的文件夹中。未移动,继续。
    • duplicate:相同转录稿已存在于 duplicate_of。停止并询问用户处理哪个副本。不要删除任一文件。
    • conflict(退出码 2):系列文件夹中已存在一个同名的不同文件。停止并询问。
  2. 构建说话轮次索引。

    python "$S\build_turns.py" "<转录稿>"
    

    它检测格式,如果 <stem>.turns.md 尚不存在则写入,标记来源(或侧车文件),并打印 JSON。请保留 turns_path、turns_status、summary_path、has_timestamps、speakers、meeting_date、meeting_date_source、gaps、previous_meeting_summary和 transcription。

    • turns_status: created 或 kept:继续。kept 表示现有的说话轮次索引已经与转录稿匹配,因此未重写任何内容。
    • turns_status: source-changed(退出码 3):转录稿在说话轮次索引构建后被编辑过,现有报告引用的是旧的轮次 ID。停止并询问用户是否使用 --rebuild 重新运行。
    • 不支持的格式错误(退出码 2):告知用户支持的格式并停止。
    • meeting_date 为 null:写入“未注明”,除非用户提供了日期。
  3. 完整阅读说话轮次索引,以较大的块直到末尾。切勿从部分读取中提取内容。

  4. 映射说话人。 为报告的说话人表格中的每个说话人标签制作一行:标签、显示名称以及你是如何识别出来的。

    • 仅在有证据的情况下显示不同的名称:该人被直呼其名、自我介绍、或标签明显是拼写错误。记录证据。
    • 会议室设备标签保持为该房间。列出在该设备上听到或提及的人,除非转录稿明确无误,否则不要将其话归属于某一个人。
    • 仅出现在 Transcription: 标题行中的人已出席但未必发言。
    • 列出被提及但未发言的人,并注明在何处被提及。
    • 仅在无歧义时才将名字解析为全名。
  5. 提取条目,使用以下测试:

    • 决策: 在选项之间做出或接受了选择(“我们就采用”、“已同意”、“我们会做”,或没有反对意见的提议)。状态:已同意、暂定、已提议。
    • 实质性声明: 如果错误会改变范围、设计、进度、成本或风险的内容:关于系统的事实、约束、依赖关系、数字、日期、承诺、已声明的风险。非闲聊或复述。最多 12 条,通过合并相关声明来达成。
    • 行动项: 带有动词的未来任务,被要求或自愿承担(“我会”、“你能”、“我们需要”)。
    • 未决问题: 被提出但在会议转向下一个话题前未解决。
  6. 为每个行动项分配所有者。 所有者可以是任何被指名的人,包括缺席者。

    • 显式: 被指名并要求,未拒绝。
    • 自愿: 说话人说“我会……”。
    • 委派: 分配给缺席或沉默的人。标记为 (未出席) 并注明由谁分配。
    • 推断: 基于所述角色或所有权推断而来。写出推理过程。
    • 未分配: 以上都不是。切勿虚构所有者。

    仅当有人说出了截止日期时才记录。

  7. 为每个条目附加证据:

    • 有时间戳:[T042 00:12:31 说话人] “逐字引用”。
    • 无时间戳(has_timestamps: false):[T042 说话人] “逐字引用”。
    • 说话人 是说话轮次索引中确切的标签,即使说话人表格显示了不同的名称。在其他所有地方使用显示名称。
    • 引用不超过 25 个词,逐字复制,包括 ASR 错误。省略部分使用 ...。当决策跨越多个轮次时,引用多个轮次。
  8. 检查延续项(仅当设置了 previous_meeting_summary 时)。仅读取该报告的“行动项”和“未决问题”表格。对于每个条目,根据本次转录判断其为“已完成”、“进行中”、“仍开放”、“已放弃”或“未提及”,并引用显示该状态的轮次。除非有人说完成,否则切勿将条目标记为“已完成”。

  9. 将报告写入 summary_path,使用模板。仅写正文;不要添加前言。始终填写“概览”。仅在用户指定了读者时才添加“致 <姓名>”,例如“给我,我是 Dana Ruiz”。切勿假设读者是谁。

  10. 标记转录说明: 可能的 ASR 错误,你通过推断映射的说话人名称,以及 gaps 中的每个条目(可能缺少内容)。切勿静默纠正引用。

  11. 验证引用,修正或删除所有失败的行,直到通过:

    python "$S\verify_quotes.py" "<summary_path>"
    
  12. 完成文件包。 从会议内容中导出简短标题和 3 到 6 个主题标签(小写,短横线命名)。transcript 和 meeting-notes 会自动添加。

    python "$S\finalize_bundle.py" "<转录稿>" --summary "<summary_path>" --title "<标题>" --tags "标签一,标签二" --alias "转录中的标签=显示名称" --mentioned "姓名 (上下文)" --meeting-date YYYY-MM-DD
    
    • --alias 对你在步骤 4 中映射的每个说话人标签重复一次。与会者随后默认为显示名称。
    • --mentioned 对每个人重复一次。
    • --attendee "姓名" 在需要覆盖与会者列表时对每个人重复一次。--attendees "A, B (room: C, D)" 同样有效,因为 () 或 [] 内的逗号不会分割。
    • 仅当 meeting_date 为 null 且用户提供了日期时才传递 --meeting-date。
  13. 在聊天中简短回报。 不要粘贴表格。

    • 计数:决策、声明、行动项、未决问题以及延续项。
    • “概览”中的要点。
    • 任何需要人工检查的内容:推断的说话人名称、推断或未分配的所有者、缺口和 ASR 问题。
    • 报告和说话轮次索引的链接。

多个转录

python "$S\scan.py" "<文件夹>" --recursive

它会列出每个转录,状态为 new、turns-only、summarized 或 not-a-transcript。向用户显示待处理的转录(new 和 turns-only),并在开始前确认。一次处理一个,按会议时间从早到晚排序,以便每个转录都能在其系列中找到上一个会议。对每个转录执行完整操作流程,并在开始下一个之前回报。

相关项目文档

如果工作区有相关的架构或计划文档(包括其他文件包的摘要文件),请填写可选的“相关项目文档”表格。注明每个条目是确认、矛盾还是扩展了这些文档的记录。

质量检查

  • verify_quotes.py 通过,失败数为 0。
  • 说话人表格为说话轮次索引中的每个标签都有一行,并且每个名称映射都说明了其证据。
  • 没有所有者在没有显式、自愿、委派或解释的推断证据的情况下被命名。
  • 标记为“已同意”的决策显示接受信号,而不仅仅是建议。
  • 观点和推测被明确标记。
  • 未出席会议的所有者标记为 (未出席)。
  • gaps 中的每个条目都出现在“转录说明”下。
  • 当有上一次会议时,其每个行动项和未决问题都有“延续项”行。

遗留文件包

要对齐旧文件包(例如 input.txt 与 <folder>.turns.md 相邻),先运行 python "$S\backfill.py" "<根目录>" 进行试运行,然后加上 --apply。之后对每个文件包运行 finalize_bundle.py,附带标题和标签。Backfill 不会重新生成现有的说话轮次索引,因此现有引用仍然有效。

相关技能