前言¶
DeepSeek Harness(DSH)的语音输入走官方实验包 @deepseek-ai/dsh-experimental-speech-to-text:按钮、设置卡片、准备界面和 speech API 都由同一套服务承载,背后可以挂不同的 recognizer provider。内置的 dsh-experimental-speech-to-text-sensevoice 在 Windows 上实质是 CPU 路径:worker 写死 provider: "cpu",自带的 sherpa-onnx 也是 CPU 版 ONNX Runtime,OpenVINO 执行提供程序不可用;即便强行走 OpenVINO,该模型默认图里 x_length 等动态维度还会导致 NPU 编译崩溃。
若你用的是带 Intel NPU 的 Core Ultra 平台,希望把 SenseVoiceSmall 的重计算挪到 NPU、又不想让语音输入 UI 和 API 改写法,sakuraboy9128-cmd/dsh-sensevoice-npu 是在同一套 voice-input 栈里多注册一个 provider 的做法:前端特征与 sherpa-onnx 对齐,推理经 OpenVINO 跑在 NPU 上。
这是什么¶
dsh-sensevoice-npu(当前包版本 0.2.0,MIT)由维护者 sakuraboy9128-cmd 发布,分类为模型推理。一句话:在 DSH 本地语音转文字流程中,通过 OpenVINO 在 Intel NPU 上运行 SenseVoiceSmall,并接入官方 @deepseek-ai/dsh-experimental-speech-to-text 服务;语音按钮、设置卡片、准备 UI 与 speech API 行为不变,仅替换背后的识别器。
插件不自带模型下载(downloadSources 为空),模型文件需由官方 SenseVoice provider 准备一次,或自行放到约定路径。
与内置 CPU Provider 的差异¶
README 归纳了四条内置路径在 NPU 上走不通的原因,以及本插件的应对方式:
| 内置侧问题 | 本插件做法 |
|---|---|
| recognizer / VAD 硬编码 CPU | 独立 Python worker + OpenVINO,recogniser 默认 device: NPU |
| Windows 无带 OpenVINO 的 ONNX Runtime 包 | 不用 sherpa-onnx 的 OpenVINO EP,直接 OpenVINO 编译服务图 |
| 默认 ONNX 图动态维度导致 NPU 编译崩溃 | 将 x_length 烘焙为某一帧 bucket 的常量后再编译 |
| — | 经小型 loopback HTTP worker 对外提供「一请求一 WAV」识别 |
前端(fbank、LFR、CMVN)与 sherpa-onnx 选项一致,转写结果 intended 与 CPU provider 对齐;重负载 encoder/decoder 在 NPU,fbank 与 Silero VAD 仍在 CPU(VAD 模型小且动态 shape,NPU 不适用)。
代码结构¶
| 路径 | 作用 |
|---|---|
lib/index.js |
Cordis 插件:注册 provider、拉起 worker、执行 preparation |
lib/worker.py |
本机鉴权 loopback HTTP worker(每请求一段 WAV) |
lib/sensevoice_npu.py |
前端特征、Silero VAD、NPU session、CTC 解码 |
runtime/bootstrap.ps1 |
创建 worker 所需的 Python 虚拟环境 |
模型文件(相对 dataRoot)¶
Worker 读取以下三个文件(需事先就位):
| 路径 | 约大小 |
|---|---|
models/sensevoice-onnx/model.int8.onnx |
~228 MB |
models/sensevoice-onnx/tokens.txt |
~0.3 MB |
models/silero/silero_vad.onnx |
~1.7 MB |
默认 dataRoot 为 <DSH home>/speech-to-text/sensevoice。可先让官方 dsh-experimental-speech-to-text-sensevoice provider 下载到同一目录,再安装本插件。
安装与启用¶
环境要求:64 位 Python 3.11–3.13、Intel NPU 驱动;Node 引擎 >=22.13(见 package.json)。以下步骤摘自 README,路径请换成你本机实际位置。
1、构建 Python 环境
pwsh -File runtime/bootstrap.ps1
2、安装到持有 voice-input bundle 的 profile
DSH 桌面应用通常使用 desktop profile:
dsh plugin --profile desktop add "file:C:/path/to/dsh-sensevoice-npu"
本地迭代时,pnpm 会复制包;可用 junction 指回工作目录:
$d = "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-sensevoice-npu"
Remove-Item -Recurse -Force $d
New-Item -ItemType Junction -Path $d -Target C:\path\to\dsh-sensevoice-npu
3、按需覆盖 Cordis 配置
bundle 自带的 cordis.patch.yml 已选择 provider 并注册插件;pythonPath 与 dataRoot 默认指向 bootstrap 虚拟环境与 DSH speech 根目录。仅当虚拟环境或 DSH 主目录非默认时,备份后编辑 ~/.dsh/profiles/desktop/cordis.patch.yml,追加例如:
- id: speech-to-text-npu
name: 'dsh-sensevoice-npu'
config:
pythonPath: <custom venv>\Scripts\python.exe # only with -VenvDir
dataRoot: <custom speech root> # only with a non-default DSH_HOME
4、重启 DSH
语音输入卡片应出现 SenseVoiceSmall · Intel NPU (NPU) 并默认选用;首次 preparation 会对 NPU 图编译一次(约 2.5 分钟),之后启动约 0.2 s。若仍显示 CPU provider,在语音输入设置里显式选择 NPU(显式选择会覆盖 patch 默认项)。
配置项¶
| 键 | 默认值 | 含义 |
|---|---|---|
pythonPath |
%LOCALAPPDATA%\dsh-sensevoice-npu\venv\Scripts\python.exe |
worker 解释器 |
dataRoot |
<DSH home>/speech-to-text/sensevoice |
模型在 <dataRoot>/models |
precision |
int8 |
int8(model.int8.onnx)或 fp32(model.onnx) |
device |
NPU |
recogniser 的 OpenVINO 设备:NPU、GPU、CPU |
vadDevice |
CPU |
Silero VAD 设备 |
useVad |
true |
去静音并按段切分长语音 |
buckets |
插件配置为 [256](完整列表见 README) |
LFR 帧 bucket,引擎可编译的图规格 |
prewarmBuckets |
[256] |
worker 就绪前预编译的 bucket |
idleTimeoutMs |
600000 |
空闲后释放 worker;已编译 blob 仍缓存 |
每个 bucket 首次编译约 2.5 分钟,磁盘约 800 MB(烘焙 IR + OpenVINO NPU cache)。口述场景单 bucket 256 帧(约 15 s 音频)通常足够。
典型用法与实测行为¶
安装并重启后,使用方式与官方语音输入一致:点语音按钮、在设置里选 provider,无需改应用侧 speech API。
README 在 Core Ultra X7 358H、Arc B390、NPU 驱动 32.0.100.5540 上给出的参考数据(非普遍承诺):
| 场景 | 结果 |
|---|---|
| 热启动(已缓存编译结果) | 0.21 s |
| 4.5 s 中文片段 → 256-frame bucket | 转写正确,推理 0.66 s |
| 5.2 s 片段 | 转写正确,0.48 s |
| 14.5 s 片段 | 整句正确,0.65 s |
| 每个 bucket 首次编译 | 100–145 s,之后走缓存 |
说明:对很短的片段,NPU 路径未必比 sherpa-onnx CPU 更快(README 举例约 0.5 s vs ~0.2 s);主要收益是把 encoder/decoder 从重 CPU/GPU 挪到 NPU。
排查时可查看:
Get-Content "$env:USERPROFILE\.dsh\speech-to-text\sensevoice\npu\provider-status.json"
常见问题:NPU device not visible → 更新 Intel NPU 驱动(README 测试 32.0.100.5540);NPU compile failed → 删除 <dataRoot>/npu 重试并预留约 1 GB/bucket 磁盘;新 bucket 首次慢属编译过程。
开发侧可运行 node --test(README 称 6 个测试,覆盖注册契约与配置校验)。
适用场景与注意¶
适合谁: 已在 DSH desktop(或同样挂载 @deepseek-ai/dsh-experimental-speech-to-text 的 profile)上使用 SenseVoice 语音输入;机器带 Intel NPU 且愿意在 Windows 上跑 PowerShell bootstrap 与 OpenVINO NPU 编译;希望 UI 与 API 不变,只换 recognizer。
不适合或需知: 插件以当前 DSH 进程权限运行,安装前请阅读 GitHub 仓库 源码与 MIT 许可证;README 安装与实测以 Windows / PowerShell 为主,未描述其他 OS 的一键路径;不下载模型,需自备或依赖官方 SenseVoice provider 准备文件;社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-sensevoice-npu 把 SenseVoiceSmall 接到 DSH 官方语音输入栈,用 OpenVINO 在 Intel NPU 上跑识别,并针对 NPU 编译限制烘焙帧 bucket。若你的痛点是「内置 SenseVoice 只能 CPU、又想保留原有语音输入体验」,可按 README 准备模型、bootstrap 环境、dsh plugin --profile desktop add "file:..." 安装并重启验证。