linj1k/dsh-whisper-local:在 DSH 里跑本地 Whisper 语音输入

前言

DeepSeek Harness 的 Web GUI 自带语音输入能力,但默认链路意味着音频要经过远端语音服务。要从录音到文字都不出本机,就得自己找本地识别方案并接进语音管线——先找模型、再找命令行工具、再把输出塞回 Harness,中间每一步都要自己搭。下面介绍的 linj1k/dsh-whisper-local(分类:模型推理,维护者 Linj1k)把这个流程做成一个插件:浏览器录下 16 kHz 单声道 WAV,Host 端用 whisper.cpp 转写,音频不经过网络,也不需要 OpenAI 账号或 API Key。

需要说明的是,这是一个社区 bundle,不是 DeepSeek 官方插件。项目目录页放在 skillhub.cn,那是第三方社区站点,与 DeepSeek 没有官方从属关系。

这是什么

一句话定位:给 DSH 的 Web GUI 提供一个 host-local 语音提供者(SpeechProvider),底层是 whisper.cpp 的 Windows x64 CPU 版本。浏览器只负责录音并把音频送到 Host,Host 上负责落盘、调 whisper-cli.exe、读取文本、清理临时文件。

它解决的三个具体问题:

  1. 零外部依赖的识别链路——不需要注册外部语音服务、不需要 API Key。
  2. 运行时和模型的托管——whisper.cpp 运行时和 GGML 模型按需下载,带大小和 SHA-256 校验,下载后缓存并可离线复用。
  3. 模型切换有入口——Harness UI 里有模型下拉框,改完立即生效并持久化。

核心功能

下面按 README 列出的能力逐条说明,全部为本地执行:

  • 完全本地听写:whisper-cli.exe 跑在 CPU 上,模型和音频都留在本机。
  • 默认自动语种检测:language: auto 让 Whisper 自行判断每条录音的语种;99 种 Whisper 语种也可以在语音设置里手动指定。
  • UI 内选模型:插件页可选 tiny、base、small、medium、large-v3-turbo,改动即时生效并保存。
  • 托管式安装:Windows x64 whisper.cpp 运行时和 GGML 模型按需下载、校验(大小 + SHA-256)、缓存,之后可离线使用。
  • 不留存录音:每条录音写成临时 WAV,转写完即删除。
  • Agent 集成:助手可通过 whisper_model 工具列出模型、后台下载、或切换当前模型。

工作流程如下:

浏览器(Harness composer)
  └─ 麦克风按钮录制 16 kHz 单声道 PCM WAV
       └─ speech Remote 把录音发送到 Host
            └─ whisper-local SpeechProvider
                 ├─ 写临时 WAV
                 ├─ 用选中的 GGML 模型启动 whisper-cli.exe
                 ├─ 读取文本输出
                 └─ 删除临时文件并返回转写结果

Provider 通过 ctx.speechToText.register() 注册,并声明 location: 'host-local'。这样语音 UI 能显示准备状态,也能在需要时触发模型下载。

安装与启用

环境要求

项 说明
DeepSeek Harness 桌面版/Web 版,且启用实验性的 Voice Input bundle
系统 Windows 10/11 x64(固定运行时是 Windows CPU 构建)
运行时依赖 tar.exe(Windows 10/11 自带,用于解压运行时归档)
磁盘 解压后的运行时约 90 MB,每个模型 31–547 MB
CPU 任意 x64 CPU,核数和线程越多越快。不使用 GPU
麦克风 需要操作系统和浏览器的麦克风授权

运行时不需要 Node.js、Python、编译器或 CUDA。

从 GitHub 安装(推荐)

  1. 先启用官方 Voice Input bundle:Plugins → Voice Input。
  2. 打开 Plugins → Add plugin → Install a third-party plugin。
  3. 输入仓库 Git 地址:
   git+https://github.com/Linj1k/dsh-whisper-local.git

要固定版本可用:

   git+https://github.com/Linj1k/dsh-whisper-local.git#v1.3.0
  1. 确认 bundle 已启用。它的 patch 会把语音模块设为 whisper-local + language: auto,并注册 whisper_model 工具。
  2. 如果 Host 模块是在 Harness 运行期间加入的,Provider 没出现,就重启一次 Harness。只改浏览器端的 UI 是热重载的,不需要重启。

其他安装方式

  • 发布包:从 GitHub Releases 下载 dsh-whisper-local-1.3.0.tgz,在 Plugins → Add plugin 里指向该文件。
  • npm:包名 dsh-whisper-local,待维护者执行 npm publish 后即可通过 Plugins → Add plugin 填包名安装(可加版本,如 dsh-whisper-local@1.3.0)。
  • 本地检出:在 Plugins → Add plugin 里填本目录绝对路径,适合开发调试。

典型用法

听写

  1. 点 composer 里的麦克风按钮(在模型选择器和 Send 之间)。
  2. 首次使用会要求授权麦克风。
  3. 说话,然后按 Stop。
  4. 转写结果会插入草稿,按正常流程检查并发送。

选模型

打开 Plugins → Whisper local,页面提供模型下拉框(带体积与速度/精度提示)、当前生效的模型、以及 Save model 按钮。选择会通过 Harness Settings 服务写入 profile 配置,重启后依然生效。如果所选模型尚未下载,准备流程会自动开始,进度显示在 Voice Input bundle 详情里的 Download and prepare 区域。

选语种

Whisper local 提供 99 种语种加 auto。在 Plugins → Voice Input → bundle details → Language 里改。官方选择器对 auto、en、zh、ja、ko 显示翻译后的标签,其他语种显示 ISO 代码(如 fr、de、es)。

默认值是 auto,不会强制法语或任何固定语种。混合用语场景适合自动检测;录音短或噪音大时,显式指定语种更稳。

模型清单

模型均来自 ggerganov/whisper.cpp 托管的多语种 GGML 构建:

Key 文件 体积 说明
tiny-q5_1 ggml-tiny-q5_1.bin ~31 MB 最快,精度最低
base-q5_1 ggml-base-q5_1.bin ~57 MB 快,基础精度
small-q5_1 ggml-small-q5_1.bin ~181 MB 默认,均衡
medium-q5_0 ggml-medium-q5_0.bin ~514 MB 更准,更慢
large-v3-turbo-q5_0 ggml-large-v3-turbo-q5_0.bin ~547 MB 多语种精度最好

官方给出的参考(AMD Ryzen 9 9950X3D,8 线程,约 10 秒语音):small-q5_1 处理法语约 1.3 s、日语约 1.2 s;large-v3-turbo-q5_0 法语约 3.3 s、日语约 4.0 s。

固定运行时是官方 nightly b5454 Windows x64 OpenBLAS 构建,校验值为其 release SHA-256。

配置项

bundle patch(cordis.patch.yml)给出的默认配置:

- insert:
    - id: whisper-local
      name: 'dsh-whisper-local'
      config:
        dataRoot: !!js dshHomePath('speech-to-text', 'whisper-local')
        model: small-q5_1
        threads: 8
        timeoutMs: 180000

- id: speech-to-text
  config:
    defaultProvider: whisper-local
    language: auto
字段 默认 含义
dataRoot %USERPROFILE%\.dsh\speech-to-text\whisper-local 运行时、模型和诊断信息的托管目录
model small-q5_1 上表中的模型 Key 之一,也可从 UI 修改
threads 8 传给 whisper-cli 的 CPU 线程数
timeoutMs 180000 单次转写时限
modelPath 未设置 使用已有的 GGML 模型文件,跳过托管下载
whisperCli 未设置 使用已有的 whisper-cli.exe,跳过托管运行时

用户覆盖写在 profile 的 patch 层,优先级高于 bundle 默认值;UI 里选中的模型也写在那里。

Agent 工具

bundle 注册了 whisper_model 工具,助手可以执行三类操作:列出模型目录、后台下载模型、切换当前模型。适合让 Agent 在用户一句「换成 small」时自行完成切换。

适用场景与注意事项

适合这些情况:

  • 录音内容涉及隐私或不宜出网,需要在本地完成转写。
  • 环境里没有可用的外部语音 API Key,或不想为听写单独申请账号。
  • 已经有一台 x64 Windows 机器,想用 CPU 换来一条约 10 秒的语音秒级出稿。

需要注意:

  1. 权限范围。插件以当前 DSH 进程的权限运行,下载运行时和模型、执行 whisper-cli.exe、读写 dataRoot 目录都发生在该进程权限下。安装前应该先读一遍源码和许可证(MIT),确认目录路径和命令执行范围符合预期,不要只看目录页描述就装。
  2. 平台与机型限制。只支持 Windows 10/11 x64,只用 CPU,不使用 GPU。在 macOS / Linux 或 ARM 机器上不适用。
  3. 磁盘与首次下载。运行时约 90 MB,模型 31–547 MB,首次启用(尤其选 medium 以上)会有一段下载时间。运行时和模型带大小与 SHA-256 校验,尽量保持默认配置,不要手工替换。
  4. 默认语种是 auto。如果使用场景语种固定、录音又短或噪声大,建议显式指定语种,避免自动检测出错。
  5. 音频不落盘。只在临时 WAV 上转写,转写后删除——这条仅指插件自身的行为,具体效果取决于你在 Harness 之外还有没有其他录音链路。
  6. 社区项目。这是第三方 bundle,非 DeepSeek 官方插件;star 数与版本信息以 GitHub 当前状态为准,升级前核对版本号。

结尾

这个插件的价值在于把「浏览器录音 + 本机转写」这条链路收敛成一个可以安装的 bundle:不用配外部服务、不用管运行时怎么装,模型选择和语种选择都在 UI 里完成,并且音频不出本机。如果本地听写已经是日常操作,值得一试;如果只是偶尔录音,先估算一下模型下载的体积成本。

目录页:https://www.skillhub.cn/plugins/Linj1k/dsh-whisper-local
GitHub:https://github.com/Linj1k/dsh-whisper-local

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

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

小夜