dsh-sensevoice-npu:在 Intel NPU 上跑 SenseVoiceSmall 的 DSH 语音转文字 Provider

前言

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:..." 安装并重启验证。

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

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

小夜