dsh-dafeiyu-pro 🐋🎙️
给「大肥鱼」桌宠加上语音能力 —— 基于 QCYTSN/dsh-dafeiyu 的二次开发。
⚠️ 这是一个 fork,不是原创项目。 原项目
dsh-dafeiyu由 @QCYTSN 开发,MIT 协议。 本仓库在其基础上增加语音交互能力,遵循同样的 MIT 协议。
目录
这是什么
DeepSeek Harness 的桌面伴侣插件。
原版 dsh-dafeiyu 会显示 Agent 的实时状态(思考、改文件、等确认、出错),它有一个透明置顶的原生窗口,还能看余额。
本项目要做的,是让它能听、能说:
你叫「大肥鱼」
↓
它回「我在」
↓
你说话 → 流式识别 → 意图分流
↓
├─ 闲聊 → 直连 LLM → 1~2 秒回话
├─ 查数据 → 调天气/搜索 API
└─ 长任务 → 派给 DSH agent,先垫一句「好的,我看看」
↓
流式合成,边收边播,可以中途打断
与上游的关系
来源
| 项目 | 地址 | 说明 |
|---|---|---|
| 上游 | QCYTSN/dsh-dafeiyu | 原作者,MIT |
| 本仓库 | cooleye/dsh-dafeiyu-pro | 二次开发 |
我们改了什么
| 领域 | 上游 | 本项目 |
|---|---|---|
| 语音唤醒 | ❌ | 🔨 开发中 |
| 语音识别 | ❌ | 🔨 开发中 |
| 语音合成 | ❌ | 🔨 开发中 |
| 意图分流 | ❌ | 📋 规划中 |
| 长期记忆 | ❌ | 📋 规划中 |
| 状态显示 | ✅ 完整 | ✅ 保持不变 |
| 桌宠动画 | ✅ 完整 | ✅ 保持不变 |
我们没改什么
- 动画素材:仍然来自上游,原始出处是 PC2005-cloud/dsh-pet(MIT)
- 图标、光标、音效:保持不变
- 状态机核心:
companion-reducer.js的逻辑保持上游实现
当前进度
| 阶段 | 内容 | 状态 |
|---|---|---|
| — | Fork 上游代码 | ✅ 完成 |
| Phase 0 | 唤醒词 PoC | ✅ 完成(实测 3/3 命中) |
| Phase 1 | 音频栈 + 本地出声 | ✅ 完成(唤醒→回应已跑通) |
| Phase 2 | 云端流式 ASR | ✅ 完成(连续多段已修好) |
| Phase 3 | 对话闭环(LLM + TTS) | ✅ 完成(能真聊了) |
| Phase 4 | 分级路由(闲聊/查询/干活) | ✅ 完成(8/8 测试通过) |
| Phase 5 | 长期记忆 | ⬜ 未开始 |
已跑通的完整链路
说「大肥鱼」
↓
本地 KWS 命中(零云端调用)
↓
回「我在」
↓
进入听写态,VAD 断句
↓
阿里云 paraformer 流式转写
↓
💬 你说:今天天气怎么样?
↓
🧭 意图分流
├─ chat → 直连 LLM 0.5~1s
├─ data → LLM + 搜索工具,1~2s
└─ task → DSH agent,先垫一句「好的,我看看」
↓
按句切分 → qwen3-tts 合成 → 逐句播放
实测数据:
| 项目 | 结果 |
|---|---|
| 唤醒 | 3/3 命中 |
| ASR 准确度 | 「今天天气怎么样?给我讲个故事呗。」全对,带标点 |
| ASR 速度 | 2.89 秒音频 → 0.97 秒转完(3× 实时) |
| LLM 首字 | 0.25~0.33 秒 |
| 工具调用 | 问天气自动触发搜索,1.34 秒出结果 |
| TTS 合成 | 6.64 秒音频 / 1.5 秒合成(4.4× 实时) |
| 端到端开口 | 约 2 秒(闲聊)/ 1.3 秒(带搜索) |
| DSH agent | 简单任务 4.3 秒,长任务有两级垫场 |
| 连续多段识别 | 6 段全部正确,会话不串 |
| 自动化测试 | 17 个用例全过(不联网、不用麦克风) |
⚠️ Windows 音频独占:MME / DirectSound / WASAPI 都可能被别的程序 (比如 DSH 自己的语音输入)独占,只有 WDM-KS 能稳定打开。 本项目已做自动降级。
⚠️ 模型可用性:这个 key 上
qwen-turbo长期 429,qwen-flash/qwen-plus/qwen-max可用。默认用qwen-flash。
三级路由的意义
| 路径 | 触发 | 延迟 | 谁在干活 |
|---|---|---|---|
| chat | 寒暄、情绪、玩笑 | 0.5~1s | 直连 LLM |
| data | 天气、新闻、实时信息 | 1~2s | LLM + 搜索工具 |
| task | 写文档、改代码、做开发 | 垫场即时 | DSH agent |
为什么不统一走 agent:DSH agent 能干活但一次几十秒, 说「你好」等半分钟体验会崩。分流之后快的地方快,慢的地方有垫场。
详细设计见 docs/VOICE-DESIGN.md, 怎么测试见 docs/TESTING.md。
规划中的功能
语音唤醒(本地,零云端调用)
- 唤醒词可配置,默认「大肥鱼」
- 用 sherpa-onnx 的 KWS 模型
- 待命态不烧钱:超出唤醒词长度窗口的音频直接丢弃
语音识别(云端流式)
- 阿里云 paraformer-realtime-v2
- 边说边出字,支持打断
- 多级降噪门控(能量迟滞 / 过零率 / 有声帧占比)
语音合成(云端流式)
- 阿里云 Qwen-TTS / MiniMax
- 边收边播,支持中途打断
- 云端失败时回落到本地 TTS
意图分流
三条路,各走各的:
| 路径 | 触发 | 响应 | 走的通道 |
|---|---|---|---|
| 闲聊 | 「你好呀」「今天怎么样」 | 1~2s | 直连 LLM |
| 查数据 | 「今天天气」「有什么新闻」 | 1~2s | LLM + 天气/搜索 API |
| 长任务 | 「帮我写个文档」 | 先垫话,后异步 | DSH agent |
长期记忆
- 事实库(关键词 × 类别 × 重要度 × 新鲜度打分)
- 每条事实带用户原话作为依据,防模型凭空记忆
- 闲聊记忆和任务记忆分开存
技术选型
| 层面 | 选型 | 理由 |
|---|---|---|
| 桌面壳 | PySide6 (Qt6) | 沿用上游 |
| 插件层 | Cordis (DSH) | 沿用上游 |
| 唤醒词 | sherpa-onnx KWS | 本地、低功耗、零成本 |
| 语音识别 | 阿里云 paraformer-realtime-v2 | 流式效果好,实测中文 CER 2.1% |
| 语音合成 | 阿里云 Qwen-TTS | 支持情感语气,首包几百毫秒 |
| 音频采集 | sounddevice (PortAudio) | Qt 打包里没有 QtMultimedia |
| 意图分类 | 规则 + 小模型兜底 | 快、可解释 |
参考实现
语音链路参考了 desk-ai 的实测参数(私有项目),包括:
- VAD 参数(起说话 0.03 / 收尾 0.012 / 对话态静音切段 1050ms)
- 打断阈值与 1 秒重喂机制
- ASR 幻觉短语过滤词表
- 阿里云 WebSocket 的
"streaming": "duplex"坑
开发环境
前置
- Node.js ≥ 22.19
- Python ≥ 3.10(用于 helper)
- pnpm
本地开发
# 克隆
git clone https://github.com/cooleye/dsh-dafeiyu-pro.git
cd dsh-dafeiyu-pro
# 安装依赖
pnpm install
# 跑测试
npm test
npm run test:python
# 直接跑 helper(开发期推荐,不用每次打包)
npm run helper:headless # 验证协议,不开窗口
npm run helper:visual # 开窗口
装到 DSH 里
# 用 link 模式,改代码实时生效
dsh plugin --profile desktop add link:<本仓库绝对路径>
打包
npm run build:helper:windows # Windows exe
npm run build:helper:linux # Linux
npm run build:helper:darwin # macOS
目录结构
dsh-dafeiyu-pro/
├── src/ Node 侧(插件逻辑)
│ ├── plugin.js 配置 Schema、事件订阅
│ ├── companion-reducer.js 状态机
│ ├── helper-process.js 子进程管理
│ ├── protocol.js 消息协议
│ └── balance.js 余额查询
├── runtime/ Python 侧(Qt helper)
│ ├── helper.py 窗口、动画、交互
│ ├── animation_model.py
│ └── bin/ 各平台预编译 helper
├── assets/pet/ 动画帧(WebP,来自 dsh-pet)
├── lib/client.js 浏览器侧
├── docs/ 文档
└── test/ 测试
与上游的目录差异
- legacy/ 已移除(旧版素材,与开发无关,且不在 MIT 范围内)
- .github/ 已重置(上游 CI 不适用)
许可与致谢
代码许可
本项目代码遵循 MIT License,与原项目一致。见 LICENSE。
素材许可
⚠️ 注意区分:
| 资产 | 许可 | 说明 |
|---|---|---|
| 源代码 | MIT | 自由使用、修改、分发 |
assets/pet/ 动画帧 |
MIT | 来自 dsh-pet |
legacy/dafeiyu/ |
❌ 受限 | 本项目已移除该目录 |
详见 ASSET_LICENSE.md。
致谢
特别感谢原项目作者 @QCYTSN ——
dsh-dafeiyu 的架构设计(原生窗口 + JSONL 协议 + 事件驱动状态机)非常好用,
让二次开发变得很轻松。
同时感谢:
- DeepSeek Harness —— 插件系统
- Cordis —— 插件框架
- sherpa-onnx —— 本地语音引擎
- PC2005-cloud/dsh-pet —— 动画素材
- 大肥鱼人设的社区创作者们
声明
- 本项目是独立维护的社区分支,不代表原作者的立场
- 遇到问题请先看 上游 issue,可能是因为上游已经修复了
- 如果上游合并了我们的改动,本项目会尽量跟随
上游:QCYTSN/dsh-dafeiyu · 本文档最后更新:2026-11-10
No comments yet. Be the first to write one.