dsh-fish-pet
Verifieddsh-fish-pet · v0.2.41 · MIT
Desktop blue fish pet for DeepSeek Harness: per-pixel transparent WinForms window, text chat, and cloud speech-to-text voice conversation.
Install
dsh plugin add dsh-fish-pet Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
# dsh-fish-pet · 桌面蓝鱼

给 DeepSeek Harness 养一条住在 Windows 桌面上的蓝鱼。 它不是网页贴图:是一个逐像素透明的置顶窗口,用 PowerShell + WinForms 逐帧绘制,还能听你说话、跟你聊天、用中文语音回你。
一分钟了解
| 它能做什么 | 说明 |
|---|---|
| 🐟 住在桌面上 | 逐像素透明置顶窗口,程序不到 100KB——纯 PowerShell + WinForms 手写逐帧绘制 |
| 🎤 听你说话 | WASAPI 连续采集 + 自研 VAD,说完自动识别(硅基流动 Qwen3-ASR) |
| 💬 跟你聊天 | 接 DeepSeek,带人设、记得上下文、情绪会写在语气里 |
| 🔊 念给你听 | 微软 Edge 免费音色(默认晓晓),中英文自动切换音色 |
| 😊 有情绪 | 饥饿值 / 亲密度 / 心情,开心睁眼、委屈半垂带泪、生气压低 |
| 📝 记事与提醒 | 说"十分钟后提醒我喝水",到点主动喊你 |
| 🍚 能喂 | 点一下就喂白饭,会冒爱心、撒娇 |
个人作品,与 DeepSeek 官方无关。需要自备两个 API key(对话 + 语音识别),不是免费服务。
速览
# 1) 装成 DSH 插件(推荐)
dsh plugin --profile web add "git+https://gitee.com/adengou/dsh-fish-pet.git"
# 2) 配两个 key(各写一行,只放 key 本身)
mkdir "$env:USERPROFILE\.dsh\fish-pet" -Force
Set-Content "$env:USERPROFILE\.dsh\fish-pet\deepseek.key" -Value "sk-..." -NoNewline
Set-Content "$env:USERPROFILE\.dsh\fish-pet\siliconflow.key" -Value "sk-..." -NoNewline
# 3) 想要更自然的朗读音色(可选,免费)
python -m pip install --upgrade edge-tts
# 4) 重启 dsh web,鱼就来了
不装 DSH 也能单独跑:
wscript.exe assets\start-pet.vbs # 桌面鱼
wscript.exe assets\start-ear.vbs # 语音耳朵(可选)
特性
- 桌面常驻:全屏随机游动、随机停歇、眨眼、吐泡泡、尾巴与鱼鳍摆动
- 交互:拖动换位置、左键喂食、右键菜单(大小 / 回家 / 语音朗读 / 提醒 / 清除记忆 / 退出)
- 聊天:输入框打字或语音 → 调
deepseek-flash→ 气泡回复 + 语音朗读 - 语音对话:独立"耳朵"进程用 WASAPI 采集麦克风 → 云端 Qwen3-ASR 识别 → 自动接话(说完约 1 秒内开始回)
- 语音朗读:默认用微软 Edge 的
zh-CN-XiaoyiNeural少女音(免费、无需 Key,可换音色/语速/音调) - 情绪系统:饥饿值、亲密度、心情(开心/委屈/饿/被冷落),会体现在语气、表情和配音上
- 记忆:最近 24 条对话 + 长期摘要 + 主人交代的便签 + 定时提醒(到点主动开口)
- 单实例守卫、异常落盘(不弹框)、耳朵掉线自动重启、位置记忆、开机自启
环境要求
| 依赖 | 是否必需 | 用途 |
|---|---|---|
| Windows 10 / 11 | 必需 | 桌面窗口与 PowerShell 运行环境 |
| PowerShell 5.1 | 必需(系统自带) | 运行鱼和耳朵脚本 |
| Node.js ≥ 22 | 作为 DSH 插件时必需 | 插件宿主 |
| 麦克风 | 语音对话需要 | WASAPI 采集 |
| Python 3.8+ | 可选 | 仅用于「微软 Edge 云语音」(音色更自然) |
| edge-tts(pip 包) | 可选 | 同上,缺它就自动退回本机 SAPI 语音 |
关于 Python / edge-tts(语音朗读)
鱼默认用微软 Edge 的云音色朗读(免费、无需 API Key),需要本机有 Python 3 和 edge-tts:
python -m pip install --upgrade edge-tts
- 没装也没关系:鱼会自动退回 Windows 自带的 SAPI 语音(
Microsoft Huihui),能听,但音色比较生硬 - 启动时如果检测到缺 Python 或
edge-tts,鱼会冒泡提示一次,并把config.json的tts.engine自动切到sapi - 装好 Python 后把
tts.engine改回edge、重启鱼,就能用少女音
安装
方式一:作为 DSH 插件
dsh plugin 把参数原样转给 pnpm,所以下面几种来源都能用,装完重启 dsh web 生效。
① 直接从仓库装(推荐,已验证)
dsh plugin --profile web add "git+https://gitee.com/adengou/dsh-fish-pet.git"
② 从 npm 装(快照版,可能落后于仓库)
dsh plugin --profile web add dsh-fish-pet
npm 页面:https://www.npmjs.com/package/dsh-fish-pet
⚠️ npm 上是 0.2.4 快照,之后仓库里的修复(Python 依赖说明、启动自检等)尚未同步到 npm。想要最新功能请用 ① 从仓库装。
③ 从本地目录 / 离线 tgz 装
dsh plugin --profile web add "file:C:/path/to/dsh-fish-pet"
dsh plugin --profile web add "file:C:/path/to/dsh-fish-pet-0.2.0.tgz"
④ 从服务器上的 tgz 直链装(把 tgz 传到 Release / 图床等可直链的地方)
dsh plugin --profile web add "https://你的地址/dsh-fish-pet-0.2.0.tgz"
⑤ 从 GitHub 装
dsh plugin --profile web add github:adengou/dsh-fish-pet
仓库地址:https://github.com/adengou/dsh-fish-pet(与 Gitee 同步维护)
版本要求:DSH
>= 0.2.1-rc.5。版本不符时插件行会被判不兼容而禁用。
方式二:独立运行(不装 DSH 也能用)
wscript.exe assets\start-pet.vbs # 桌面鱼
wscript.exe assets\start-ear.vbs # 云端耳朵(语音对话用)
配置密钥(重要)
本仓库不包含任何密钥。两个 key 的读取顺序:
| 用途 | 环境变量(优先) | 文件(次选) |
|---|---|---|
| 对话模型(DeepSeek) | DEEPSEEK_API_KEY |
<数据目录>\deepseek.key |
| 语音识别(SiliconFlow) | SILICONFLOW_API_KEY |
<数据目录>\siliconflow.key |
<数据目录>默认%USERPROFILE%\.dsh\fish-pet- 兼容 DSH:DeepSeek key 找不到时还会读
%USERPROFILE%\.dsh\.credentials.yaml的DEEPSEEK_API_KEY - 密钥文件已在
.gitignore里,请勿提交
快速配置(PowerShell)
mkdir "$env:USERPROFILE\.dsh\fish-pet" -Force
Set-Content "$env:USERPROFILE\.dsh\fish-pet\deepseek.key" -Value "sk-你的DeepSeek密钥" -NoNewline
Set-Content "$env:USERPROFILE\.dsh\fish-pet\siliconflow.key" -Value "sk-你的硅基流动密钥" -NoNewline
注意事项:
- 文件里只放 key 本身,一行、不加引号、不加说明文字
- 用记事本也行:
Win+R→%USERPROFILE%\.dsh\fish-pet→ 新建deepseek.key/siliconflow.key(注意扩展名别留.txt) - 想改用环境变量:
setx DEEPSEEK_API_KEY "sk-..."和setx SILICONFLOW_API_KEY "sk-...",之后重开进程生效 - 验证:
Get-ChildItem "$env:USERPROFILE\.dsh\fish-pet\*.key" | Select-Object Name, Length
⚠️ 不要把真实 key 写进 README 或任何提交到仓库的文件——仓库是公开的。
加密保存 key(可选,更安全)
明文 key 文件容易被别的程序读走。项目自带一个工具,可以把它们换成 Windows DPAPI 加密(只能在本机当前用户下解开):
powershell -ExecutionPolicy Bypass -File tools\encrypt-keys.ps1
之后鱼和耳朵会优先读 deepseek.key.enc / siliconflow.key.enc,明文文件会被自动删除。
配置文件
首次启动会生成 %USERPROFILE%\.dsh\fish-pet\config.json,可以改:
{
"persona": {
"name": "大肥鱼",
"nameEn": "Mia",
"dad": "光光",
"mom": "丽丽",
"birthday": "2026年10月30日",
"birthplace": "中国广西北海",
"likes": "白饭、被摸头、主人夸它",
"dislikes": "被说胖、被冷落、吵",
"lang": "auto",
"extra": "说话简短、俏皮、微微傲娇,称呼用户为\"主人\",每次回复不超过30个字,不要用表情符号。"
},
"bubble": { "opacity": 0.15 },
"voice": { "silenceGate": 600, "silenceMs": 900, "boost": 1, "engine": "cloud", "localConf": 0.55 },
"tts": {
"engine": "edge",
"voice": "zh-CN-XiaoxiaoNeural",
"rate": "+12%",
"pitch": "+10Hz",
"voiceEn": "en-US-AnaNeural",
"rateEn": "+8%",
"pitchEn": "+15Hz"
}
}
persona.name:中文名(说中文时自称)persona.nameEn:英文名(说英文时自称,默认Mia/米娅)persona.dad/mom/birthday/birthplace:家人、生日、出生地persona.likes/dislikes:喜好、厌恶persona.lang:语言模式,zh(只用中文)/en(只用英文)/auto(跟着你说,默认)persona.extra:说话风格与长度限制(默认 30 字以内,回复越短开口越快)bubble.opacity:气泡文字透明度(0 = 全透明,1 = 不透明)voice.silenceGate:说话要多响才算"开始说话"(越小越灵敏,默认 600)voice.silenceMs:说完后等多久算"讲完了"(英文建议 900~1100,太小会把句子切断)voice.boost:麦克风增益倍数voice.engine:语音识别引擎,cloud(硅基流动 Qwen3-ASR,最准)/local(Windows 自带,免费但吃字)/auto(本地优先、云端兜底)voice.localConf:auto模式下本地识别置信度门槛,低于它就转云端
语音朗读(TTS)
默认音色 温柔姐姐·晓晓(zh-CN-XiaoxiaoNeural),用微软 Edge 在线语音:完全免费、不用任何 API Key,音色比 Windows 自带的 SAPI 自然得多。
需要本机装有 Python 3 并安装 edge-tts:
python -m pip install --upgrade edge-tts
注意:
edge-tts需 7.3.1 及以上,旧版会出现 403 握手失败。
tts 段各项含义:
| 字段 | 说明 |
|---|---|
engine |
edge(免费云端音色)/ sapi(Windows 本机语音) |
voice |
音色名,见下表 |
rate |
语速,如 +12%(快)、-10%(慢) |
pitch |
音调,如 +10Hz(更高更"萝")、-10Hz(更低) |
可选中文音色(edge 引擎):
| 音色 | 特点 |
|---|---|
zh-CN-XiaoyiNeural |
活泼少女 |
zh-CN-XiaoxiaoNeural |
温暖柔和,像邻家姐姐(默认) |
zh-CN-liaoning-XiaobeiNeural |
东北话,幽默 |
zh-CN-shaanxi-XiaoniNeural |
陕西话,明亮 |
zh-CN-YunxiNeural |
男声,阳光 |
zh-CN-YunxiaNeural |
男声,可爱 |
换音色:改 config.json 的 tts.voice → 重启鱼。若 edge 调用失败(没装 Python、断网等),会自动退回本机 SAPI 语音。
中英文聊天模式
鱼支持三种语言模式,右键菜单 语言模式 可即时切换(会写回 config.json 的 persona.lang):
| 模式 | 值 | 行为 |
|---|---|---|
| 中文 | zh |
始终用中文回 |
| English | en |
始终用英文回 |
| 自动模式(默认) | auto |
你用中文它用中文,你用英文它用英文 |
语言判断依据:统计中文字符数与英文字母数的比例,英文字母明显更多(且≥4个)就按英文处理。
朗读也会跟着换音色:英文回复用 en-US-AnaNeural(童声),中文回复用你配置的中文音色。英文音色可在 tts.voiceEn 里改,例如:
| 英文音色 | 特点 |
|---|---|
en-US-AnaNeural |
童声,可爱(默认) |
en-US-AvaNeural |
年轻女声,自然 |
en-US-AriaNeural |
女声,温柔 |
en-US-EmmaNeural |
女声,明快 |
en-GB-MaisieNeural |
英式童声 |
更新日志
见 CHANGELOG.md。
获取 SiliconFlow key
- 打开 https://cloud.siliconflow.cn,手机号注册登录
- 控制台 → API 密钥 → 新建密钥
- 写入
%USERPROFILE%\.dsh\fish-pet\siliconflow.key,或设为环境变量
获取 DeepSeek key
https://platform.deepseek.com → API keys。
隐私
- 麦克风音频按约 5 秒切片,上传 SiliconFlow 做识别;识别出的文字再发 DeepSeek 生成回复
- 其余数据(位置、日志、密钥)只存本机
- 不想用语音:别启动
start-ear.vbs,只用打字聊天
目录结构
dsh-fish-pet/
├─ lib/index.js # DSH 插件宿主:拉起/守护桌宠进程
├─ assets/
│ ├─ fish-pet.ps1 # 桌宠主体(绘制 + 聊天 + 语音朗读)
│ ├─ asr-listener.ps1 # 云端耳朵(WASAPI → SiliconFlow)
│ ├─ start-pet.vbs # 独立启动器
│ └─ start-ear.vbs
├─ cordis.patch.yml # DSH 插件插入行
└─ package.json
运行数据(%USERPROFILE%\.dsh\fish-pet\)
| 文件 | 作用 |
|---|---|
state.json |
位置 / 大小 |
pet.pid |
单实例守卫 |
error.log |
桌宠异常 |
asr.log |
识别结果(H=听到声音,1=识别成功) |
asr.level |
每段麦克风峰值(排查“听不见”先看它) |
asr.err |
耳朵异常 |
常见问题
叫它没反应?
- 看
asr.level:说话时峰值应明显变大;一直是几十说明麦克风没进来 - 看
asr.log:出现H说明听到了,出现1说明识别成功 - Windows 设置 → 隐私和安全性 → 麦克风,允许桌面应用访问
识别不准?
- 安静环境、靠近麦克风最好
- 可调
asr-listener.ps1顶部参数:-ChunkMs(片段长度)、-SilenceGate(静音门限)
它会接别人的话?
- 它是持续监听的;不想要时停掉
start-ear.vbs,或调高SilenceGate
开发
纯 PowerShell + WinForms,无第三方依赖。语法检查:
powershell -NoProfile -Command "$e=$null;$t=$null;[void][System.Management.Automation.Language.Parser]::ParseFile('assets\fish-pet.ps1',[ref]$t,[ref]$e);$e"
脚本是 UTF-8 带 BOM;编辑器保存时保留 BOM,否则 PowerShell 5.1 会按 ANSI 读成乱码。
插件配置
- insert:
- id: fish-pet
name: dsh-fish-pet
config:
enabled: true # false 则不启动
scale: 1 # 0.5 ~ 2
speed: 26 # 5 ~ 120 像素/秒
许可
MIT,见 LICENSE。