dsh-speech-sherpa
by wuxinzhe
DeepSeek Harness(dsh)本地离线语音插件,基于 Sherpa-ONNX。
安装
dsh plugin --profile web add github:wuxinzhe/dsh-speech-sherpaGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗
安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。
README
DeepSeek Harness(dsh)本地离线语音插件,基于 Sherpa-ONNX。
- 全本地离线,不联网、不收费、CPU 可运行
- STT:Zipformer 中文流式识别(
stt_transcribe) - TTS:VITS 中文多音色(
tts_speak) - WebUI 按住说话:聊天输入框工具行 🎤 按钮——按住录音、松开发送(最长 120 秒,带倒计时)
架构
dsh-speech-sherpa/
├── index.mjs # host 插件(Cordis):注册 3 个工具 + HTTP 路由
├── remote.mjs # HTTP 路由(/speech-api/*,浏览器录音按钮直调)
├── http-body.mjs # HTTP 请求体读取
├── core/ # 平台无关核心(STT/TTS/模型管理/WAV 编解码)
│ ├── index.js # createSpeechService() 门面
│ ├── models.js # 模型管理(状态/下载/断点续传/镜像回退)
│ ├── stt.js # 语音识别(wav 文件 / data URL)
│ ├── tts.js # 语音合成(data URL / wav 文件)
│ └── wav.js # WAV 编解码 + 8kHz→16kHz 重采样
├── client/ # 浏览器端插件(录音按钮)
│ ├── index.ts # 源码(TSX)
│ └── dist/client.js # 构建产物(CJS factory bundle)
├── cordis.bundle.yml # dsh bundle patch(dsh plugin add 安装)
├── cordis.patch.yml # --patch 开发加载示例
└── scripts/
├── build-client.mjs # 构建 client bundle(esbuild)
└── verify-dsh.mjs # 插件契约验证(mock cordis ctx)
安装
dsh plugin --profile <name> add /path/to/dsh-speech-sherpa
# 或从 git:dsh plugin --profile <name> add github:you/dsh-speech-sherpa
开发期用 --patch:
cd <deepseek-harness 仓库>
pnpm dsh --profile web --patch C:\Users\Administrator\Documents\dsh-speech-sherpa\cordis.patch.yml --port 3099
工具
| 工具 | 输入 | 输出 |
|---|---|---|
stt_transcribe |
audioPath(wav 文件)或 audioBase64(data URL) |
{text} |
tts_speak |
text、speed?、sid?、inline? |
{audioPath, text, dataUrl?} |
sherpa_models_download |
kinds?(['stt','tts']) |
{results, modelDir} |
模型自愈:stt_transcribe/tts_speak 发现模型缺失会报错并提示调用 sherpa_models_download,agent 可自行下载。
配置(cordis.yml config 字段)
| 字段 | 默认值 | 说明 |
|---|---|---|
voiceRate |
1.0 |
语速 0.5~2.0 |
sid |
88 |
音色 88/90/92/94 |
modelDir |
$DSH_HOME/models/sherpa |
模型目录(DSH_HOME 默认 ~/.dsh) |
outputDir |
$DSH_HOME/audio/sherpa |
TTS 输出目录 |
WebUI 录音按钮
聊天输入框工具行左侧的 🎤 按钮(conversation.input.left slot):
- 按住开始录音(
getUserMedia+ MediaRecorder),按钮变红显示倒计时120s → ... - 松开自动停止 → 浏览器编码 wav → POST host
/speech-api/sttTranscribe - 转写文本自动填入输入框并发送(
inputActions.setDraft+submit) - 按住超过 120 秒自动停止发送;按住移出按钮也视为松手
重建 client bundle(改源码后):
node scripts/build-client.mjs # 产物 client/dist/client.js
模型
| 模型 | 用途 | 体积 |
|---|---|---|
| streaming-zipformer-zh-int8-2025-06-30 | 中文语音识别 | 126MB |
| vits-icefall-zh-aishell3 | 中文语音合成 | 30MB |
下载后存放于 <modelDir>/stt、<modelDir>/tts。下载走国内镜像(ghfast.top → gh-proxy → GitHub)+ 断点续传。
开发
npm install # sherpa-onnx-node(版本已精确锁定 1.13.4)
node scripts/verify-dsh.mjs # 插件契约验证(14 项)
node scripts/build-client.mjs # 重建 client bundle
音频规格
- STT 输入 wav 支持 16kHz/8kHz(8kHz 自动上采样到 16k;VITS TTS 输出 8kHz,
tts_speak→stt_transcribe闭环可用) - TTS 输出 wav 为 8kHz 16bit PCM 单声道
发布
- 遵循 dsh 插件命名惯例:npm 包名
dsh-前缀(本包dsh-speech-sherpa) - GitHub 仓库加
dsh-plugin话题便于被发现 - 依赖
@deepseek-ai/*时注意:@deepseek-ai/dsh-tools的 npmlatesttag 是过期线,用nexttag;本插件零@deepseek-ai运行时依赖(裸 JSON ToolDefinition)已避开
原始 README: https://github.com/wuxinzhe/dsh-cyberdog-speech-sherpa/blob/main/README.md ↗
同类插件
查看全部 →
dsh
将 DeepSeek Harness 的生命周期状态、错误与审批请求,桥接到本地运行的 OpenPets 桌面伙伴。

dsh-qqbot
让 QQ Bot 接入 DeepSeek Harness(dsh)的官方插件

dsh-open-in-vscode
从 Web GUI 一键在 VS Code 中打开工作区目录。

dsh-notification
回合完成桌面通知,按结果分控 + 关键词过滤。

dsh-notifier
DSH 统一通知推送与远程控制:一个 `notify()` API 打通 25+ 渠道(Telegram / 钉钉 / 飞书 / 企业微信 / QQ 机器人 / WxPusher / PushPlus / Server 酱 / Bark / Discord / Slack / ntfy / webhook 等),timeSensitive / active / passive 分级路由并重试;五通道反向审批(Telegram 按钮 / 飞书卡片 / QQ / WxPusher / 微信 iLink);QQ/钉钉/飞书官方扫码登录;本地 Web 管理台;多 agent 路由;系统桌面通知——以及**手机指挥中心**:在手机上发 `!status` / `!stop` / `!retry` 遥控 agent,通知带可操作按钮(查看结果 / 重试 / 日志,点击回调 agent)。密钥脱敏、工具限流、零运行时依赖。

chatccc
飞书(Lark)或微信(WeChat)聊天控制 DeepSeek Harness / Claude Code / Cursor / Codex / CCC Agent