[Python] 从会议录音到知识库全自动:我把数百段录音做成了可 RAG 问答的 Wiki(附开源代码)

做了个会议录音 → 知识库的全自动管线,开源了,来分享一下。

背景:公司用 Plaud 录音笔积累了大量会议录音,但一直躺在那里没人整理。Plaud 自带的 AI 笔记质量一般,而且说话人都是匿名的( Speaker 1 、Speaker 2…),行动项根本没法落实到人。

做了什么

录音文件 → 说话人分割 → 身份具名 → AI 纪要 → Wiki 知识库
                                                    ↓
                                          可浏览 + 可搜索 + 可 RAG 问答

每天 22:00 cron 自动跑,0 人工干预。

最核心的部分:三阶段说话人具名漏斗

说话人识别我试过纯声纹方案,发现 CAM++ 跨录音根本不可靠——同一个人在不同录音的余弦相似度只有 0.50–0.65 ,反而不如不同人在同一录音的 0.85–0.97 。直接用声纹聚类,阈值 0.65 时同一个人被拆成 17 个簇。

最后用了三层漏斗:

优先级 方法 命中率
1 外部标签时间戳对齐(地面真相) ~95%
2 CAM++ 声纹余弦匹配(阈值 0.55 ) 填补剩余
3 LLM + 组织架构图 + 称呼惯例推断 兜底

最终 94% 片段具名率( 56,862 / 60,664 )。有了具名,行动项才能从"某参与人说要做某事"变成"张经理需在周五前提交报价"。

技术栈

  • 说话人分割:pyannote community-1 ( GPU ,~28x 实时,比 CAM++ 分割准多了)
  • ASR:FunASR Paraformer-large
  • 声纹提取:CAM++ 192-dim embedding
  • LLM:OpenAI 兼容接口( Claude / GPT / 本地 Ollama 均可)
  • Wiki:纯 Python http.server + mistune ,零框架
  • 中文搜索:自制 Bigram 分词,不依赖 jieba

几个踩坑记录

  1. pyannote 直接读 OGG 会有分割边界漂移,先 ffmpeg 转 16kHz WAV
  2. 54 分钟音频不加 VAD 直接跑 FunASR → 需要 43GB 显存 → OOM ,必须开 fsmn-vad
  3. LLM 输出 JSON 要多策略解析( strip code fence → bare JSON → trailing comma ),单一策略会静默丢结果
  4. S3 预签名 URL 不能带 Authorization header ,得用干净 session

开源地址: https://github.com/xclgordon/plaud-pipeline

架构文档在 docs/architecture.md,比较详细。

需要 NVIDIA GPU ( pyannote 分割),其他没有特殊依赖。主流程已经和 Plaud 解耦,把录音文件丢进 recordings/ 文件夹就能跑。

欢迎提问和 PR 。