dsh-fish-pet 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,32 @@
1
1
  # Changelog
2
2
 
3
- ## [0.2.2] - 2026-10-31
3
+ ## [0.2.6] - 2026-10-31
4
+
5
+ ### Changed
6
+ - 回复长度限制 60 字 → **30 字**(越短开口越快)
7
+ - 常驻 TTS 进程:单句合成 4 秒 → **2 秒**
8
+ - 分段流水线:先合成第一句就开播,后面边播边合成,开口等待再减半
9
+ - 中英历史隔离:中文模式只带中文历史、英文模式只带英文历史,避免串味
10
+
11
+ ### Fixed
12
+ - 中文提问偶尔用英文回答(历史残留英文带跑)
13
+ ## [0.2.5] - 2026-10-31
14
+
15
+ ### Added
16
+ - 中英文聊天模式:中文 / English / 自动模式(默认 auto),英文回复自动切换英文音色
17
+ - 人设英文名 `persona.nameEn`(默认 Mia / 米娅)
18
+ - 右键「语言模式」「换个声音」子菜单带勾选状态
19
+ - 启动自检:缺 Python/edge-tts 时提示并回退本机语音
20
+
21
+ ### Fixed
22
+ - 自言自语:录音期间鱼开口说话时丢弃该段,不再听见自己
23
+ - 收音开关卡死:`asr.talking` 超过 25 秒强制复位(看门狗)
24
+ - 轻声识别失败:音频峰值归一化到 70% 满幅,增益上限 35 倍
25
+ - 英文被识别成中文/泰文乱码:移除强制 `language=zh`,交给模型自动判断;并过滤跑偏语种
26
+ - 英文句子被切碎:VAD 最少 1.2 秒、静音判定 1100ms
27
+ - TTS 生成卡界面:改为后台线程生成,说话时鱼照常游动
28
+ - 右键菜单弹出即消失:停止每帧重设窗口位置
29
+ ## [0.2.4] - 2026-10-31
4
30
 
5
31
  ### Added
6
32
  - 语音朗读接入微软 Edge 免费音色(默认 `zh-CN-XiaoxiaoNeural` 温柔姐姐音),右键「换个声音」可即时切换并试听
@@ -15,6 +41,10 @@
15
41
  - README 封面图在 npm 页面上不显示(改为绝对地址)
16
42
  ## [Unreleased]
17
43
 
44
+ ### Added
45
+ - 中英文聊天模式:右键「语言模式」可切 中文 / English / 自动跟随(默认 auto)
46
+ - 英文回复自动改用英文音色(默认 en-US-AnaNeural 童声),可在 tts.voiceEn 配置
47
+
18
48
  ### Added
19
49
  - 右键「打字说两句」:没有麦克风也能聊
20
50
  - 持久记忆:`memory.json` 保存最近 24 条对话,重启不丢
package/README.md CHANGED
@@ -1,121 +1,144 @@
1
1
  # dsh-fish-pet · 桌面蓝鱼
2
2
 
3
- ![dsh-fish-pet](https://gitee.com/adengou/dsh-fish-pet/raw/main/docs/banner.png)
4
-
5
- 给 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 养一条住在 Windows 桌面上的蓝鱼。
6
- 它不是网页贴图:是一个**逐像素透明的置顶窗口**,用 PowerShell + WinForms 逐帧绘制,还能**听你说话、跟你聊天、用中文语音回你**。
7
-
8
- > 个人作品,与 DeepSeek 官方无关。
9
-
10
- ## 特性
11
-
12
- - 桌面常驻:全屏随机游动、随机停歇、眨眼、吐泡泡、尾巴与鱼鳍摆动
13
- - 交互:拖动换位置、左键喂食、右键菜单(大小 / 回家 / 语音朗读 / 提醒 / 清除记忆 / 退出)
14
- - 聊天:输入框打字或语音 → 调 `deepseek-flash` → 气泡回复 + 语音朗读
15
- - **语音对话**:独立"耳朵"进程用 WASAPI 采集麦克风 → 云端 Qwen3-ASR 识别 → 自动接话(说完约 1 秒内开始回)
16
- - **语音朗读**:默认用微软 Edge 的 `zh-CN-XiaoyiNeural` 少女音(免费、无需 Key,可换音色/语速/音调)
17
- - **情绪系统**:饥饿值、亲密度、心情(开心/委屈/饿/被冷落),会体现在语气、表情和配音上
18
- - **记忆**:最近 24 条对话 + 长期摘要 + 主人交代的便签 + 定时提醒(到点主动开口)
19
- - 单实例守卫、异常落盘(不弹框)、耳朵掉线自动重启、位置记忆、开机自启
20
-
21
- ## 环境要求
22
-
23
- - Windows 10 / 11
24
- - PowerShell 5.1(系统自带)
25
- - Node.js ≥ 22(仅作为 DSH 插件时需要)
26
- - 麦克风(语音对话需要)
27
-
28
- ## 安装
29
-
30
- ### 方式一:作为 DSH 插件
31
-
32
- `dsh plugin` 把参数原样转给 pnpm,所以下面几种来源都能用,装完**重启 `dsh web`** 生效。
33
-
34
- **① 直接从仓库装(推荐,已验证)**
35
-
36
- ```powershell
37
- dsh plugin --profile web add "git+https://gitee.com/adengou/dsh-fish-pet.git"
38
- ```
39
-
40
- **② 从 npm 装(最接近其它插件,✅ 已发布)**
41
-
42
- ```powershell
43
- dsh plugin --profile web add dsh-fish-pet
44
- ```
45
-
46
- > npm 页面:https://www.npmjs.com/package/dsh-fish-pet
47
-
48
- **③ 从本地目录 / 离线 tgz 装**
49
-
50
- ```powershell
51
- dsh plugin --profile web add "file:C:/path/to/dsh-fish-pet"
52
- dsh plugin --profile web add "file:C:/path/to/dsh-fish-pet-0.2.0.tgz"
53
- ```
54
-
55
- **④ 从服务器上的 tgz 直链装**(把 tgz 传到 Release / 图床等可直链的地方)
56
-
57
- ```powershell
58
- dsh plugin --profile web add "https://你的地址/dsh-fish-pet-0.2.0.tgz"
59
- ```
60
-
61
- **⑤ 从 GitHub 装**
62
-
63
- ```powershell
64
- dsh plugin --profile web add github:adengou/dsh-fish-pet
65
- ```
66
-
67
- > 仓库地址:https://github.com/adengou/dsh-fish-pet(与 Gitee 同步维护)
68
-
69
- > 版本要求:DSH `>= 0.2.1-rc.5`。版本不符时插件行会被判不兼容而禁用。
70
-
71
- ### 方式二:独立运行(不装 DSH 也能用)
72
-
73
- ```powershell
74
- wscript.exe assets\start-pet.vbs # 桌面鱼
75
- wscript.exe assets\start-ear.vbs # 云端耳朵(语音对话用)
76
- ```
77
-
78
- ## 配置密钥(重要)
79
-
80
- 本仓库**不包含任何密钥**。两个 key 的读取顺序:
81
-
82
- | 用途 | 环境变量(优先) | 文件(次选) |
83
- | --- | --- | --- |
84
- | 对话模型(DeepSeek) | `DEEPSEEK_API_KEY` | `<数据目录>\deepseek.key` |
85
- | 语音识别(SiliconFlow) | `SILICONFLOW_API_KEY` | `<数据目录>\siliconflow.key` |
86
-
87
- - `<数据目录>` 默认 `%USERPROFILE%\.dsh\fish-pet`
88
- - 兼容 DSH:DeepSeek key 找不到时还会读 `%USERPROFILE%\.dsh\.credentials.yaml` 的 `DEEPSEEK_API_KEY`
89
- - 密钥文件已在 `.gitignore` 里,请勿提交
90
-
91
- ### 快速配置(PowerShell)
92
-
93
- ```powershell
94
- mkdir "$env:USERPROFILE\.dsh\fish-pet" -Force
95
-
96
- Set-Content "$env:USERPROFILE\.dsh\fish-pet\deepseek.key" -Value "sk-你的DeepSeek密钥" -NoNewline
97
- Set-Content "$env:USERPROFILE\.dsh\fish-pet\siliconflow.key" -Value "sk-你的硅基流动密钥" -NoNewline
98
- ```
99
-
100
- 注意事项:
101
-
102
- - 文件里**只放 key 本身**,一行、不加引号、不加说明文字
103
- - 用记事本也行:`Win+R` → `%USERPROFILE%\.dsh\fish-pet` → 新建 `deepseek.key` / `siliconflow.key`(注意扩展名别留 `.txt`)
104
- - 想改用环境变量:`setx DEEPSEEK_API_KEY "sk-..."` 和 `setx SILICONFLOW_API_KEY "sk-..."`,之后重开进程生效
105
- - 验证:`Get-ChildItem "$env:USERPROFILE\.dsh\fish-pet\*.key" | Select-Object Name, Length`
106
-
107
- > ⚠️ 不要把真实 key 写进 README 或任何提交到仓库的文件——仓库是公开的。
108
-
109
- ### 加密保存 key(可选,更安全)
110
-
111
- 明文 key 文件容易被别的程序读走。项目自带一个工具,可以把它们换成 **Windows DPAPI 加密**(只能在本机当前用户下解开):
112
-
113
- ```powershell
114
- powershell -ExecutionPolicy Bypass -File tools\encrypt-keys.ps1
115
- ```
116
-
117
- 之后鱼和耳朵会优先读 `deepseek.key.enc` / `siliconflow.key.enc`,明文文件会被自动删除。
118
-
3
+ [![Gitee Star](https://gitee.com/adengou/dsh-fish-pet/badge/star.svg?theme=dark)](https://gitee.com/adengou/dsh-fish-pet/stargazers)
4
+ [![Gitee Fork](https://gitee.com/adengou/dsh-fish-pet/badge/fork.svg?theme=dark)](https://gitee.com/adengou/dsh-fish-pet/members)
5
+ [![GitHub Stars](https://img.shields.io/github/stars/adengou/dsh-fish-pet?style=social)](https://github.com/adengou/dsh-fish-pet/stargazers)
6
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+
8
+ ![dsh-fish-pet](https://gitee.com/adengou/dsh-fish-pet/raw/main/docs/banner.png)
9
+
10
+ 给 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 养一条住在 Windows 桌面上的蓝鱼。
11
+ 它不是网页贴图:是一个**逐像素透明的置顶窗口**,用 PowerShell + WinForms 逐帧绘制,还能**听你说话、跟你聊天、用中文语音回你**。
12
+
13
+ > 个人作品,与 DeepSeek 官方无关。
14
+
15
+ ## 特性
16
+
17
+ - 桌面常驻:全屏随机游动、随机停歇、眨眼、吐泡泡、尾巴与鱼鳍摆动
18
+ - 交互:拖动换位置、左键喂食、右键菜单(大小 / 回家 / 语音朗读 / 提醒 / 清除记忆 / 退出)
19
+ - 聊天:输入框打字或语音 → 调 `deepseek-flash` → 气泡回复 + 语音朗读
20
+ - **语音对话**:独立"耳朵"进程用 WASAPI 采集麦克风 → 云端 Qwen3-ASR 识别 → 自动接话(说完约 1 秒内开始回)
21
+ - **语音朗读**:默认用微软 Edge 的 `zh-CN-XiaoyiNeural` 少女音(免费、无需 Key,可换音色/语速/音调)
22
+ - **情绪系统**:饥饿值、亲密度、心情(开心/委屈/饿/被冷落),会体现在语气、表情和配音上
23
+ - **记忆**:最近 24 条对话 + 长期摘要 + 主人交代的便签 + 定时提醒(到点主动开口)
24
+ - 单实例守卫、异常落盘(不弹框)、耳朵掉线自动重启、位置记忆、开机自启
25
+
26
+ ## 环境要求
27
+
28
+ | 依赖 | 是否必需 | 用途 |
29
+ | --- | --- | --- |
30
+ | Windows 10 / 11 | **必需** | 桌面窗口与 PowerShell 运行环境 |
31
+ | PowerShell 5.1 | 必需(系统自带) | 运行鱼和耳朵脚本 |
32
+ | Node.js ≥ 22 | 作为 DSH 插件时必需 | 插件宿主 |
33
+ | 麦克风 | 语音对话需要 | WASAPI 采集 |
34
+ | **Python 3.8+** | **可选** | 仅用于「微软 Edge 云语音」(音色更自然) |
35
+ | **edge-tts**(pip 包) | 可选 | 同上,缺它就自动退回本机 SAPI 语音 |
36
+
37
+ ### 关于 Python / edge-tts(语音朗读)
38
+
39
+ 鱼默认用微软 Edge 的云音色朗读(免费、无需 API Key),需要本机有 Python 3 和 `edge-tts`:
40
+
41
+ ```powershell
42
+ python -m pip install --upgrade edge-tts
43
+ ```
44
+
45
+ - **没装也没关系**:鱼会自动退回 Windows 自带的 SAPI 语音(`Microsoft Huihui`),能听,但音色比较生硬
46
+ - 启动时如果检测到缺 Python 或 `edge-tts`,鱼会冒泡提示一次,并把 `config.json` 的 `tts.engine` 自动切到 `sapi`
47
+ - 装好 Python 后把 `tts.engine` 改回 `edge`、重启鱼,就能用少女音
48
+
49
+ ## 安装
50
+
51
+ ### 方式一:作为 DSH 插件
52
+
53
+ `dsh plugin` 把参数原样转给 pnpm,所以下面几种来源都能用,装完**重启 `dsh web`** 生效。
54
+
55
+ **① 直接从仓库装(推荐,已验证)**
56
+
57
+ ```powershell
58
+ dsh plugin --profile web add "git+https://gitee.com/adengou/dsh-fish-pet.git"
59
+ ```
60
+
61
+ **② 从 npm 装(快照版,可能落后于仓库)**
62
+
63
+ ```powershell
64
+ dsh plugin --profile web add dsh-fish-pet
65
+ ```
66
+
67
+ > npm 页面:https://www.npmjs.com/package/dsh-fish-pet
68
+ >
69
+ > ⚠️ npm 上是 **0.2.4 快照**,之后仓库里的修复(Python 依赖说明、启动自检等)尚未同步到 npm。想要最新功能请用 ① 从仓库装。
70
+
71
+ **③ 从本地目录 / 离线 tgz 装**
72
+
73
+ ```powershell
74
+ dsh plugin --profile web add "file:C:/path/to/dsh-fish-pet"
75
+ dsh plugin --profile web add "file:C:/path/to/dsh-fish-pet-0.2.0.tgz"
76
+ ```
77
+
78
+ **④ 从服务器上的 tgz 直链装**(把 tgz 传到 Release / 图床等可直链的地方)
79
+
80
+ ```powershell
81
+ dsh plugin --profile web add "https://你的地址/dsh-fish-pet-0.2.0.tgz"
82
+ ```
83
+
84
+ **⑤ 从 GitHub 装**
85
+
86
+ ```powershell
87
+ dsh plugin --profile web add github:adengou/dsh-fish-pet
88
+ ```
89
+
90
+ > 仓库地址:https://github.com/adengou/dsh-fish-pet(与 Gitee 同步维护)
91
+
92
+ > 版本要求:DSH `>= 0.2.1-rc.5`。版本不符时插件行会被判不兼容而禁用。
93
+
94
+ ### 方式二:独立运行(不装 DSH 也能用)
95
+
96
+ ```powershell
97
+ wscript.exe assets\start-pet.vbs # 桌面鱼
98
+ wscript.exe assets\start-ear.vbs # 云端耳朵(语音对话用)
99
+ ```
100
+
101
+ ## 配置密钥(重要)
102
+
103
+ 本仓库**不包含任何密钥**。两个 key 的读取顺序:
104
+
105
+ | 用途 | 环境变量(优先) | 文件(次选) |
106
+ | --- | --- | --- |
107
+ | 对话模型(DeepSeek) | `DEEPSEEK_API_KEY` | `<数据目录>\deepseek.key` |
108
+ | 语音识别(SiliconFlow) | `SILICONFLOW_API_KEY` | `<数据目录>\siliconflow.key` |
109
+
110
+ - `<数据目录>` 默认 `%USERPROFILE%\.dsh\fish-pet`
111
+ - 兼容 DSH:DeepSeek key 找不到时还会读 `%USERPROFILE%\.dsh\.credentials.yaml` 的 `DEEPSEEK_API_KEY`
112
+ - 密钥文件已在 `.gitignore` 里,请勿提交
113
+
114
+ ### 快速配置(PowerShell)
115
+
116
+ ```powershell
117
+ mkdir "$env:USERPROFILE\.dsh\fish-pet" -Force
118
+
119
+ Set-Content "$env:USERPROFILE\.dsh\fish-pet\deepseek.key" -Value "sk-你的DeepSeek密钥" -NoNewline
120
+ Set-Content "$env:USERPROFILE\.dsh\fish-pet\siliconflow.key" -Value "sk-你的硅基流动密钥" -NoNewline
121
+ ```
122
+
123
+ 注意事项:
124
+
125
+ - 文件里**只放 key 本身**,一行、不加引号、不加说明文字
126
+ - 用记事本也行:`Win+R` → `%USERPROFILE%\.dsh\fish-pet` → 新建 `deepseek.key` / `siliconflow.key`(注意扩展名别留 `.txt`)
127
+ - 想改用环境变量:`setx DEEPSEEK_API_KEY "sk-..."` 和 `setx SILICONFLOW_API_KEY "sk-..."`,之后重开进程生效
128
+ - 验证:`Get-ChildItem "$env:USERPROFILE\.dsh\fish-pet\*.key" | Select-Object Name, Length`
129
+
130
+ > ⚠️ 不要把真实 key 写进 README 或任何提交到仓库的文件——仓库是公开的。
131
+
132
+ ### 加密保存 key(可选,更安全)
133
+
134
+ 明文 key 文件容易被别的程序读走。项目自带一个工具,可以把它们换成 **Windows DPAPI 加密**(只能在本机当前用户下解开):
135
+
136
+ ```powershell
137
+ powershell -ExecutionPolicy Bypass -File tools\encrypt-keys.ps1
138
+ ```
139
+
140
+ 之后鱼和耳朵会优先读 `deepseek.key.enc` / `siliconflow.key.enc`,明文文件会被自动删除。
141
+
119
142
  ## 配置文件
120
143
 
121
144
  首次启动会生成 `%USERPROFILE%\.dsh\fish-pet\config.json`,可以改:
@@ -124,142 +147,179 @@ powershell -ExecutionPolicy Bypass -File tools\encrypt-keys.ps1
124
147
  {
125
148
  "persona": {
126
149
  "name": "大肥鱼",
150
+ "nameEn": "Mia",
127
151
  "dad": "光光",
128
152
  "mom": "丽丽",
129
153
  "birthday": "2026年10月30日",
130
154
  "birthplace": "中国广西北海",
131
155
  "likes": "白饭、被摸头、主人夸它",
132
156
  "dislikes": "被说胖、被冷落、吵",
133
- "extra": "你说话简短、俏皮、微微傲娇,用中文,称呼用户为\"主人\",每次回复不超过60个字,不要用表情符号。"
157
+ "lang": "auto",
158
+ "extra": "你说话简短、俏皮、微微傲娇,称呼用户为\"主人\",每次回复不超过30个字,不要用表情符号。"
134
159
  },
135
160
  "bubble": { "opacity": 0.15 },
136
- "voice": { "silenceGate": 1200, "boost": 1, "engine": "cloud", "localConf": 0.55 },
137
- "tts": { "engine": "edge", "voice": "zh-CN-XiaoxiaoNeural", "rate": "+12%", "pitch": "+10Hz" }
161
+ "voice": { "silenceGate": 600, "silenceMs": 900, "boost": 1, "engine": "cloud", "localConf": 0.55 },
162
+ "tts": {
163
+ "engine": "edge",
164
+ "voice": "zh-CN-XiaoxiaoNeural",
165
+ "rate": "+12%",
166
+ "pitch": "+10Hz",
167
+ "voiceEn": "en-US-AnaNeural",
168
+ "rateEn": "+8%",
169
+ "pitchEn": "+15Hz"
170
+ }
138
171
  }
139
172
  ```
140
173
 
141
- - `persona`:名字、家人、生日、出生地、喜好、厌恶、说话风格——改完重启鱼即生效
174
+ - `persona.name`:中文名(说中文时自称)
175
+ - `persona.nameEn`:**英文名**(说英文时自称,默认 `Mia`/米娅)
176
+ - `persona.dad` / `mom` / `birthday` / `birthplace`:家人、生日、出生地
177
+ - `persona.likes` / `dislikes`:喜好、厌恶
178
+ - `persona.lang`:语言模式,`zh`(只用中文)/ `en`(只用英文)/ `auto`(跟着你说,默认)
179
+ - `persona.extra`:说话风格与长度限制(默认 30 字以内,回复越短开口越快)
142
180
  - `bubble.opacity`:气泡文字透明度(0 = 全透明,1 = 不透明)
143
- - `voice.silenceGate`:说话要多响才算"开始说话"(越大越不灵敏)
181
+ - `voice.silenceGate`:说话要多响才算"开始说话"(越小越灵敏,默认 600)
182
+ - `voice.silenceMs`:说完后等多久算"讲完了"(英文建议 900~1100,太小会把句子切断)
144
183
  - `voice.boost`:麦克风增益倍数
145
184
  - `voice.engine`:语音识别引擎,`cloud`(硅基流动 Qwen3-ASR,最准)/ `local`(Windows 自带,免费但吃字)/ `auto`(本地优先、云端兜底)
146
185
  - `voice.localConf`:`auto` 模式下本地识别置信度门槛,低于它就转云端
147
-
148
- ### 语音朗读(TTS)
149
-
150
- 默认音色 **温柔姐姐·晓晓**(`zh-CN-XiaoxiaoNeural`),用**微软 Edge 在线语音**:完全免费、不用任何 API Key,音色比 Windows 自带的 SAPI 自然得多。
151
-
152
- 需要本机装有 Python 3 并安装 `edge-tts`:
153
-
154
- ```powershell
155
- python -m pip install --upgrade edge-tts
156
- ```
157
-
158
- > 注意:`edge-tts` 需 7.3.1 及以上,旧版会出现 403 握手失败。
159
-
160
- `tts` 段各项含义:
161
-
162
- | 字段 | 说明 |
163
- | --- | --- |
164
- | `engine` | `edge`(免费云端音色)/ `sapi`(Windows 本机语音) |
165
- | `voice` | 音色名,见下表 |
166
- | `rate` | 语速,如 `+12%`(快)、`-10%`(慢) |
167
- | `pitch` | 音调,如 `+10Hz`(更高更"萝")、`-10Hz`(更低) |
168
-
169
- 可选中文音色(`edge` 引擎):
170
-
171
- | 音色 | 特点 |
172
- | --- | --- |
173
- | `zh-CN-XiaoyiNeural` | 活泼少女 |
174
- | `zh-CN-XiaoxiaoNeural` | **温暖柔和,像邻家姐姐**(默认) |
175
- | `zh-CN-liaoning-XiaobeiNeural` | 东北话,幽默 |
176
- | `zh-CN-shaanxi-XiaoniNeural` | 陕西话,明亮 |
177
- | `zh-CN-YunxiNeural` | 男声,阳光 |
178
- | `zh-CN-YunxiaNeural` | 男声,可爱 |
179
-
180
- 换音色:改 `config.json` 的 `tts.voice` → 重启鱼。若 `edge` 调用失败(没装 Python、断网等),会自动退回本机 SAPI 语音。
181
-
182
- ## 更新日志
183
-
184
- 见 [CHANGELOG.md](CHANGELOG.md)。
185
-
186
- ### 获取 SiliconFlow key
187
-
188
- 1. 打开 <https://cloud.siliconflow.cn>,手机号注册登录
189
- 2. 控制台 → API 密钥 → 新建密钥
190
- 3. 写入 `%USERPROFILE%\.dsh\fish-pet\siliconflow.key`,或设为环境变量
191
-
192
- ### 获取 DeepSeek key
193
-
194
- <https://platform.deepseek.com> → API keys。
195
-
196
- ## 隐私
197
-
198
- - 麦克风音频按约 5 秒切片,**上传 SiliconFlow 做识别**;识别出的文字再发 DeepSeek 生成回复
199
- - 其余数据(位置、日志、密钥)只存本机
200
- - 不想用语音:别启动 `start-ear.vbs`,只用打字聊天
201
-
202
- ## 目录结构
203
-
204
- ```
205
- dsh-fish-pet/
206
- ├─ lib/index.js # DSH 插件宿主:拉起/守护桌宠进程
207
- ├─ assets/
208
- │ ├─ fish-pet.ps1 # 桌宠主体(绘制 + 聊天 + 语音朗读)
209
- │ ├─ asr-listener.ps1 # 云端耳朵(WASAPI → SiliconFlow)
210
- │ ├─ start-pet.vbs # 独立启动器
211
- │ └─ start-ear.vbs
212
- ├─ cordis.patch.yml # DSH 插件插入行
213
- └─ package.json
214
- ```
215
-
216
- ## 运行数据(`%USERPROFILE%\.dsh\fish-pet\`)
217
-
218
- | 文件 | 作用 |
219
- | --- | --- |
220
- | `state.json` | 位置 / 大小 |
221
- | `pet.pid` | 单实例守卫 |
222
- | `error.log` | 桌宠异常 |
223
- | `asr.log` | 识别结果(`H`=听到声音,`1`=识别成功) |
224
- | `asr.level` | 每段麦克风峰值(排查“听不见”先看它) |
225
- | `asr.err` | 耳朵异常 |
226
-
227
- ## 常见问题
228
-
229
- **叫它没反应?**
230
- 1. 看 `asr.level`:说话时峰值应明显变大;一直是几十说明麦克风没进来
231
- 2. 看 `asr.log`:出现 `H` 说明听到了,出现 `1` 说明识别成功
232
- 3. Windows 设置 → 隐私和安全性 → 麦克风,允许桌面应用访问
233
-
234
- **识别不准?**
235
- - 安静环境、靠近麦克风最好
236
- - 可调 `asr-listener.ps1` 顶部参数:`-ChunkMs`(片段长度)、`-SilenceGate`(静音门限)
237
-
238
- **它会接别人的话?**
239
- - 它是持续监听的;不想要时停掉 `start-ear.vbs`,或调高 `SilenceGate`
240
-
241
- ## 开发
242
-
243
- 纯 PowerShell + WinForms,无第三方依赖。语法检查:
244
-
245
- ```powershell
246
- powershell -NoProfile -Command "$e=$null;$t=$null;[void][System.Management.Automation.Language.Parser]::ParseFile('assets\fish-pet.ps1',[ref]$t,[ref]$e);$e"
247
- ```
248
-
249
- > 脚本是 UTF-8 **带 BOM**;编辑器保存时保留 BOM,否则 PowerShell 5.1 会按 ANSI 读成乱码。
250
-
251
- ## 插件配置
252
-
253
- ```yaml
254
- - insert:
255
- - id: fish-pet
256
- name: dsh-fish-pet
257
- config:
258
- enabled: true # false 则不启动
259
- scale: 1 # 0.5 ~ 2
260
- speed: 26 # 5 ~ 120 像素/秒
261
- ```
262
-
263
- ## 许可
264
-
265
- MIT,见 [LICENSE](LICENSE)。
186
+
187
+ ### 语音朗读(TTS)
188
+
189
+ 默认音色 **温柔姐姐·晓晓**(`zh-CN-XiaoxiaoNeural`),用**微软 Edge 在线语音**:完全免费、不用任何 API Key,音色比 Windows 自带的 SAPI 自然得多。
190
+
191
+ 需要本机装有 Python 3 并安装 `edge-tts`:
192
+
193
+ ```powershell
194
+ python -m pip install --upgrade edge-tts
195
+ ```
196
+
197
+ > 注意:`edge-tts` 需 7.3.1 及以上,旧版会出现 403 握手失败。
198
+
199
+ `tts` 段各项含义:
200
+
201
+ | 字段 | 说明 |
202
+ | --- | --- |
203
+ | `engine` | `edge`(免费云端音色)/ `sapi`(Windows 本机语音) |
204
+ | `voice` | 音色名,见下表 |
205
+ | `rate` | 语速,如 `+12%`(快)、`-10%`(慢) |
206
+ | `pitch` | 音调,如 `+10Hz`(更高更"萝")、`-10Hz`(更低) |
207
+
208
+ 可选中文音色(`edge` 引擎):
209
+
210
+ | 音色 | 特点 |
211
+ | --- | --- |
212
+ | `zh-CN-XiaoyiNeural` | 活泼少女 |
213
+ | `zh-CN-XiaoxiaoNeural` | **温暖柔和,像邻家姐姐**(默认) |
214
+ | `zh-CN-liaoning-XiaobeiNeural` | 东北话,幽默 |
215
+ | `zh-CN-shaanxi-XiaoniNeural` | 陕西话,明亮 |
216
+ | `zh-CN-YunxiNeural` | 男声,阳光 |
217
+ | `zh-CN-YunxiaNeural` | 男声,可爱 |
218
+
219
+ 换音色:改 `config.json` 的 `tts.voice` → 重启鱼。若 `edge` 调用失败(没装 Python、断网等),会自动退回本机 SAPI 语音。
220
+ ### 中英文聊天模式
221
+
222
+ 鱼支持三种语言模式,右键菜单 **语言模式** 可即时切换(会写回 `config.json` 的 `persona.lang`):
223
+
224
+ | 模式 | 值 | 行为 |
225
+ | --- | --- | --- |
226
+ | 中文 | `zh` | 始终用中文回 |
227
+ | English | `en` | 始终用英文回 |
228
+ | **自动模式**(默认) | `auto` | 你用中文它用中文,你用英文它用英文 |
229
+
230
+ 语言判断依据:统计中文字符数与英文字母数的比例,英文字母明显更多(且≥4个)就按英文处理。
231
+
232
+ **朗读也会跟着换音色**:英文回复用 `en-US-AnaNeural`(童声),中文回复用你配置的中文音色。英文音色可在 `tts.voiceEn` 里改,例如:
233
+
234
+ | 英文音色 | 特点 |
235
+ | --- | --- |
236
+ | `en-US-AnaNeural` | 童声,可爱(默认) |
237
+ | `en-US-AvaNeural` | 年轻女声,自然 |
238
+ | `en-US-AriaNeural` | 女声,温柔 |
239
+ | `en-US-EmmaNeural` | 女声,明快 |
240
+ | `en-GB-MaisieNeural` | 英式童声 |
241
+
242
+ ## 更新日志
243
+
244
+ 见 [CHANGELOG.md](CHANGELOG.md)。
245
+
246
+ ### 获取 SiliconFlow key
247
+
248
+ 1. 打开 <https://cloud.siliconflow.cn>,手机号注册登录
249
+ 2. 控制台 → API 密钥 → 新建密钥
250
+ 3. 写入 `%USERPROFILE%\.dsh\fish-pet\siliconflow.key`,或设为环境变量
251
+
252
+ ### 获取 DeepSeek key
253
+
254
+ <https://platform.deepseek.com> → API keys。
255
+
256
+ ## 隐私
257
+
258
+ - 麦克风音频按约 5 秒切片,**上传 SiliconFlow 做识别**;识别出的文字再发 DeepSeek 生成回复
259
+ - 其余数据(位置、日志、密钥)只存本机
260
+ - 不想用语音:别启动 `start-ear.vbs`,只用打字聊天
261
+
262
+ ## 目录结构
263
+
264
+ ```
265
+ dsh-fish-pet/
266
+ ├─ lib/index.js # DSH 插件宿主:拉起/守护桌宠进程
267
+ ├─ assets/
268
+ │ ├─ fish-pet.ps1 # 桌宠主体(绘制 + 聊天 + 语音朗读)
269
+ │ ├─ asr-listener.ps1 # 云端耳朵(WASAPI → SiliconFlow)
270
+ │ ├─ start-pet.vbs # 独立启动器
271
+ │ └─ start-ear.vbs
272
+ ├─ cordis.patch.yml # DSH 插件插入行
273
+ └─ package.json
274
+ ```
275
+
276
+ ## 运行数据(`%USERPROFILE%\.dsh\fish-pet\`)
277
+
278
+ | 文件 | 作用 |
279
+ | --- | --- |
280
+ | `state.json` | 位置 / 大小 |
281
+ | `pet.pid` | 单实例守卫 |
282
+ | `error.log` | 桌宠异常 |
283
+ | `asr.log` | 识别结果(`H`=听到声音,`1`=识别成功) |
284
+ | `asr.level` | 每段麦克风峰值(排查“听不见”先看它) |
285
+ | `asr.err` | 耳朵异常 |
286
+
287
+ ## 常见问题
288
+
289
+ **叫它没反应?**
290
+ 1. 看 `asr.level`:说话时峰值应明显变大;一直是几十说明麦克风没进来
291
+ 2. 看 `asr.log`:出现 `H` 说明听到了,出现 `1` 说明识别成功
292
+ 3. Windows 设置 → 隐私和安全性 → 麦克风,允许桌面应用访问
293
+
294
+ **识别不准?**
295
+ - 安静环境、靠近麦克风最好
296
+ - 可调 `asr-listener.ps1` 顶部参数:`-ChunkMs`(片段长度)、`-SilenceGate`(静音门限)
297
+
298
+ **它会接别人的话?**
299
+ - 它是持续监听的;不想要时停掉 `start-ear.vbs`,或调高 `SilenceGate`
300
+
301
+ ## 开发
302
+
303
+ 纯 PowerShell + WinForms,无第三方依赖。语法检查:
304
+
305
+ ```powershell
306
+ powershell -NoProfile -Command "$e=$null;$t=$null;[void][System.Management.Automation.Language.Parser]::ParseFile('assets\fish-pet.ps1',[ref]$t,[ref]$e);$e"
307
+ ```
308
+
309
+ > 脚本是 UTF-8 **带 BOM**;编辑器保存时保留 BOM,否则 PowerShell 5.1 会按 ANSI 读成乱码。
310
+
311
+ ## 插件配置
312
+
313
+ ```yaml
314
+ - insert:
315
+ - id: fish-pet
316
+ name: dsh-fish-pet
317
+ config:
318
+ enabled: true # false 则不启动
319
+ scale: 1 # 0.5 ~ 2
320
+ speed: 26 # 5 ~ 120 像素/秒
321
+ ```
322
+
323
+ ## 许可
324
+
325
+ MIT,见 [LICENSE](LICENSE)。