DeepSeek Harness Hub
← 返回列表

haoku123/dsh-voice

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
⚠ 装前注意

DeepSeek Harness 的全双工语音模式:流式 ASR → LLM → TTS,支持打断。

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/8/23 · 已提供中文文档

Full-duplex voice plugin for DeepSeek Harness: mic → SenseVoice ASR (sherpa-onnx) → LLM → Edge TTS with true barge-in. 全双工语音插件:麦克风语音输入,SenseVoice 本地识别(简体中文+标点+ITN),流式 TTS 朗读,支持语音打断。Zero API key.

综合分
37.8
GitHub 分
37.8
用户评分
★ Stars
4
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add haoku123/dsh-voice
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包@haoku123/dsh-voice(未发布到 npm,仅可源码安装)
Node 引擎未声明 engines.node
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/19 01:11:19

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-web
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-voice

DeepSeek Harness 的全双工语音模式:流式 ASR → LLM → TTS,支持打断。

状态

v0.7.0 — 按住说话,带实时字幕。

对着输入框的麦克风说话:助手会静音(停止播放,丢弃宿主合成队列),正在进行的回合被取消(走停止按钮路径),你的语音由宿主转写(SenseVoice,原生中文简体 ASR,带标点 + ITN)并提交。回复以语音音频流式返回,并带实时字幕。

三种听写方式:

| 手势 | 行为 |
| --- | --- |
| 点击麦克风 | 连续听写;VAD 在尾部静音处切分 |
| 按住发送键(或麦克风) | 录音直到松开,上滑丢弃 |
| 按住 Ctrl(可配置 asr.hotkey) | 同上,无需离开键盘;Esc 丢弃 |

按住期间,浮层会显示实时字幕——即到目前为止所说内容的临时转写——松开后保持转圈,直到权威转写结果返回。

打断检测由麦克风的前导语音边沿触发。ASR 引擎运行一个 NLMS 声学回声消除器(见 src/aec.ts),以页面自身的 TTS 播放作为回声参考,因此在 VAD 之前会从麦克风信号中减去响亮的助手音频——浏览器层面的 echoCancellation 约束仅在没有回声参考时作为回退保留。

实时字幕的临时结果是增量式的:每一轮只发送自上一轮以来录制的音频(通过会话头关联),宿主每个会话解码一个有界的滑动窗口,而不是重新解码整个按住片段。因此预览开销不再随按住时长增长。

演示

dsh-voice 演示

循环流程:按住输入框的发送键(其箭头被麦克风图标覆盖),说话时看着实时字幕填充,松开后转圈直到最终转写返回,然后回复以语音音频逐句流式返回——直到用户的声音打断播放并在句子中途停止正在进行的回合(真正的打断)。Ctrl 也能实现同样效果,无需离开键盘。

工作原理

输入:  麦克风 ──RMS 端点检测──▶ POST /asr(原始 f32 PCM)
│ 文本(SenseVoice)
▼
输入框草稿 ──提交──▶ 模型流 ──llm/stream 旁路──▶ SentenceSegmenter
│
浏览器 ◀── SSE /dsh-voice-api/stream ── TtsQueue(msedge-tts)◀──┘
(base64 MP3 帧 + 字幕文本)

打断:  语音边沿 ──▶ engine.skip() + POST /cancel(epoch 递增)
+ 当回合正在运行时 session.cancel()

- llm/stream 旁路是无损的:每个分块都原样产出,分段器只做观察。模型流永远不会被合成阻塞。
- ASR 在宿主侧运行,使用 sherpa-onnx
(Apache-2.0)运行 SenseVoice —— 原生中文语音模型,在中文上优于 whisper:原生简体输出、标点、逆文本归一化(ITN)以及 50 多种语言自动检测。浏览器仅录制并发送原始小端 f32 PCM。
- 模型文件通过位于 /dsh-voice-api/hf 的缓存穿透代理流式传输,并镜像到磁盘(~/.cache/dsh-voice/models/,可通过 cacheDir 配置),因此首次之后的每次浏览器/识别器加载都从本地磁盘提供。下载中断时会从部分 .part 文件继续。使用 npm run prefetch 预热缓存一次。
- RMS 端点检测:16kHz getUserMedia,2 秒尾部静音截断,最长 30 秒片段,前后填充。零依赖。
- 按键说话完全绕过 VAD。 按住按键本身已是意图,因此按下与松开之间的每个缓冲区都会被保留——在那里以响度作为门控只会丢弃轻声语音,而这与按钮失灵无法区分。仅丢弃低于 250ms 的捕获(误触)。
- 实时字幕:在按住期间,引擎每约 900ms 重新解码缓冲区并显示临时文本。SenseVoice 不是流式模型,因此仅在叠加层实际显示在屏幕上时才请求,并在音频超过 12 秒后停止。临时结果严格只是预览:它们永远不会进入编辑器草稿,且在松开之后到达的临时结果会被丢弃(epoch 检查),因此它永远不会覆盖最终转录文本。
- 打断是三层机制:清除本地播放队列,递增主机 TtsQueue epoch(丢弃排队中和进行中的合成),并在 session.running 为 true 时取消正在运行的回合。被中止的回合永远不会刷新其末尾的半句话——这正是用户打断的内容。
- modelHost 接受任何兼容 HF 的镜像(例如用于中国网络的 https://hf-mirror.com)。

API

| 路由 | 用途 |
|-------|---------|
| GET /dsh-voice-api/stream | SSE;event: audio 帧 {sessionId, seq, text, audio(base64 MP3)} |
| POST /dsh-voice-api/asr | 原始小端 f32 PCM 请求体 → 通过 SenseVoice 返回 {text} |
| POST /dsh-voice-api/cancel | {sessionId} 丢弃排队中和进行中的合成(epoch 递增) |
| GET /dsh-voice-api/config | 麦克风按钮的 ASR 运行时配置 {asr: {...}} |
| GET /dsh-voice-api/hf/ | 缓存穿透 HF 模型代理(镜像到 cacheDir) |
| GET /dsh-voice-api/ | ping:{ok, name, enabled} |

配置(bundle patch 行):

- id: voice
name: '@haoku123/dsh-voice'
config:
voice: zh-CN-XiaoxiaoNeural
cacheDir: ~/.cache/dsh-voice/models   # optional, on-disk model cache
asr:
model: csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17
modelHost: https://huggingface.co   # or https://hf-mirror.com
language: auto                      # auto | zh | en | ja | ko | yue
useItn: true                        # inverse text normalization
autoSend: false
mode: toggle                        # toggle | hold
hotkey: Control                     # 键盘按键说话;'' 禁用

模型文件在首次使用时通过代理获取;在 dsh 主机运行时预热一次缓存:

npm run prefetch          # 默认使用 http://127.0.0.1:3080

安装

dsh plugin --profile web add
dsh --profile web

注意:需要 Node ≥ 22.19 或 ≥ 24(node:zlib zstd API)。

测试

npm test                                # 分段器单元测试(纯测试,无网络)
node test/host.integration.test.mjs     # llm/stream 接入 + 真实 Edge TTS + SSE + /config
node test/bargein.test.mjs              # 客户端注入接口接线(skipPlayback/cancelTurn)
node test/bargein-semantics.test.mjs    # 中止的轮次不刷新 + 取消丢弃进行中的请求
node verify-client.mjs                  # 客户端 bundle 注册/导出/插槽/动态导入

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群