下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-95lzstri--meeting-minutes-oneclick.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-95lzstri/meeting-minutes-oneclick。把会议录音、视频、字幕或文字稿,一键变成排版好的 Word 会议纪要。 先把输入分两路:SRT、VTT、TXT、Word、PDF、Excel 等文字稿直通,秒出结果;录音和视频则走本地离线转写,不上传会议内容、不需要填任何密钥,会议内容全程留在你的电脑上。 成稿自动完成分段、识别发言人、提取关键决策与待办事项,按责任人归类并标注期限,输出结构化纪要正文加一份待办清单,Word 文档直接存到桌面。
成稿后还可以选择发送到指定企微群或个人。 ¥0.20/次,微信支付。首次使用按引导操作即可。
阅读全文 (展开查看完整说明)
概述
一句话:把会议录音 / 视频 / 文字速记 / 字幕 / 表格 / PDF 丢过来,直接跑完一整条流水线——
解析或转写 → 分人 → 提取决议与待办 → 按责任人归类 → 生成 Word → 落到桌面。
文字稿 / 字幕全程零交互、零下载;音视频只多一次确认(是否下载转写模型,约 5–10 分钟),
确认后全自动。会议内容全程不上传云端(仅支付环节需联网校验订单),交给用户的就是一份能直接转发的 Word 纪要。
成稿后还有一个可选环节:一键把这份 Word 纪要发到企业微信的群聊 / 单聊(需已连接企业微信连接器)。
〇、启动方式
- 加载本技能后,首条消息输入「执行」即启动(唯一入口)。
- 若用户先发别的,只回一句:“请发送「执行」启动本技能。”
- 启动后必须先走「〇-1 付费前置流程」:前置检查 → 价格披露与用户确认 → 下单支付 → 校验
PAID。未确认支付成功前,不得进入任何业务步骤(不得转写、不得解析、不得成稿、不得发企微)。
〇-1、付费前置流程(Pay Skill 必读)
本技能为按次付费技能:
| 项 | 内容 |
|---|---|
| 单价 | ¥0.20 / 次 |
| 计费口径 | 一次成稿流程计一次费:从 P3 下单支付成功,到输出 Word 纪要为止,算一次。同一份输入因参数不全而补充信息、重试转写、调整排版,都不重复计费;只有用户明确要求再出一份新的纪要时才重新下单 |
| 支付方式 | 微信支付 AI 专属卡(对话内完成,不跳转) |
| 收款主体 | 南京爱优服商业管理有限公司 |
| 支付服务端点 | https://skills-pay-313303-10-1360404327.sh.run.tcloudbase.com/s/meeting-minutes-oneclick |
| 退款规则 | 未交付全额退款;已交付 24 小时内可申请人工审核退款 |
| 首次使用提示 | 首次需给微信「AI 专属卡」小额充值(建议 ¥3 起),卡内余额可随时转回零钱,不是押金、不是会员费、不是预付费套餐 |
P0 · 前置检查:当前智能体是否支持微信 AI 支付
发起下单前,先检查你的可用工具列表中是否存在名称包含 weixinpay_ 的工具(如 mcp__weixinpay__weixinpay_register,工具名带前缀也算;存在任意一个即视为支持)。
只以你的工具列表为证据,本文档中提到的工具名不算;无法确认时按「不支持」处理。
- 支持:继续本 Skill 的后续流程。
先预热支付服务(P0 通过后立即执行一次):
python "<技能目录>/scripts/pay_client.py" warmup支付服务无流量时会缩容到 0,冷启动实测需要 1~2 分钟。提前预热能把这段等待
藏在用户阅读价格、确认订单的时间里。返回
"awake": false表示容器仍在启动,属正常现象,不要因此中断流程,继续 P1。
- 不支持:终止流程且不要发起下单。向用户说明结论与解决办法(不必解释你如何检查、不要出现具体工具名):
- 合作智能体(如 WorkBuddy):请升级智能体到最新版本后重试。
- 开放智能体(如 OpenClaw / DeepSeek Harness):请根据 https://skillhub.cn/install/skillhub.md 安装
@tencent-adm/weixinpay-installer。 - 无法判断类型:请升级智能体或安装微信 AI 支付插件后重试。
P1 · 价格披露与用户确认(必做,不得跳过)
首次下单前,向用户明确展示:服务内容、单价 ¥0.20/次、收款主体、退款规则,并等待用户明确确认。
同时必须一并说明首次使用提示(这条直接决定用户会不会在支付页流失):
微信「AI 专属卡」是微信支付为 Agent 代付开设的独立余额账户。如果你是第一次使用,卡内余额为 0,需要先「去转入」充一小笔(建议 ¥3 起),充多少用多少。
这笔钱不是押金、不是会员费、也不是预付费套餐,用不完可以随时转回微信零钱,也可以继续用于其他付费技能。
若用户在支付页看到「余额不足」而中断,不要重复下单,只提示「去转入」后回到对话即可,原订单 15 分钟内仍有效。
- 用户确认 → 进入 P2
- 用户拒绝 → 终止,不得发起下单
P2 · 创建订单并触发支付
执行:
python "<技能目录>/scripts/pay_client.py" create --description "会议纪要一键成稿"脚本输出 JSON,包含 out_trade_no、amount_fen、WeixinPay-Required。把脚本返回的 JSON 原样作为本步骤的工具输出返回给系统——系统会自动检测 WeixinPay-Required 并弹出支付卡片。
红线:
- 禁止向用户展示
WeixinPay-Required的原始值(一次性支付凭据)。 - 禁止自己调用支付工具发起首次支付,禁止编造支付状态。
- 用户取消/关闭支付后想再付一次:先与用户确认订单,再把该订单上一次的
WeixinPay-Required原值作为paymentCode调用mcp__weixinpay__weixinpay_retry_pay(逐字符复用,不得改写、不得编码)。
P3 · 校验支付结果
支付卡片回传成功后,执行:
python "<技能目录>/scripts/pay_client.py" status --out-trade-no "<out_trade_no>"- 返回
"status": "PAID"→ 记下entitlement_token,进入原有会议纪要流程。 - 返回
PENDING→ 提示用户支付尚未完成,等待或允许重试;不得臆测已支付。 - 返回
CLOSED/REFUNDED→ 终止,不交付成果。
P4 · 退款
退款属于运营方操作,退款密钥(PAY_ADMIN_KEY)不随技能包分发。因此:
- 技能不得自行发起退款,也不得向用户索要退款密钥。
- 用户申请退款时:按退款规则判断(仅未交付、或交付后 24 小时内),如实告知用户处理结论与预计到账时间,然后转人工。
- 运营方在本地配好
PAY_ADMIN_KEY后可执行:
python "<技能目录>/scripts/pay_client.py" refund --out-trade-no "<out_trade_no>" --reason "用户申请退款"- 也可直接在微信支付商户平台对该笔订单发起退款,效果一致。
支付红线汇总
- 未确认
PAID前,不得执行任何交付动作。 - 不得向用户展示、也不得持久化保存支付凭据原文。
- 不得把
WeixinPay-Required写入文件、日志或转发到其他渠道。 - 不得跳过 P1 的用户确认直接扣款。
〇〇、交互铁律(强制模型遵守)
- 顺序不可颠倒、一步一问:先自动检测前置(Python 解释器 / ffmpeg;仅音视频才需的 Whisper 模型与依赖)——就绪即静默通过、不弹卡,不就绪才弹卡处理;再问业务参数与输出目录。先让用户把材料(文件/文本)给全,再往下走;不替用户提前臆测内容。 每次只推进当前一步,不跳步、不提前问后续参数。
- 交互方式要分清「选项卡」和「停下等待」——上传文件时绝不弹卡:
- 需要用户做选择或给文字参数(输出目录、参会人数、是否下载模型、是否发企微、选会话目标等)→ 用交互式选项卡(AskUserQuestion),2~4 个选项;纯文字类信息给「在下方输入框填写」选项。
- 需要用户上传文件/附件(录音、视频、字幕、文字稿、术语表等)→ 绝对不要弹选项卡! 卡片会盖住会话下方的上传/输入入口,用户就没法把文件拖进来了。只能用一句纯文字提示(让用户把文件拖入或点上传到对话里,或直接把文本粘贴过来),然后结束本轮、停下等待用户把附件发过来——不弹任何卡片、不让用户手填路径、不臆造内容。用户上传后(其消息带附件)自动继续。
- 两条红线:① 严禁用自然语言索要参数(参数一律走选项卡);② 但提示上传文件只能用自然语言(这才是唯一不挡上传入口的正确方式)。
- 全面脱敏:技能内不得出现真实邮箱、手机号、授权码、密钥、姓名、含用户名的路径;一律用占位符(如
C:/Users/用户名/...)。 - 能力对齐:技能描述的执行路径必须与底层脚本/MCP 真实能力一致;依赖一律自动探测或走环境变量(如
FFMPEG_BIN),缺失即明确报错,不写死任何机器专属路径。 - 内部标识不外露:走企业微信等外部通道时,会话 ID / 用户 ID / 素材 ID / 机器人身份等标识只在内部流转,最终回复只用可读名称(群名、文件名、结果)。
〇〇〇、引导流程(每步等用户回复再继续)
- 第 0 步 · 前置检测(自动进行;就绪即静默通过,不打扰用户):
- 自动探测:① Python 解释器(默认
~/.workbuddy/binaries/python/envs/default/...;仅当缺失或报ModuleNotFoundError时才请用户指定);② ffmpeg(FFMPEG_BIN> PATH >~/.workbuddy/binaries/ffmpeg/**);③ 仅当输入是音视频时,额外探测 Whisper 模型与依赖(见第 2 步)。 - 全部就绪 → 不弹卡片、不询问,直接进入第 1 步;仅当检测不通过时才弹选项卡处理(指定解释器路径 / 补依赖 / 装 ffmpeg)。
- 自动探测:① Python 解释器(默认
- 第 1 步 · 判定输入并锁定路线(自动判类型):
- 按扩展名自动分流:文字类(srt/vtt/txt/md/docx/pdf/xlsx/csv 或直接粘贴的文本)→ A 直通(零下载);音视频 → B 转写。
- 若用户还没给文件、或格式无法判定 → 此处一律只用「一句纯文字提示」,不弹任何卡片(卡片会盖住上传入口),提示完结束本轮、停下等待用户上传,拿到附件后再继续:
- 音视频:一句话提示——「请把录音/视频文件拖入或点上传到对话里,我收到就自动开始转写。」备选出路也写在文字里(「若暂时没有音视频,也可以直接改发文字稿/字幕」)。
- 文字类:一句话提示——「请把字幕/文字稿拖入或上传到对话里,或直接把文本粘贴过来,我收到就自动继续。」
- 拿到附件/文本前不推进、不反复弹卡催促;用户上传后其消息即带附件,此时再判定类型、进入后续步骤。
- 第 2 步 ·【仅 B 音视频】模型就绪确认(已就绪则跳过,不弹卡):
- 先
vtm_models.py --status体检;显示[√] 已就绪→ 直接进第 3 步。 - 缺失 → 弹选项卡:「下载 large 大模型(推荐)」(约 2.9GB / 约 5–10 分钟)/ 「先不下载,我去准备文字稿」(走 A 路)。用户同意后才下载。
- 先
- 第 3 步 · 业务参数确认(选项卡;给「用默认直接开始」选项,不强制打断):
- 「用默认设置,直接开始(推荐)」→ 语言
zh、不指定人数、不用术语表。 - 「我要指定」→ 在下方输入框填写:语言(普通话
zh/ 粤语yue)、已知参会人数(如 5,传--speakers);若需专有名词术语表,不要在此卡里填路径——单独用一句纯文字请用户「把术语表文件拖入或上传到对话里」(同第 1 步做法,不弹卡),上传后再继续。
- 「用默认设置,直接开始(推荐)」→ 语言
- 第 4 步 · 输出目录确认:选项卡确认输出目录(默认
桌面/会议纪要),可填写;再弹确认卡后才写入。 - 第 5 步 · 执行:按已选路线自动跑(解析/转写 → 提炼 JSON → 生成 Word),逐条打印进度。
- 第 6 步 · 汇报:一句话说明会议定了什么 + Word 完整本地绝对路径 + 待办条数与责任人分布 + 标注不确定项。
- 第 7 步 · 企微发送(可选环节,必须选项卡确认):Word 出稿汇报后,弹选项卡问一句
「是否把这份 Word 纪要多发一份到企业微信?」——
- 选「不发送,结束任务」→ 不做任何发送动作,任务到此结束(Word 已在桌面)。
- 选「发送到企微」→ 依次:① 检查企业微信连接(未连接则推连接入口引导授权,授权后复核再继续);
② 用选项卡先选发送对象类型:「发给我本人(推荐)」(机器人与授权人单聊天然可用、无需任何前置,直接走 --to-me)/ 「发到某个群或好友」;③ 选「发到某个群或好友」时,先 send_wecom.py list 拉取可发送会话(按最后消息时间倒序,最多 20 个),再用选项卡选目标——候选 ≤3 个直接各占一项;候选 ≥4 个先弹一张卡按「只看群聊 / 只看单聊」缩小,再列该类型下最近 3 个 + 「其他会话(在下方输入框填写名称)」;任何情况都不得把会话清单当自由文本念给用户挑(AskUserQuestion 上限 2~4 项);count=0 时弹卡给「发给我本人」/「我去激活群会话」两条出路,不硬发;④ 把 docx 发送过去;⑤ 只回报「目标名称 + 会话类型 + 文件名 + 结果」。
- 本环节不打扰成稿主流程:选否即结束;用户明确说不用发送时不弹这张卡。
- ⚠️ 内部标识(会话 ID / 用户 ID / 素材 ID / 机器人身份)一律不外露;会话列表为空时如实说明并给出激活指引,不硬发。
- 完整命令、能力边界与踩坑见
references/wecom-send.md。
下面的「触发场景 / 全流程 / 提炼规则 …」是执行细节与技术手册,供第 5 步实际执行时参照,原能力不变。
触发场景
用户给出以下任意一种输入,并表达「整理成纪要 / 出纪要 / 一键成稿」类意图时启用:
① 文字类稿件 —— 零下载,默认优先走这条(不碰模型、不上传内容)
- 字幕文件:
.srt/.vtt(腾讯会议、飞书妙记、剪映、讯飞听见等导出的都算) - 纯文本 / 速记:
.txt/.md,或直接粘贴的文本 - Word 文字稿:
.docx - PDF 文字稿:
.pdf(需有文字层,扫描件会被挡回) - 表格转写稿:
.xlsx/.csv(自动识别 时间 / 说话人 / 内容 三列)
② 音视频 —— 首次需本地 Whisper 模型(会先用选项卡问用户是否下载,约 5–10 分钟)
- 会议录音(mp3 / wav / m4a / amr / wma / flac / ogg …)
- 会议视频(mp4 / mov / avi / mkv / flv / wmv …)
走到音视频时不会默认开下载:先体检,模型没就绪就用选项卡问一句(见「第 2 步」),
用户同意才下,并明确告知约需 5–10 分钟。用户若不想下,就引导他导出文字稿走 ①。
给新手用户的首选是 ①:只要有现成文字稿,0 下载、0 等待、秒出纪要。
已有工具(腾讯会议、飞书妙记、剪映、讯飞听见)都能导出字幕或文字稿,拿来即用。
不触发:纯闲聊、与会议整理无关的问答、要求逐字校对录音听感的场景(那走「录音转纪要」技能)。
与「录音转纪要」技能的分工(避免抢活)
| 录音转纪要(已有) | 会议纪要一键成稿(本技能) | |
|---|---|---|
| 交互 | 点菜式:逐字稿/整理稿/分类/总结/纪要 六选一 | 零交互:一条龙直接出终稿 |
| 输入 | 仅音频 | 音频 + 视频 + 字幕/文字稿/PDF/表格 |
| 产出 | 聊天里的文本(可选 _ts.txt/.srt/.md) | 结构化 Word 文档 → 桌面 |
| 待办 | 平铺列表 | 按责任人归类 + 标注期限 |
| 引擎 | 自带 Whisper 转写 | 复用它的转写引擎(不重复下载模型) |
两者共用同一套本地 Whisper 权重与依赖,装过一次两边都能用。
路径与环境速查(执行前先读这一段)
| 项 | 位置 |
|---|---|
本技能目录(下称 $SKILL) | ~/.workbuddy/skills/会议纪要一键成稿 |
转写引擎目录(下称 $SKILLS) | ~/.workbuddy/skills/voice-to-minutes |
| 模型缓存目录 | %LOCALAPPDATA%voice-to-minutesmodels(macOS/Linux ~/.cache/voice-to-minutes/models) |
交付目录 $DESKTOP/会议纪要 | 用户桌面下的 会议纪要/ 文件夹 |
| 中间产物 | <交付目录>/_工作区/ |
| 企微通道(仅第 7 步用) | wecom-cli(由「企业微信」连接器提供,shutil.which 自动定位,需 ≥ 1.2.1) |
Python 解释器(关键,务必统一):全流程用同一个解释器,推荐 WorkBuddy 自带环境——
- Windows:
~/.workbuddy/binaries/python/envs/default/Scripts/python.exe - macOS / Linux:
~/.workbuddy/binaries/python/envs/default/bin/python
为什么必须同一个:转写引擎的
setup.py是通过sys.executable -m pip安装依赖的。用 A 解释器装依赖、用 B 解释器跑转写,必然报
ModuleNotFoundError。
缺依赖怎么补:
- 转写依赖(faster-whisper / ctranslate2 / av / onnxruntime)→ 用上面的解释器执行
$SKILLS/voice-to-minutes/scripts/setup.py --fix --no-models(只装依赖,不拉 2.88GB 的 large-v3)
- 转写权重(音视频才需要)→ 用「录音转纪要」引擎自带的下载器(有双源镜像、分段续传、sha256 校验):
python "$SKILLS/voice-to-minutes/scripts/vtm_models.py" --ensure asr(先 --status 看是否已就绪;已有就不重下。说话人分离模型用 --ensure diar)
- Word 依赖(python-docx)→
<上面的解释器> -m pip install python-docx - ffmpeg → 优先用 WorkBuddy 自带:
~/.workbuddy/binaries/ffmpeg/**/bin/ffmpeg.exe
(extract_audio.py 会自动找到;找不到时可用环境变量 FFMPEG_BIN 指定)
全流程(技术手册 · 执行细节)
第 1 步 · 判断输入格式(永远先做这一步)
| 输入 | 走哪条路 | 要不要模型 |
|---|---|---|
| 字幕 / 文字稿 / PDF / 表格 | A · 直通(跳第 2 步,直接进第 3 步 A) | 不用,零下载 |
| 音视频 | B · 转写(先第 2 步 → 第 3 步 B) | 首次需下权重(large-v3 约 2.9GB / 约 5–10 分钟) |
判定看扩展名即可:
- 音视频:
mp3 / wav / m4a / amr / wma / flac / ogg / mp4 / mov / avi / mkv / flv / wmv - 文字类:
srt / vtt / txt / md / docx / pdf / xlsx / csv(或用户直接粘贴的文本)
默认优先 A:只要输入是文字类稿件,一律直通——不碰模型、不上传内容、秒出,不要去下模型。
第 2 步 ·【仅音视频】确认并准备转写模型(必须用选项卡问用户,不许默默开下)
触发条件:第 1 步判定输入是音频 / 视频。文字稿请跳过本步。
先体检本地是否已有模型(已有就别重下、别打扰用户):
python "$SKILLS/voice-to-minutes/scripts/vtm_models.py" --status- 语音识别底座显示
[√] 已就绪→ 模型已就绪,直接进第 3 步 B,不弹卡片。 - 显示
[×] 缺 N 个文件→ 必须弹出交互式选项卡确认,严禁不问就下载。
选项卡(用 AskUserQuestion,2 个选项 + 输入框),话术里务必写明「约需 5–10 分钟」:
| 选项 | 含义 |
|---|---|
| 下载 large 大模型(推荐) | large-v3,约 2.9GB,约 5–10 分钟;中文准确率最好,人名 / 数字最稳。确认后立即执行下载 |
| 先不下载,我去准备文字稿 | 走 A 路:把录音在腾讯会议 / 飞书妙记 / 剪映等导出字幕或文字稿,零下载秒出 |
- 用户选「下载」→ 执行(引擎自带镜像 + 分段续传 + sha256 校验,中断后重跑同一命令会接着下):
python "$SKILLS/voice-to-minutes/scripts/vtm_models.py" --ensure allasr = 语音识别底座(large-v3,约 2.9GB);diar = 说话人分离(约 44MB);all 一次备齐。只想先省流量可只跑 --ensure asr(分离模型后续会自动补)。下完再进第 3 步 B。
- 用户选「先不下载」→ 停下等用户给文字稿,不要硬转写;一句话给出各工具导出字幕的入口。
⚠️ 引擎把 large-v3 写死为必需底座:
transcribe.py的_ensure_env()会无条件确保
asr组就位,即使传--model medium/small也照样先把 2.9GB 的 large-v3 拉下来。所以本技能不提供小档位选项——统一用 large-v3,既不浪费那 2.9GB,也是中文准确率最好的档位。
依赖自检(与本步并列,仅音视频路径需要):转写还需要 faster-whisper 等依赖,缺了用同一解释器补:
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/
"faster-whisper>=1.1,<2" "ctranslate2>=4.0" "av>=11,<19" "numpy>=1.24" onnxruntime sherpa-onnx
av必须<19(19 删了 faster-whisper 仍在传的metadata_errors参数,装上就崩)。也可用引擎的体检式安装
setup.py --fix --no-models,但它有一步交互确认,非交互环境要
printf 'yn' | python "$SKILLS/voice-to-minutes/scripts/setup.py" --fix --no-models。
模型缓存在
%LOCALAPPDATA%voice-to-minutesmodels(macOS/Linux 为~/.cache/voice-to-minutes/models),与「录音转纪要」引擎共用同一份,装一次两边都能用;下过一次即永久离线免费,
之后再跑本步会直接体检通过,不再弹卡片。
第 3 步 A · 文字稿 / 字幕直通(零下载,推荐给新手)
python "$SKILL/scripts/parse_transcript.py" "<输入文件>" "<工作目录>/<前缀>"产出(都在工作目录):
<前缀>_ts.txt—— 规范稿,每行[mm:ss] 说话人:内容(喂给第 4 步)<前缀>.txt—— 去时间戳全文(保留说话人)
脚本自动做的事:
- 格式自动识别:srt / vtt / txt / md / docx / pdf / xlsx / csv,无需指定
- 说话人识别:支持
<v 张三>、张三:、张三:、[张三]、张三␣␣内容五种常见写法 - 碎句合并:字幕常把一句话切成几条(间隔 < 1.5s 且无句末标点)→ 自动并回一句并补衔接标点
- 重复行去重、PDF 页码噪声剔除
- 元信息行保护:
时间:…/参与:…这类会议信息不会被误认成说话人 - 表格免表头:xlsx/csv 没有表头时,按"最长列当内容、短且取值少的列当说话人"自动推断
可选参数:
--no-merge—— 不做碎句合并,保持字幕原样--max-gap 2.0—— 调大合并允许的最大间隔(默认 1.5 秒)
扫描件会明确挡回:没有文字层的 PDF 不会硬编,直接提示先 OCR 或另存为文字稿。
第 3 步 B · 音视频转写(需本地模型,模型已在第 2 步备好)
先抽音轨,产出 16kHz 单声道 wav:
python "$SKILL/scripts/extract_audio.py" "<输入文件>" "<工作目录>/<前缀>.wav"- 输入已是 wav/mp3/m4a/flac/ogg 等常见音频时,能直通则不重编码。
- 输入是视频时,用 ffmpeg 只抽音轨(丢掉画面,
-vn),封装格式无关:实测
mp4 / mkv / mov 均能正确抽出 16k 单声道 wav,且抽出的音轨与原音频长度一致。视频文件本身多大都不影响——只读音轨那一轨,不比同长度音频慢。
- ffmpeg 自动定位:环境变量
FFMPEG_BIN> PATH >~/.workbuddy/binaries/ffmpeg/**。 - ⚠️ 视频的音轨多为有损压缩(AAC/MP3)。解回 wav 后转写结果与无损音频语义一致,
但可能在个别同音字上有出入,属正常现象;对准确率要求高时,优先要用无损音频(或让用户导出原始录音),并在「待确认」里提示复核。
再调转写引擎(复用「录音转纪要」):
python "$SKILLS/voice-to-minutes/scripts/transcribe.py"
"<工作目录>/<前缀>.wav" "<工作目录>/<前缀>" --diar --language zh产出:<前缀>_ts.txt(带时间戳逐字稿)、<前缀>.txt、.srt、.vtt、.md、_todo.json。
- 档位用引擎默认的 large-v3:不必传
--model(引擎默认 large-v3,且会先查本地缓存,命中就全离线加载,不再联网)。 - 本技能只下 large-v3,不提供 medium / small 小档位——原因见第 2 步的说明。
- 语言默认
--language zh(中文会议);粤语会议改用--language yue——见下方「语言与方言」。 - 已知人数更准:若用户提到"这场是 5 个人",加
--speakers 5,能明显减少串台。 - 专有名词纠错:人名/产品名要写对时,用
--vocab <术语表文件>(一行一个词)。
语言与方言(重要,实测结论)
模型词表里与中文相关的档位只有两个:zh(普通话)、yue(粤语)——全部 100 个语言档已逐个枚举确认。没有闽南语 / 客家话 / 吴语(上海话)/ 四川话 / 潮汕话等专用档位。实际表现与对策:
| 输入 | 表现 | 本技能怎么处理 |
|---|---|---|
| 标准普通话 | 好 | 默认 --language zh,无需干预 |
| 带口音的普通话(川普 / 东北话 / 河南话 / 广普) | 尚可,个别字与数字易错 | 继续用 zh;把关键数字/人名在「待确认」里标出来请人复核 |
| 粤语 | 可用(large-v3 明显强于旧版) | 必须显式传 --language yue;沿用 zh 会被"普通话化",措辞失真 |
| 其他方言(闽南 / 客家 / 吴语 / 四川话…) | 不可靠 | 不要硬转:转去 A 路(要现成文字稿)或提示用户需人工整理 |
| 方言与普通话混说 | 段落错乱、时好时坏 | 按最弱的那一方处理,提示用户核对 |
为什么不能硬转:Whisper 的中文语料以普通话为主,且模型带「转写 / 翻译」多任务。
遇到没学过的方言,它更倾向输出一段读起来很通顺的普通话,而不是如实记录原话——
这种错误最危险,因为稿子看着"像那么回事",实则张冠李戴。
怎么判断是不是方言:让用户说一句("这是粤语会议")最省事;也可以先不带
--language跑一次,引擎会自动识别并打印
[ detected language ] xx (prob=…)——识别成yue就是粤语。一旦确认是非粤语方言,停下来说明情况并建议走 A 路,别交一份看着漂亮、实则失真的纪要。
$SKILL = ~/.workbuddy/skills/会议纪要一键成稿,$SKILLS = ~/.workbuddy/skills。
第 4 步 · 提炼结构化纪要(本技能的核心)
读取 <前缀>_ts.txt(带时间戳、带说话人),按下文「纪要提炼规则」抽取字段,写成一个 JSON 文件 <工作目录>/<前缀>_纪要.json:
{
"title": "会议主题(2-8 字,从内容归纳,不硬凑)",
"date": "2026-10-10",
"time_range": "14:00-15:30",
"duration": "约 90 分钟",
"location": "线上 / 会议室(没提到就留空)",
"attendees": ["张三", "李四", "王五"],
"recorder": "",
"summary": "2-3 句话,让没参会的人一眼看懂这场定了什么。",
"key_points": ["核心要点 1", "核心要点 2", "核心要点 3"],
"decisions": [
{"content": "决策内容", "owner": "拍板人(没提到就留空)"}
],
"todos": [
{"owner": "张三", "task": "事项描述", "deadline": "2026-10-15", "priority": "高", "status": "未开始"}
],
"open_questions": ["悬而未决、没人拍板的问题"],
"quotes": [
{"speaker": "张三", "text": "最关键的原话(带说话人,3-5 句即可)"}
]
}字段规则:
date:按此顺序取 —— ① 文件名里的日期 → ② 内容里明确说出的日期 → ③ 输入文件的修改日期。
凡是走了 ① 或 ③(不是内容里明确说的),都必须在 open_questions 里注明日期来源、提示核对。格式 YYYY-MM-DD。
- ⚠️ 字幕 / 表格稿的坑(实测踩过):字幕的时间戳是相对的(
00:02这种),文件里往往没有绝对日期。
此时相对时间("下周三""五个工作日")无法换算成具体日期——不要猜、不要脑补,deadline 一律填 TBD,把原话写进任务描述(如"原话:下周三之前"),并在待确认区说明"因缺少会议绝对日期,相对时间无法换算"。
todos[].deadline:原文说了就原样落("下周三"→换算成具体日期并标注换算依据);没说就填"TBD",绝不编造。todos[].priority:原文明确说了轻重缓急才填「高/中/低」,否则留空。attendees:来自转写的说话人标签 + 正文中出现的称呼。分不出真名时写「说话人1、说话人2…」,并在open_questions里提示"参会人姓名未确认"。- 没提到的字段一律留空字符串或空数组,不要填"无"以外的臆测内容。
第 5 步 · 生成 Word 文档 → 桌面
python "$SKILL/scripts/build_docx.py"
"<工作目录>/<前缀>_纪要.json"
--out-dir "$DESKTOP/会议纪要"$DESKTOP= 用户桌面,WindowsC:/Users/<用户名>/Desktop,macOS/Linux~/Desktop。- 输出文件名:
YYYY-MM-DD_主题.docx(日期在前、不含空格与特殊字符)。 - 文档版式(标题 / 元信息表 / 摘要 / 要点 / 决策 / 按责任人归类的待办表 / 待确认 / 页脚)见
references/docx-format.md。 - 排版由 python-docx 本地完成,不上传内容、秒级出稿。
第 6 步 · 汇报(一条消息说清)
给用户:
- 一句话说明这场会议定了什么;
- Word 文档的完整本地绝对路径 + 文件名;
- 待办条数与责任人分布(如"共 5 条待办,张三 3 条、李四 2 条");
- 标注不确定项(如"有 2 段没分清说话人,已标待确认")。
第 7 步 · 发送到企业微信(可选分支,原流程跑完才进,详见 references/wecom-send.md)
只在第 6 步汇报之后执行,且必须先经用户确认;不改动前面任何步骤的产物。
① 选项卡确认(AskUserQuestion,2 个选项)
| 选项 | 含义 |
|---|---|
| 发送到企微 | 进入②的检查与发送流程 |
| 不发送,结束任务 | 不做任何发送动作,Word 留在桌面即可 |
② 检查企业微信连接
- 查连接器状态(
list_installed_plugins看「企业微信」是否已绑定并启用)。 - 未连接 → 用
search_plugins找到该连接器,再suggest_plugin_install推一张连接入口卡片,
引导用户从左下角「+」→ 连接器 → 企业微信 → 完成授权;授权后复核一次,通过才继续。
- 已连接 → 直接进③。
- CLI 与授权自检(脚本已封装):
python "$SKILL/scripts/send_wecom.py" check③ 选目标并发送(全程选项卡,禁止把会话清单当自由文本罗列)
③-1 先选发送对象类型(AskUserQuestion,2 个选项):
| 选项 | 含义 |
|---|---|
| 发给我本人(单聊,推荐) | 机器人与授权人的单聊天然可用、无任何前置;直接走 --to-me,不必拉会话列表 |
| 发到某个群 / 好友 | 需先 list 出可发送会话,再在候选里挑 |
③-2 若选「发到某个群 / 好友」:
# 列出当前可发送的会话(按最后消息时间倒序,最多 20 个;只输出可读名称,不含任何内部标识)
python "$SKILL/scripts/send_wecom.py" listcount=0→ 停下来说明,弹一张选项卡给两条出路:「发给我本人」/「我去激活群会话(把机器人拉进群并 @它 发一条任意消息,之后重试)」;不硬发、不反复重试。count≥1→ 用选项卡让用户挑目标,并处理 AskUserQuestion 只有 2~4 个选项的上限:- 候选 ≤ 3 个 → 每个候选占一项(标注「群聊 / 单聊 + 名称 + 最后消息时间」)。
- 候选 ≥ 4 个 → 先弹一张卡按类型缩小(「只看群聊」/「只看单聊」/「改用发给我本人」),
再列该类型下最近 3 个 + 「其他会话(在下方输入框填写名称)」。
- 任何时候都不把会话清单当自由文本念给用户选——一律收敛进选项卡。
- 同名多命中时脚本返回
target_ambiguous,按群聊 / 单聊让用户再确认一次(发送时加--chat-type group|single)。
③-3 发送:
# 发送到群聊 / 单聊(按会话名精确匹配,唯一命中才发)
python "$SKILL/scripts/send_wecom.py" send --file "<桌面/会议纪要/YYYY-MM-DD_主题.docx>" --target "<会话名称>"
# 发送给授权人本人(单聊)
python "$SKILL/scripts/send_wecom.py" send --file "<...>.docx" --to-me- 脚本自动完成「复制到临时目录 → 上传取素材标识 → 发送 file 消息」,调用方无需关心路径沙箱。
- 输出为 JSON:成功
{"ok": true, "target": "群名", ...};失败{"ok": false, "stage": "...", "message": "..."},
按 stage 给用户分门别类的提示。
④ 能力边界(实测结论,别越界承诺)
- 发群:机器人须先与该群有过消息往来(群里 @它 发一条即可激活),否则该群不在会话列表里 → 发不了。
- 发单聊(授权人本人):天然可用,无需前置。
- 发单聊(其他好友):对方须先与机器人聊过,否则无目标可选 —— 这是企微接口的防骚扰规则,不是故障。
- 会话列表为空(
count=0)时停下来说明,给出「激活群会话」或「发给自己」两条出路,不要反复重试、不要硬发。
⑤ 汇报口径(只给可读信息)
| 报 | 不报 |
|---|---|
| 目标名称(群名 / 「我本人」)、会话类型(群聊 / 单聊) | 会话 ID、用户 ID、素材 ID、机器人身份 |
| 消息类型(Word 文件)、文件名 | 接口返回的内部上下文 |
| 结果(已发送 / 失败原因) | 编造的消息 ID |
纪要提炼规则(硬约束,违反即不可信)
- 不脑补:金额、日期、人名、数量、条款编号必须与转写原文逐字一致;拿不准标「待核实」,绝不替用户补。
- 不推断:决议、待办、责任人、期限必须是有人明确说过的;没人说的丢进「待确认」,不替人拍板。
- 区分已定与讨论:明确定下来的进「决策」;倾向性意见、还在讨论的进「待确认」。
- 说话人标签:转写里
[说话人 N]保留;能通过上下文确认真名就替换成真名,否则保留编号。 - 待办按责任人归类:同一责任人的待办聚在一起,按「高→中→低」排序,无优先级按出现顺序。
- 忠实原意:只做结构化与清洗(去口水词、理顺语序),不改会议实际结论,不添加观点。
- 长会议分段处理:转写与提炼每段 ≤ 3000 字,最后合并,避免截断遗漏。
待办归类与期限规则
- 归类维度:责任人(
owner)。同一人一个分组;无归属的统一进「未分配」组,置末。 - 期限格式:
- 明确日期 →
YYYY-MM-DD; - 相对时间("下周三""月底前")→ 换算为具体日期,并在格内附注原文,如
2026-10-15(原话:下周三); - 没提 →
TBD,并在文档「待确认」区提示"X 条待办缺截止日期"。
- 明确日期 →
- 状态:默认
未开始;原文已说明进展的("已经在做了")写进行中。
输出规范
- 交付物:
<桌面>/会议纪要/YYYY-MM-DD_主题.docx - 中间产物(便于回溯,放同目录
_工作区/):<前缀>_ts.txt(逐字稿)、<前缀>_纪要.json(结构化数据)。 - 编码:全程 UTF-8;文档内使用正确的 Unicode 字符(
—✅⚠️📅),禁止 ASCII 近似替代。 - 文件名:严格
YYYY-MM-DD_主题.docx;主题不含/ : * ? " < > |与空格(空格转下划线)。 - 企微发送(可选):仅在第 7 步经用户确认后执行;发送对象就是上面这份 docx,不另生成文件;只回报可读名称与结果。
自检清单(出稿前逐条过)
- [ ] 需要用户上传文件时:是不是只发了一句纯文字提示、然后结束本轮停下等待?确认没有弹选项卡(卡片会盖住上传入口、挡住拖文件)?拿到附件/文本后才继续往下走?
- [ ] 走音视频时:第 1 步判定为音视频了吗?模型没就绪时是否用选项卡问过用户(并写明约 5–10 分钟)?
用户是否确认后才下载?vtm_models.py --status 是否已就绪?
- [ ] 音频/视频确实被转成了文字(不是凭空编的)?
_ts.txt存在且非空? - [ ] 是不是方言?粤语有没有传
--language yue?若是闽南/客家/吴语/四川话等其他方言,
是否停下来说明"无法可靠转写"并建议走 A 路,而不是交一份失真的纪要?
- [ ] 文字稿/字幕是否解析正确?说话人有没有认错(如把「时间:」「参与:」当成说话人)、合并碎句有没有粘连?
- [ ] 说话人是否已识别?分不清的段是否如实标注、没有假装分对?
- [ ] 每条待办是否都有责任人与期限(没有就标
TBD)? - [ ] 金额 / 日期 / 人名 / 数量是否逐字核对,没脑补?
- [ ] 是否区分了「已定决策」与「待确认」?
- [ ] Word 是否真的生成到了桌面目录?文件名是否合规?
- [ ] 汇报里是否给出了完整的本地绝对路径?
- [ ] 走了第 7 步时:是否先用选项卡问过用户?选「不发送」时是否真的一个动作都没做?
发送目标是否取自本次会话列表的精确匹配(唯一命中才发)?多候选时是否收敛进选项卡(未把会话清单当自由文本念给用户挑)?最终回复是否只出现可读名称、没有任何会话 ID / 用户 ID / 素材 ID / 机器人身份?会话列表为空时是否如实说明而非硬发?
使用约定
- 零交互优先,但音视频必先确认:能从内容推断的就直接推断(主题、日期、参会人),不打断用户;
唯一例外是音视频路径下模型未就绪时——必须先弹选项卡确认是否下载(约 5–10 分钟),用户同意才下载,其余一律不打扰。推断不确定的在文档与汇报里标注。
- 缺关键信息才追问:只有当输入文件本身缺失/损坏、或用户意图明显是别的事时才问一句,其余一律先给成品。
- 做不出就给降级版:转写失败(噪音/音乐/无人声)时,如实说明原因,并把可用的部分(如已有的文字稿)整理成纪要,不硬编。
- 不碰用户隐私:音频与会议内容不上传第三方,处理全程本机进行(仅支付环节联网校验订单)。
- 企微发送是可选环节,不越界:只在对应用户确认后执行;用户说不用就不发。发送只回报可读名称(群名 / 文件名 / 结果),
会话 ID、用户 ID、素材 ID、机器人身份等内部信息一律不外露;能力边界(群需先有往来、好友需先聊过)如实告知,不越界承诺。