给跑团存音频做了个长期记忆引擎

PromptCube 专家 1小时前 215 浏览 10 点赞 约 2 分钟

组里跑团三四小时一期,录音堆到三十多期时才发现:普通会议纪要工具根本不懂奇幻专有名词,更不知道谁在说什么,每期都当孤岛处理。我折腾了个叫 Table Canon 的管线,专门解决跨期长程状态追踪——NPC 档案、未完成任务钩子、角色承诺的兑现情况,全靠结构化增量写入数据库,而不是把所有历史塞进上下文窗口。

技术栈一览

  • 转写:whisper-large-v3-turbo
  • 说话人分离与声纹匹配:pyannote
  • 实体抽取与状态更新:OpenAI Structured Outputs(JSON Schema 强制约束)
  • 语音回顾生成:Kokoro / Chatterbox Turbo
  • 球德风格总结歌词:ACE-Step-v1.5-XL-Turbo

几个踩坑记录

一、状态增量 vs 上下文爆炸
把前 20 期完整逐字稿喂进去,Token 成本和噪声双双失控。现在的做法:每期只产出原子级状态增量——NPC 档案增删改、新增地点、已解决/新增的承诺——直接落库。上下文窗口永远只看「当前增量 + 活跃实体快照」,跑到 30 期以上依然可控。

二、自建前置词典救专有名词
通用 STT 把「阿兹高尔」识别成「爱思高尔」,「米斯特拉」变「密斯特拉」。方案是在 Prompt 里注入本战役专用术语表(人名、地名、组织、法术名),首轮拼写准确率肉眼可见提升。

三、 VAD 分块避免显存泄漏
4 小时原始 wav 直接扔给 Pyannote/Whisper,显存飙升到 OOM,进程还会卡死。现在的预处理流程:先跑 Silero VAD 切出有效语音段,按固定时长(如 30 分钟)决定性分块,再并行喂模型,最后按时间轴拼回。

还在啃的硬骨头

  • 实体别名消歧:玩家口里的「红衣主教」「亚瑟」「那个邪教头子」可能指同一个 NPC,也可能是三个人。现在靠用户事后在界面上合并/拆分实体兜底,想探索基于共指消解 + 向量相似度的半自动方案。
  • 任务钩子闭环判定:LLM 很难可靠判断一个承诺是「已完成」「显式放弃」还是「隐性搁置」。目前在 Schema 里加了置信度字段 + 三值逻辑,但误判率还在 15% 左右。

目前免登录可上传 6 小时音频试用,欢迎同样被跑团录音淹没的 DM 来踩坑、提意见。
WhisperTable CanonpyannoteTTRPG状态增量

全部回复 (3)

产品经理阿强 中级 1小时前
我们团也类似,4小时里真正推剧情可能就1个半小时,中间穿插点外卖、吐槽规则、查牌组...

我试过把整段扔给Whisper再用GPT按"战斗/探索/社交/闲聊"分段,准度大概85%左右。关键得给模型喂足上下文——比如把NPC名单、地点名、关键道具当system prompt塞进去,否则很容易把"我去开个门"这种OOC当成剧情。

你要是不想折腾提示词,Notion AI或Mem.ai那种自带语义分块的工具可能更省事,直接按话题聚类,事后人工合一下就行。

0 回复
副业中测试 中级 1小时前
whisper对着骰子声喊"大成功"都能给你转成"大肠头"​‌‌
0 回复
调参侠小美 初级 1小时前
说话人分离用的 pyannote 还是自己训的?
0 回复

发表回复

支持 Markdown 格式