# dsh-voice-kit 🎙️

DeepSeek Harness Web GUI 的**语音输入**与**回复朗读**套件。

[English](README.md)

> **状态：v0.4.0 已发布 npm** — `pnpm typecheck` 通过、239 个单测通过、
> `pnpm build` 产出生态标准 closure-factory bundle（宿主半区 + 浏览器半区）。
> 已在真实 DSH Desktop profile 里验证通过。安装：`dsh plugin add dsh-voice-kit`。

## 功能

- 🎤 **语音输入** — 输入框左侧麦克风按钮；录音后经宿主侧 STT 转写并**追加**进草稿（不覆盖已有输入）。
  支持**浏览器 Web Speech API**（Chrome/Edge）与**宿主侧 OpenAI 兼容转写服务**（如硅基流动 SenseVoice）
  两种后端，`Esc` 取消、可随时停止。
- 🔊 **回复朗读（三种引擎）** — 每条 assistant 消息尾部朗读按钮：
  - **微软神经语音**（免费，晓晓/云希/云健/云扬…）— 宿主侧经 `msedge-tts` 合成，带缓存；被墙网络经系统代理隧道自动连通
  - **云端神经语音**（硅基流动 CosyVoice2 等 OpenAI 兼容 `audio/speech`，境内直连、无需代理）— 复用语音识别密钥
  - **系统语音** — 完全离线兜底，任何环境都可用
  - 朗读前剥离 markdown / emoji；长回复按句子边界**流式分块**——首块约 1 秒内出声，后续边播边预取；同一时刻只读一条；播放中消息自动滚到视野中央并弹气泡显示正在读的内容；再次点击立即停止。
- ⚙️ **设置** — 一级设置页：语音引擎（三种）、云端服务一键预设、音色、语速、音调、识别语言、引擎可用性探测（Edge 是否能连点一下就显示）、密钥状态（只显示「已保存/未设置」，绝不回显值）。

## 新手教程（5 分钟上手）

### 1. 安装

```bash
# 从 npm 安装（推荐）
dsh plugin add dsh-voice-kit

# 或本地开发安装
dsh plugin --profile desktop add link:/path/to/dsh-voice-kit
```

重启 DSH Desktop 并刷新 Web GUI。

### 2. 让回复朗读出声（选一种引擎）

打开**设置 → 语音 → 回复朗读**：

- **立刻可用的**：选「**系统语音**」→ 点 🔊 就有声音（离线，音质一般）。
- **免费且好听**：选「**微软神经语音**」→ 设置页会显示「❌ Edge 不可达 / ✅ Edge 可达」。若不可达，打开你的科学上网代理（插件会自动走系统代理），回来点 🔊 即可听到晓晓音色。
- **不依赖代理、音质接近豆包**：选「**云端神经语音**」→ 点「**硅基流动 CosyVoice2**」一键预设 → 若你已配过语音识别密钥，直接点「**试听**」；没配过就填一次密钥（TTS 会复用同一个）。

> 💡 云端 TTS 与语音识别共用**同一个密钥**：先配好语音输入，朗读就无需再填。

### 3. 用语音输入说话

打开输入框左侧的 🎤：
- 状态栏若提示「需在设置里配置识别服务」，去 **设置 → 语音 → 语音输入** 选「宿主侧转写」，配好硅基流动地址 + 密钥。
- 点 🎤 开始说话，说完再点一次停止（或 `Esc`），转写文字**自动追加**进输入框。
- 也可点「**麦克风自检**」先确认权限/设备/格式正常。

### 4. 常见问题

| 问题 | 处理 |
|---|---|
| 朗读没声音 | 检查引擎是否可达；微软语音需代理，云端语音需密钥，系统语音永远可用 |
| 段落太长出声慢 | 已优化到约 1 秒内出声；若仍慢请更新插件到 0.4.0 |
| 密钥「已保存」但没生效 | 密钥存宿主端，重启后再试「试听」 |
| 语音输入无转写 | 确认已配置宿主侧识别服务 |

## 安装

```bash
# npm 发布后
dsh plugin add dsh-voice-kit

# 本地开发
dsh plugin --profile desktop add link:/path/to/dsh-voice-kit
```

重启 harness 并刷新 Web GUI。

## 开发

```bash
pnpm install
pnpm typecheck   # tsc --noEmit
pnpm test        # vitest（纯逻辑：markdown 剥离 / 分块 / 并发流式预取）
pnpm build       # tsdown → lib/index.js（宿主）+ lib/client.js（浏览器）
```

构建链路采用生态标准 closure-factory bundle
（`window.__ModuleLoader__.load`），由 `shared/tsdown.client.ts` 驱动
（改编自官方 DeepSeek Harness `packages/client/tsdown.client.ts`，MIT；
`libExternal` 选项来自 dsh-web-ui 全家桶，Apache-2.0，见文件头注明）。

## License

MIT。内置的 `shared/tsdown.client.ts` 改编自官方 DSH 构建工具（MIT）与
dsh-web-ui 的 `libExternal` 选项（Apache-2.0），详见文件头。
