2026年8月21日
WhisperaPet
在 Whispera 的实时语音框架上换掉本地模型,接入 DeepSeek 与 GPT-SoVITS,做成能切换人格的语音桌宠。
#Electron#Python#WebSocket#ASR#TTS#LLM
对话的主逻辑我自己已经写好了,缺的是一个能跑起来的实时语音框架。WhisperaPet 就是把这两半拼起来的产物。
思路
借用 Whispera 的实时语音能力(Electron 前端、Silero VAD 打断、WebSocket 协议、流式播放),换掉它自带的本地大模型和本地 TTS:
- 本地
llama-server+ GGUF → DeepSeek API - 本地 VoxCPM 流式 TTS → GPT-SoVITS
api_v2服务 - ASR 从 SenseVoiceSmall → 复用 GPT-SoVITS 自带的 paraformer 快照
做了什么
- 人格系统:新增
personas/<id>/目录,每个人格一个SKILL.md(人格技能)加一个voice.json(参考音频、提示文本、可选微调权重)。加新人格只要建目录放文件,不用改代码。 - 一键切换:切换人格时同时更新 LLM 的 system prompt、TTS 的参考音频,以及 GPT-SoVITS 的微调权重,切换完前端会提示已生效。
- 权重缓存:GPT-SoVITS 的权重是服务端全局状态,所以给已加载的组合做了缓存,避免每次合成都重载;微调人格和零样本人格来回切也不会串音色。
- 一键启动脚本:把 Python 解释器复用、TTS 服务拉起、模型校验和 Electron 启动串成一条命令。
踩过的两个坑
- Python 3.9 类型注解墙:GPT-SoVITS 的便携 runtime 自带 Python 3.9,而后端路由用了 3.10+ 的
X | Y联合类型注解,FastAPI 注册路由时直接崩。 - ASR 与 funasr 版本不兼容:SenseVoiceSmall 的快照不带 funasr 1.0.27 需要的 dims 元数据,加载时报缺 10 个必填参数。最后改成复用 GPT-SoVITS 自带、日常在用的 paraformer 中文快照。
两个问题的现象、根因和验证方式都记在了项目文档里。