Ray-MM — 会议纪要生成
Overview
任意格式会议材料 →(输入适配层)→ 统一转写文本 →(docx-js 从零生成)→ 标准 Word 会议纪要(.docx)。
v2.0.0 两大能力:
1. 输入扩大化:不再只吃 Markdown——PDF / Word / Excel / PPT / 图片(OCR)/ 录音 / 录像均可,统一转成 .transcript.md 后再生成纪要
2. 格式固化:样式规范内置(references/format-spec.md),生成脚本模板内置(references/gen-template.js)——默认不再需要搜索/解包模板 DOCX;模板仅作可选微调
v2.2.0 内容提炼压缩强化(吸收 meeting-minutes-ai):
- 待办事项具体性规则:每条待办须是具体任务(做什么+达到效果+责任/时限),模糊表述降级为可执行动作
- 风险与阻塞项:OPEN 小节扩展——不只是遗留问题,还收录会阻断进度的风险/阻塞及对策
v2.3.0 信息分类修正(根据实战反馈):信息分类(决策/待办/未决/数据)仅作为内部分析工具,正文与表格不出现 [决策]/[待办]/[数据]/[未决] 内联标签,待核实项集中列于 APPENDIX(2026-09-04 用户实测:正文内联标签干扰阅读效率)。
触发条件
以下任一关键词出现时使用此 skill:
- 会议纪要 / meeting minutes / 生成纪要 / 会议记录转 word
- 安全月会 / 环保例会 / 事故剖析会 等化工会议纪要
- 用户提供任意格式会议材料(文档/图片/录音/录像),要求转成纪要
开场参数确认(动手前必做)
收到会议材料后,先确认以下参数再生成(缺省用默认值,不反复追问):
| 参数 | 说明 | 默认 |
|---|---|---|
| 输入材料 | 任意格式:md/txt/pdf/docx/xlsx/pptx/图片/音视频 | 必填 |
| 格式来源 | 内置标准格式(format-spec.md);可选:用户指定模板 DOCX 微调 | 内置标准格式 |
| 会议基本信息 | 日期/地点/主持/出席(材料里没有则标注"待补充",不编造) | 从材料提取 |
| 输出目录 | 纪要保存位置 | 与输入同目录 |
忠实引用纪律(最高优先级)
> 背景:外部会议纪要 skill 的核心纪律——忠实引用、不补充、引用标记。AI 生成会议纪要最大的风险是编造讨论内容。
- 忠实引用:纪要内容必须能在源材料中找到出处——"谁说的/决定了什么/下一步做什么"
- 不补充:材料没有的内容一律不写。禁止"合理推断"出结论、禁止润色成"会议决定"(除非原文明确说了)
- 引用标记:不确定是否忠实的内容打
[待核实]标记,交付时提醒用户核对 - 豁免:仅格式性内容(日期补当天、姓名补职位全称)可补,且必须在交付说明中列明补了什么
工作流程
Step 0: 输入适配(多格式 → 统一转写文本)
| 输入类型 | 引擎 | 产出 |
|---|---|---|
| .md / .txt / .markdown | 直接读取 | <名>.transcript.md |
文本层 pdfplumber;无文本层加 --ocr(PyMuPDF 渲染 + Tesseract) |
<名>.transcript.md |
|
| .docx / .doc | python-docx(段落+表格);.doc 先另存为 .docx | <名>.transcript.md |
| .xlsx / .xlsm | openpyxl(逐 Sheet 逐行) | <名>.transcript.md |
| .pptx | python-pptx(正文+备注) | <名>.transcript.md |
| .jpg / .png / .jpeg 等图片 | Tesseract OCR(chi_sim+eng,tessdata 在 ~/.workbuddy/tessdata/) |
<名>.transcript.md |
| .mp3 / .wav / .m4a 录音 | faster-whisper 转写(中文建议 --model medium) |
<名>.transcript.md |
| .mp4 / .avi / .mov 录像 | ffmpeg 抽音轨 + faster-whisper | <名>.transcript.md |
# 文档/图片类(单文件或整个目录)
python scripts/input-extract.py <文件或目录> [--ocr] [--out <输出目录>]
# 音视频类
python scripts/transcribe_audio.py <音频/视频文件> [--model small|medium|large-v3] [--out <输出目录>]
统一产出的转写文本就是 Step 2 的标准输入——后续步骤与输入来源无关。
Step 1: 读取格式规范(内置,无需模板)
# 默认:直接读固化格式规范(页面/表头/字体/编号/待办表全在此)
Read: references/format-spec.md
# 生成脚本模板(复制为 gen_minutes.js,只需填内容区)
Copy: references/gen-template.js → <工作目录>/gen_minutes.js
仅当用户明确提供模板 DOCX 并希望参照其风格时,才解包模板提取配色/字体微调(format-spec.md 中覆盖默认值),正常情况下跳过。
Step 1.5: 转录文本校对(ASR 输入时必做,v2.1.0 新增)
> 背景:whisper/腾讯会议等语音转文字产出,错别字 95% 是中文同音字替换——不校对直接进纪要 = 把错误固化进正式文档(化工场景:数字、物料名、人名错了后果严重)。
触发条件(满足任一即自动执行):
- 转写文本含时间戳(== 00:00:00 ==)或说话人标注(发言人1: / 张三: / Speaker 1:)
- 来源是录音/录像转写(Step 0 音视频链路)
- 用户说"先校一下 / 转写有错字 / 同音字纠正"
纠错三档纪律(不可豁免):
| 置信度 | 处置 |
|--------|------|
| 高置信(上下文+专业常识可确定,如"已正响"→"已整改") | 直接改 |
| 中置信(同音可疑但无法确定) | 不静默改,标 [待核实:原词→疑似xx] |
| 数字、金额、比例、日期、人名、物料名 | 一律只标不改,回听/查原始材料人工定 |
- 优先级:化工专名(物料/CAS/装置)> 人名职务 > 通用同音/形似
- 专名词库(v2.4.0):化工会议高频同音词见
references/asr-glossary.md(爆破片/尾气系统/液位/自力式调压阀等实测正词)——是提示库不是替换库,命中先判上下文置信度再走三档纪律;人名/企业名只标不改 - 留痕可溯:只纠错别字不改原意;每处程序化纠错在交付说明中列出(
原词→正词) - 红线:拿不准就标,不替音频做主——严格咬合忠实引用纪律(纠错≠脑补)
两处以上同音字错误可引导用户回听音频人工核实。
Step 2: 解析会议内容(从统一转写文本)
| 字段 | 来源 |
|---|---|
| 会议标题 | 一级标题或文档开头 |
| 会议时间 | **会议时间**: 字段或 == 00:00:00 == 标记 |
| 会议地点 | 文中标注 |
| 参会人员 | 文中标注 |
| 议题列表 | ## 一、 等二级标题 → level 0 编号项 |
| 子议题 | 议题下的 ### 1. 或 * 列表 → level 1 编号项 |
| 子子项 | 更深层列表 → level 2 编号项 |
| 待办事项 | | 责任人 | 任务 | 截止 | 表格 → 待办表格 |
| 信息分类(v2.3.0 修正) | 解析时在内部分析中给内容分类:决策(最终结论)/待办(落地任务)/未决(悬置待跟进)/数据(关键指标)——分类决定内容去向:待办→ACTION 表、风险/未决→OPEN 小节、数据→正文数据句。⚠️ 分类标签一律不写进正文(2026-09-04 用户实测否定:正文内联 [决策]/[待办]/[数据] 标签干扰阅读、降低效率,纪要要读起来像纪要不像报表) |
| 待办事项具体性(v2.2.0) | 每条待办必须是具体任务:做什么 + 达到效果,并尽量落实责任人 + 时限。禁止模糊表述(❌"想想营销方案"→✅"周五前起草 Q3 预算初稿")。材料未给时限标 [待确认]、责任人不明标 [待分配]——仍是忠实引用,不替材料编造时限/责任人。判断"是否够具体"问自己:这条能让执行者明天直接开工吗?不能就太模糊 |
> 音视频转写稿通常无结构标记——由 AI 依据内容主题归纳议题(仍须忠实引用,可打 [待核实])
Step 3: 安装 docx-js 依赖
mkdir -p <temp_workdir> && cd <temp_workdir>
npm init -y && npm install docx
使用系统 npm(which npm 获取路径)。安装到临时目录,任务结束后清理。
Step 4: 填写生成脚本
打开复制的 gen_minutes.js,只需修改三处:
1. OUTPUT 路径
2. HEADER_TEXT(页眉/标题,一般=<会议主题>会议纪要)
3. topics / actions 两个内容数组(忠实引用纪律下从转写文本提取)
样式(编号配置/辅助函数/表格构建/页面设置)全部内置,不要改动。也不编辑任何模板 XML。
Step 5: 验证和输出
# 运行脚本
NODE_PATH=<node_modules_path> node gen_minutes.js
# 验证生成的 DOCX(段落/表格数、无 U+FFFD 乱码、关键内容存在)
python scripts/validate.py <output.docx> --need "关键词1,关键词2" --rows <待办行数>
# 清理临时文件
rm -rf <temp_dir>
输出文件命名:会议纪要-<主题简称>-<MMDD>-<YYYY>.docx,放在源材料同级目录(或用户指定目录)。
固化格式速查
详细规范见 references/format-spec.md;要点:
- 页面:US Letter 12240×15840,页边距上下 1440 / 左右 1800;页眉右"会议标题"(微软雅黑 9pt 灰斜体),页脚居中"第 X 页"
- 表头表格 3 行 4 列:标题跨列(微软雅黑 28pt 加粗居中)/ 时间·地点(Garamond 22pt 标签加粗 + 20pt 值斜体)/ 人员·CC抄送
- 编号:Level 0 1. / Level 1 1.1 / Level 2 a);议题标题 等线 22pt 加粗 #002060
- 正文:等线 21pt,行距 360;红色 #C00000 斜体用于备注/[待核实]
- 待办表:表头 #002060 白字 18pt,数据行交替 #F2F6FC/白,列宽 1600/5040/2000
- 结构:TOPIC → CONTENT(三级编号,正文不带类型标签)→ OPEN(遗留问题+风险阻塞,有才放)→ ACTION(待办表)→ APPENDIX
常见陷阱
-
不要编辑模板 XML:会议内容量大、结构多变,直接编辑 XML 极易出错(run 合并、RSID 冲突、编号断裂)。始终用 docx-js 从零生成(模板
references/gen-template.js)。 -
不要用 python-docx 替代 docx-js:python-docx 对多级编号的支持有限且 API 繁琐。docx-js 的 numbering config 更直观可控。
-
docx-js 隐式依赖:npm 安装 docx 包后,确保运行时
NODE_PATH指向正确的node_modules目录。 -
中文引号处理:docx-js 的 TextRun 直接支持中文全角引号(""''),无需实体编码。不需要使用
&#x201C;等 XML 实体。 -
表格宽度:始终使用
WidthType.DXA,不用PERCENTAGE(Google Docs 不兼容)。columnWidths之和必须等于table width。 -
ShadingType.CLEAR:表格底色必须用
ShadingType.CLEAR,不用SOLID,否则背景变黑。 -
验证:生成后务必运行
scripts/validate.py,检查段落数量与编码(U+FFFD 零容忍)。 -
中文路径与 bash:脚本/参数含中文路径时走 Python 或 PowerShell 直调,勿经 bash 中转(cd 可能成功但 mv/cp 失败)。
-
音视频输入:faster-whisper 首次运行会下载模型(small≈460MB / medium≈1.5GB);无 GPU 环境用
compute_type="int8"(脚本已默认)。
输入适配依赖速查
| 依赖 | 用途 | 安装 |
|---|---|---|
| pdfplumber | PDF 文本层 | pip install pdfplumber |
| python-docx | Word 提取 | pip install python-docx |
| openpyxl | Excel 提取 | pip install openpyxl |
| python-pptx | PPT 提取 | pip install python-pptx |
| pillow + pytesseract + Tesseract 本体 | 图片 OCR | pip install pillow pytesseract + 安装 Tesseract |
| pymupdf | PDF 无文本层时渲染 OCR | pip install pymupdf |
| faster-whisper | 音视频转写 | pip install faster-whisper(含模型下载) |
| ffmpeg | 视频抽音轨 | PATH 或 IMAGEIO_FFMPEG_EXE |
维护记录
| 日期 | 变更 |
|---|---|
| 2026-08-12 | v1.2.0:外部对比(会议纪要 taskbook)补①忠实引用纪律(不补充/引用标记/[待核实])②开场参数确认;3 个代码块 → references/code-templates.md。健康分 66→91 |
| 2026-08-25 | v2.0.0:①输入扩大化——新增输入适配层(scripts/input-extract.py 文档/图片多格式提取、scripts/transcribe_audio.py 音视频转写),任意格式 → 统一 transcript.md;②格式固化——references/format-spec.md 内置唯一格式标准 + references/gen-template.js 完整生成脚本模板,默认不再搜索模板 DOCX(模板降级为可选微调);③补 scripts/validate.py 验证脚本(U+FFFD 零容忍);④常见陷阱补中文路径与音视频依赖条目。基于 2026-08-25 安全管理周例会纪要实测验证(PDF→docx 全流程打通) |
| 2026-08-25 | v2.1.0:外部对比吸收 2 项高价值机制——①ASR 转录文本校对(Step 1.5:触发条件 + 同音字三档纠错纪律,数字/人名/物料名只标不改,咬合忠实纪律);②信息类型标注([决策]/[待办]/[未决]/[数据],只标注不新增)+ 遗留问题/未决事项小节(OPEN,材料明确未决项才列)。吸收原则:克制吸收(外部 4 项差距只取与本地能力咬合的 2 项;会议类型适配与行动项写法因加工风险暂缓) |
| 2026-08-25 | v2.2.0:内容提炼压缩强化(用户指明重点看外部候选的提炼压缩机制)。吸收 meeting-minutes-ai 2 项——①待办事项具体性规则(Step 2 解析表新增行:具体任务=做什么+达到效果+责任/时限;❌"想想营销"→✅"周五前起草Q3预算";缺时限标[待确认]、缺责任标[待分配],仍咬合忠实引用);②OPEN 小节扩展覆盖风险与阻塞项(会阻断进度的风险收录 + 影响面/对策/负责人,未给标[待确认])。克制吸收:暂缓 3 项——输出变体三档(标准/详细/简报)、JSON 结构化追踪(会议记录清单式)、待办优先级列(P0/P1/P2,化工纪要纪要正文极少出现优先级表述,强加会破坏忠实引用) |
| 2026-09-04 | v2.3.0:信息分类修正(实战反馈)。信息分类(决策/待办/未决/数据)仅作内部工具,正文/表格不出现 [决策]/[待办]/[数据]/[未决] 内联标签(用户实测:标签干扰阅读,纪要应读如纪要不如报表);待办规则+OPEN 风险阻塞保持;源材料校对依赖转至 APPENDIX 待核实清单。 |
| 2026-09-23 | v2.4.1:frontmatter name: ray-MM → name: ray-mm(DSH 0.1.7 校验器拒大写名,doctor 恒报 NAME_INVALID;slug 本就是 ray-mm,仅正名,内容零改动)。 |
| 2026-09-04 | v2.4.0:新增 references/asr-glossary.md 化工会议 ASR 同音词术语表——沉淀三场实测会议(8/25 周例会、9/1 调压阀、9/4 大修部署会)验证过的专名正词(爆破片≠报告链保护架、尾气系统≠煤气系统、液位、自力式调压阀等),Step 1.5 挂引用。术语表是提示库非替换库,人名/企业名只标不改。 |