dsh-voice-ru:为 DSH 语音输入提供本地俄语 ASR

前言

DeepSeek Harness(DSH)桌面端支持语音输入,内置 SenseVoice 可在本地转写,但对俄语支持不足。若你在 DSH 里用俄语口述需求、注释或混合俄英技术术语,内置路径往往识别不准或无法使用。社区插件 dsh-voice-ru(维护者 ripls56)在 голосовой ввод 侧增加第二个本地 STT 提供商,引擎为 NVIDIA Nemotron 3.5 ASR Streaming 0.6B(GGUF),通过 transcribe.cpp 原生运行时推理;模型与运行时不在仓库内,首次使用时下载并以 sha256 校验。分类上属于 模型推理。DSH 生态强调「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-voice-ru 是 DSH 的本地语音转文字插件:注册 id 为 nemotron-local 的提供商(默认 providerId),接收 voice-input 客户端送来的 16 kHz 单声道 PCM16 WAV,在本地完成转写。除俄语外,README 英文说明还支持另外 28 种语言区域;仓库本身只保留三个用于测试的合成 WAV,不含模型权重与原生库二进制。

环境与磁盘

  1. DSH 桌面版已开启语音输入;平台支持 Windows x64、Linux x64/arm64、macOS arm64/x64。
  2. 约 1 GB 空闲磁盘(模型约 751 MB + 运行时约 2–21 MB + 缓存)。
  3. 首次 准备阶段需要联网:运行时从 GitHub release 拉取,模型从 Hugging Face 拉取;之后可离线使用。

Node 依赖 koffi(^2.16.3);插件要求 Node >=20,peer 依赖 @deepseek-ai/cordis ^4.0.1。当前 package 版本 0.2.2,许可证 MIT。

安装与启用

下面介绍三种 README 记载的安装方式;插件在 当前 DSH 进程权限 下运行,安装前请自行查看 GitHub 源码 与许可证。

方式一:DSH 配置文件命令

在目标 profile 下执行(命令来自官方 README,<профиль> 替换为你的 profile 名):

dsh plugin --profile <профиль> add github:ripls56/dsh-voice-ru

若首次出现 ERR_PNPM_IGNORED_BUILDS: koffi@2.16.3,DSH 会在 <профиль>/pnpm-workspace.yaml 写入 allowBuilds 占位;将 koffi: false 后重试。README 说明 koffi 自带预编译二进制,无需跑构建脚本,在该环境下也不应设为 true(cnoke 构建会失败)。

dsh plugin add 只装依赖,不会自动写入 bundles。需在 <профиль>/package.json 的 dsh.profile.bundles 中加入 dsh-voice-ru,例如:

"dsh": { "profile": { "bundles": ["...", "dsh-voice-ru"] } }

重启 DSH。不启动应用时可检查:dsh <профиль> --dump-config | findstr voice-ru,应出现 - id: voice-ru。

方式二:GUI

Settings → Plugins → 安装 bundle,规格 github:ripls56/dsh-voice-ru。若询问 koffi 的 build 脚本,可不授权。安装后重启 DSH。

在插件目录 npm install 后,于 profile 的 package.json 增加 dependencies 的 link: 路径及 bundles 中的 dsh-voice-ru,重启 DSH。插件自带 cordis.patch.yml,无需手改 - id: voice-ru。

选用提供商

经过上面的步骤后,在 Settings → Voice input 选择提供商 Nemotron 3.5 ASR 0.6B (Q8_0 GGUF),语言建议 Авто(Auto)。

首次准备与缓存

在 Settings → Voice input 点准备,或第一次录音触发 prepare() 时,插件会下载并校验:

内容 来源 大小
transcribe.cpp v0.3.1(按平台) GitHub release 1.8–21 MB
nemotron-3.5-asr-streaming-0.6b-Q8_0.gguf Hugging Face 751 MB

缓存目录:Windows 为 %LOCALAPPDATA%\dsh-voice-ru,Linux 等为 ~/.local/share/dsh-voice-ru(可通过配置 dataRoot 覆盖)。部分下载的文件在校验通过前不会进入缓存;网络中断不会污染已验证文件。进度在 Voice input 设置页可见。README 说明无断点续传:751 MB 下载中断会重新开始,未校验的临时文件会被清理。

语言模式:俄语、英语与混说

  • Авто:模型自动判语种;俄语正常识别,句中英词倾向保留拉丁字母。README 默认推荐此项。
  • ru:强制俄语提示,纯俄语略稳,但英文词可能被写成西里尔字母。

README 在合成语音上对比了混说 tech 术语:auto 更易保留 main branch、Pull Request、git push 等拉丁写法;ru 模式下部分术语会西里尔化。模型不支持 VOCABULARY / CONTEXT_PROMPT,无法通过词表提示专有名词;连读的 config.json 等在 auto 下仍可能变成西里尔近似读法。

工作原理与性能

数据路径(README 示意):

voice-input 客户端 (WAV 16 kHz mono PCM16)
        │  speech/transcribe
        ▼
speechToText (DSH)  →  nemotron-local(本插件)
                              │  subprocess + bearer token
                              ▼
                     lib/worker.js: koffi → transcribe_run → 文本

主要模块:lib/index.js(注册、prepare、下载、队列、空闲 5 分钟卸载 worker)、lib/runtime.js(平台 runtime URL/sha256、解压 .tar.gz)、lib/download.js(原子下载与校验)、lib/worker.js(FFI + HTTP /transcribe?language=…)、lib/locales.js(如 ru → ru-RU)。

README 给出的参考速度(RTX 3060 Vulkan):约 8.6 s 音频 ~0.5 s(RTF 约 15–18×);纯 CPU 约 1.3 s(RTF 约 6×)。模型在多次录音之间常驻内存,直到 idleTimeoutMs(默认 300000 ms)触发卸载。

可选配置

在插件配置项中(均可省略):

键 默认 含义
providerId nemotron-local DSH 内提供商 id
dataRoot 见上文系统路径 运行时与模型缓存根目录
runtimeDir — 使用已有 transcribe.cpp 目录,跳过下载
modelPath — 使用已有 GGUF 文件
backend auto auto / cpu / vulkan / cuda / cpu_accel
threads 0 CPU 线程(0 由库决定)
idleTimeoutMs 300000 空闲后卸载 worker
inferenceTimeoutMs 120000 单次转写超时

适用场景与限制

适合:需要在 DSH 里本地、离线(首次准备后)转写俄语或俄英混说,且可接受约 751 MB 模型与首次下载的开发者。

注意:

  1. 单次录音上限跟随 DSH voice-input(120 s)。
  2. 插件代码 MIT;模型 OpenMDW-1.1(nvidia/nemotron-3.5-asr-streaming-0.6b);GGUF 与 transcribe.cpp 来源见 README「Лицензии и источники」。
  3. 仓库提供 npm run test / test:fresh / test:lang 等脚本,供维护者验证 provider、下载链路与语言行为;普通用户按 GUI 准备即可。

链接

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜