dsh-voice-mode

voicetested: passnpmMIT

Full-duplex voice mode for the DeepSeek Harness Web UI: toggle (2s-pause auto-send) or hold-to-talk dictation into an editable draft with zipformer2 streaming ASR, optional wake word; sentence-by-sentence Edge TTS read-aloud with live captions, and speaking interrupts playback and the running turn (

下载量 / Downloads
8,776
依赖体积 / node_modules
48.67 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-voice-mode

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-voice-mode

![License: MIT](LICENSE)

![Latest Release](https://github.com/qishuilalala/dsh-voice-mode/releases)

![npm version](https://www.npmjs.com/package/dsh-voice-mode)

![CI](https://github.com/qishuilalala/dsh-voice-mode/actions/workflows/ci.yml)

DeepSeek Harness 语音双工对话模式:会话内一键进入 → 边说边出字的流式识别 → 停顿自动发送 → 最终答复按句合成后播放 + 实时字幕,开口即可打断(真 barge-in)。默认语音路径无需额外语音 API Key,识别在宿主端推理;宿主 LLM 的配置与费用另计。

中文 · English

Full-duplex voice mode for DeepSeek Harness — streamed ASR to an editable draft, sentence-by-sentence read-aloud with live captions, and speaking interrupts playback and the running turn.

麦克风按钮即状态面板(PR #16,@dyguests 贡献)

dsh ≥0.1.7 上按钮挂在发送键左侧(conversation.input.activity),更早的版本仍在输入框右侧。状态全部画在按钮上:

  • 聆听:绿色三根竖条,随麦克风音量跳动;朗读中:蓝色五根竖条,随播放音量跳动;按住说话:红色
  • 说完就关(mode: once):发出后关麦、转圈等回复,读完显示对勾并自动退出
  • 检测到说话:右上角橙点;出错:左上角红点(悬停看原因)
  • 点击:平时进入/退出;不在语音模式但正在朗读(readAloud: always)时点一下 = 停止朗读;等待回复或朗读期间单击 = 停止朗读并完全退出。点按钮不会抢走输入框的光标
  • 右键菜单(鼠标右键或键盘菜单键;触屏长按仍是按住说话):交互模式、朗读回复范围、字幕浮层、状态条、自动发送
  • 状态条与字幕默认开启;两项都关掉即上图的「全部收进按钮」形态,此时录音计时显示在按钮下方、提示文字显示在按钮旁
当前状态(2026-10-28):v0.7.34 修复 Kokoro int8/fp32 主模型及固定摘要支持文件下载校验失败;可安装版本以 npm 徽章与 Releases 为准。v0.7.33 不含这项修复。修复使用与既有摘要匹配的上游历史版本,不改模型、音色或缓存目录,请勿关闭摘要校验。

兼容跟进(2026-10-30):最新 dsh 0.2.1-rc.5 的锚点、类型与隔离运行时复核通过;完整证据和未验收层见[兼容契约](../../docs/compat-contract.md)。

CI 通过不代表真实听感、所有硬件或所有宿主版本均已验证。详见 CHANGELOG、兼容证据和后续路线图。包声明范围为 >=0.1.1-rc.2 <0.3.0-0,未测版本不保证。

🤝 Fork 增强(本仓库新增)

本仓库在上游 haoku123/dsh-voice 基础上加入了大量增强,核心如下(完整清单见 git 历史与 docs/rules/STATE.md):

  • 朗读默认 Edge 云端;本地 TTS 可选(隐私优先):本地合成不向独立在线 TTS 服务发送回复文本,宿主 LLM 的网络请求不受此选项控制——
  • 本地 VITS(WASM 运行时,sherpa-onnx-vits-zh-ll,纯中文,5 说话人);
  • 本地 Kokoro(中英混读,103 音色;int8 默认约 109MB / 可选 fp32 约 311MB 的较大模型),经 sherpa-onnx-node 原生 addon 运行(原生运行时,实际资源占用与稳定性需按设备验证);
  • Edge 云端为默认朗读引擎,也可在设置中重新选择(设置 ttsEngine: edge);设置面板「朗读引擎」热切换。
  • Kokoro 音色全量 103 个(F0 实测标定性别),四个常用男声置顶带编号;音色面板用 下拉列表 + ◀▶ 步进切换;
  • 增量传输:partial 只传新增 0.9 秒,长段按住说话松手秒出定稿(不再整段重传重解码);
  • 交互增强:输入框旁模式切换按钮(持续聆听 ⇄ 按住说话,保存到设置);按住说模式下按住才录、不按住不打断;
  • 长段支持:持续聆听连续多段自动拼成一条消息(内部按 30s 分块识别,跨块累积拼接),静音断句默认 1500 毫秒;按住说停顿不断句;
  • 朗读稳定性:打断即终止在途合成释放 CPU;合成不阻塞宿主主线程,句间等待取决于模型与硬件;长朗读不触发空闲下线;
  • 安全加固:会话存在性校验 / 回环+Origin 校验 / 按端点配置限流 / 主要模型与清单内支持文件固定 SHA256(辅助目录仍为清单/存在性检查) / 下载域名白名单 / 重定向守卫。
ℹ️ 顶部 demo-voice-flow.gif 是界面的真实录制示例(语音模式 → 边说边出字 → 停顿自动发送 → 按句朗读 + 实时字幕),由 screenshots/scripts/capture-demo.mjs 驱动真实链路产出;UI 持续演进,以实际界面为准。

✨ 功能

  • 语音模式:输入框工具排麦克风按钮或全局快捷键 Ctrl+Shift+V 进入/退出;光标在输入框里时还可按 Alt+Enter(Mac 为 Option+Enter)切换(不插入换行);全局单活(同一时刻仅一个会话处于语音模式,切换会话自动让出)
  • 三种交互模式(右键麦克风或设置可切换,切换即持久化):
  • toggle(默认)持续聆听:RMS VAD 分段 → zipformer2 流式识别(边说边出字,实时字幕预览)→ 静音约 1500 毫秒断句进草稿,连续多段拼成一条消息,再静音约 1.2 秒(合计约 2.7 秒)自动发送;按住 Ctrl 强制立即发送
  • hold 按住说话:空闲时直接按住麦克风按钮就开始录音、松手即发(不必先点一下进入;短按仍是进入/退出);发出后等回复结束(开朗读则读完)自动退出语音模式;关闭自动发送时松手只把文字留在输入框、不发送并直接退出;按住时没说话约 25 秒后兜底退出;滑出取消、Esc/失焦放弃本段;按住期间停顿不断句(上限 10 分钟);Ctrl 按住即录、松开即发
  • once 说完就关:像 toggle 一样说一段,发出后关麦,等回复朗读完自动退出语音模式(关闭自动发送时:说完这一段即退出,文字留在草稿)
  • 朗读范围(readAloud):voice(默认)只朗读语音模式下的回复;always 当前可见会话的所有回复都朗读(含打字发的;同一会话开多个标签页只在最后看的那个上播);off 从不朗读
  • 唤醒词(可选,默认关):设置 wakeWord 后进入待机态,说出唤醒词才开始识别(如「你好小D」)。可直接与命令连说(「你好小D,帮我查天气」)——唤醒词会在定稿/字幕里自动剥掉、不进消息;匹配带容错(同音字替换「小莫→小墨」、首字错、前置语气词「呃/喂/我说」),建议 3-4 字;待机态状态条实时显示「说『x』开始 · 它听到的转写」,唤醒成败可自查。边界(重要):仅 toggle 模式生效(hold / 手动打断下唤醒词静默失效);说完整一句后回到待机态需重说唤醒词(只喊唤醒词、还没说命令时保持聆听,可停顿想好再说);朗读期说唤醒词不触发(打断由 VAD 开口即触发,与唤醒词无关)
  • 字幕档位:captionFontSize 4 档(0=12px / 1=14px / 2=18px / 3=24px)+ captionMaxWidth 3 档(0=50vw / 1=70vw / 2=90vw),窄屏自适应
  • 让位语义(ADR-0008):backchannelYield 默认开—— 朗读期用户插话「嗯/对」自动让位 1.5s,真要说走硬打断;让 LLM 主动让出话轮(人格层让位);关掉恢复改造前行为
  • 输出链路:只朗读最终答复的 text-delta(reasoning/工具调用不读),按句合成后播放(默认 Edge 云端;可切本地 VITS/Kokoro,中英混读选 Kokoro)+ 右下角实时字幕浮层;工具调用触发提示音;全文照常写入聊天记录;口语化提示词(设置 spokenFormat,默认开)让回复为自然短句、不带 Markdown 排版符号
  • 开口打断(barge-in):服务端 Silero VAD 帧级检测 + 回声门控(echoGateDb)三档灵敏度 → 本地静音 + host 合成队列作废 + 正在运行的回合取消(保留半截并自然续入新消息);朗读中自动切超灵敏档。开启唤醒词后打断仍是开口即打断(打断门控是 VAD,不是唤醒词;打断后回待机态)
  • 模型懒加载与进度:首次使用自动下载识别/合成模型(.part 断点续传),状态条实时显示进度;可用 npm run prefetch 预下载
  • 设置:入口随 dsh 版本而不同(见下方「设置」),可调朗读引擎/音色/语速/打断灵敏度/静音停顿/空闲超时/模型镜像/自动发送/交互模式/唤醒词/口语化提示词/字幕档位/让位语义/让位窗口/打断语音抢救/LLM 纠错;音色可试听(按当前音色+语速即时合成预览,自定义 ShortName 亦可)
  • 界面语言:跟随 dsh 的语言设置(设置 → 通用 → 语言),切换即时生效、无需刷新——设置页、语音状态条、字幕、音色名称/性别/口音、错误提示全部随之变化;LLM 口语化提示词也按界面语言选中/英文版。插件词典注册在 dsh 官方 locale 服务的 voice-mode 命名空间,社区语言包可据此补充其它语言,缺失的语言回落英文。插件名称与描述在「插件」页同样按语言显示。
  • 容错与诊断:麦克风被拒红点提示、模型下载失败可见提示、TTS 连接失败状态条提示(自动退避重试)、提交失败文字留在草稿、SSE 断线自动重连;识别/打断检测通道连续失败、状态同步断连时状态条给出提示(可自愈的瞬时失败不打扰);SenseVoice 定稿超过 2 秒时状态条显示「

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::49,最后更新 2026-11-05

Links

GitHub · Homepage · npm

Same category