Back to home

jinhuoooo

dsh-voice-input

DSH 语音输入插件:点一下麦克风说话,文字自动进输入框。本地 Whisper 引擎,为打字小白设计。Voice-to-text plugin for DeepSeek Harness.

Stars
0
Language
JavaScript
Created
Aug 17, 2026
Updated
Aug 17, 2026

Introduction

dsh-voice-input

DSH(DeepSeek Harness)语音输入插件:点一下麦克风,说话,文字自己进输入框。

做给谁用的:打字慢、不方便打字、或者单纯懒得敲键盘的人。

我见过不少长辈和刚接触电脑的人,用输入法一个字一个字找拼音,一句话打完要半分钟。语音输入这东西对他们来说不是"效率工具",是"能不能用得起来"的问题。但现成的语音输入方案要么不准(中文稀烂),要么要翻墙,要么把音频传去别人服务器。这个插件就是把这事在本地解决掉。


它能做什么

  • 在 DSH 聊天输入框旁边点麦克风,说话,文字自动填进输入框,全程不碰键盘
  • 中文识别靠谱:本地 Whisper 模型 + 强制简体输出
  • 安静环境下不会"脑补":没说话就是没说话,不会突然给你冒出一段莫名其妙的话
  • 全程本地跑:音频不出本机,不传云端,不要 API Key 也能用
  • 国内网络友好:模型走 ModelScope 下载,不需要翻墙

优点(说点实在的)

  1. 真的简单。整个操作就两步:点麦克风 → 说话 → 再点停止。停止就是"确定",取消就是"不要了",没有第三个选项。界面是一个贴在麦克风按钮下面的小白卡片,不弹大窗口、不挡聊天内容。
  2. 中文准,而且一定是简体。识别完强制转简体(OpenCC),不会给你输出一堆繁体字让你再翻译一遍。默认模型 small,普通话日常口述够用;想要更准就改一行配置换 medium。
  3. 不会乱说话。Whisper 在音频太安静或噪音大的时候有个毛病:自己编一段话输出,比如你在咳嗽,它给你来一句"谢谢大家的关注"。这个插件加了防幻觉参数,静音就返回空、提示"未识别到语音",而不是给你塞一段编的。
  4. 。模型只加载一次(常驻进程),之后每次转写毫秒级。不是每次点完等十秒转圈那种。
  5. 隐私。默认纯本地:录音在你电脑上,转写在你电脑上,只有文字进了 DSH。不想要本地也行,配置里填一个云端 API(Groq 免费)就能切过去,速度更快。
  6. 不折腾网络。模型从 ModelScope 下载,国内直连,装完一次以后不用管。

安装

前置条件

东西要求说明
DSH任意可用版本DeepSeek Harness 桌面端
Python3.10+本地语音识别需要;首次使用会自动装依赖
麦克风正常工作的麦克风笔记本自带 / 外接都行

没有 Python 的话,去 python.org 下一个 3.10+ 装上,安装时勾选 "Add Python to PATH"

方式一:从 GitHub 安装(推荐)

打开终端(Windows 用 PowerShell 或 CMD),执行:

dsh plugin --profile web add github:你的用户名/dsh-voice-input

如果你在 Web 界面模式下使用,把 web 换成你的 profile 名(一般就是 web)。

方式二:手动安装

  1. 把本仓库整个下载解压,文件夹改名 dsh-voice-input
  2. 放到 DSH 插件目录:~/.dsh/profiles/web/plugins/dsh-voice-input
  3. 重启 DSH

首次使用(自动配置)

第一次点麦克风时,插件会自己干活,你什么都不用管:

  1. 自动检查 Python 依赖(faster-whisper、modelscope 等),缺了自动装
  2. 自动从 ModelScope 下载 Whisper 模型(默认 small,约 480MB,取决于网速)
  3. 装完就能用

下载期间界面会提示进度,耐心等一两分钟。之后再点就是秒开了。

使用

点击输入框右侧的麦克风图标,按钮下方会弹出一个小白卡片:

[🎤 音量条]  [00:07]  [■] [✕]
  • 左边是麦克风图标和音量条,说话时它会跟着你声音起伏,能直观确认麦克风在收音
  • 中间是录音时长 分钟:秒
  • 右边两个小圆钮:红色方块 = 停止并出字灰色 × = 取消(丢弃,不留痕)
  • 录满 60 秒会自动停止并转写,不用一直按着

转写完成后文字直接进输入框,你可以改完再发送。取消就真的什么都不要了,不会把一段错误文字塞给你。

配置(可选)

不加配置文件也能用,默认本地 small 模型。想自定义就复制 config.example.jsonconfig.json(放在插件目录下),改完重启 DSH。

切换本地模型

{
  "local": {
    "model": "medium",
    "language": "zh",
    "device": "cpu",
    "computeType": "int8"
  }
}
模型大小中文准确率速度内存
tiny~75MB最快~150MB
base~145MB一般~250MB
small~480MB还行(默认)中等~500MB
medium~1.5GB较慢~1.5GB
large-v3~3GB最好最慢~3GB

模型只下载一次,换模型不用重新下载别的(除了第一次)。内存不够就 small,想更准就 medium。

用云端 API(更快,可选)

本地模型对老电脑可能偏慢,想要更快更准可以接云端,配置 API Key 即可:

  • Groq(免费,Whisper Large v3):去 console.groq.com 注册拿 Key
  • SiliconFlow(SenseVoice,中文优化,有免费额度):去 siliconflow.cn 注册
{
  "api": {
    "provider": "groq",
    "apiKey": "gsk_your_key_here"
  }
}

设计理念

做这个插件的时候,我一直在想一个问题:一个"打字困难"的人,第一次用这个东西,什么样的体验算好?

结论是这几个,也是这个插件的设计取舍:

  1. 能不动手就不动手。 录音的启动/停止就是两次点击,没有多余的确认弹窗、没有设置向导。界面只有一个白色小卡片,贴在麦克风按钮正下方,因为你刚点完按钮,视线就在那里——这比弹一个屏幕中央的大面板更不打扰,也是参考了 Workbuddy 自己的交互习惯。

  2. 结果必须"干净"。 这是踩过坑的:Whisper 对静音和噪声会幻觉出整段编造的文字,繁体字也时有出现。对会用电脑的人来说,乱字可以删;对小白来说,屏幕上出现一段"我没说过的字",第一反应是"我是不是说错了?是不是我电脑坏了?"——这很劝退。所以防幻觉参数和强制简体转换不是锦上添花,是必需品

  3. 本地优先,隐私和免费都不含糊。 语音是敏感数据,默认全本地处理,不依赖任何云服务。国内网络环境下的模型下载(ModelScope)也专门处理过,不至于装个插件先研究怎么翻墙。想要云端的快就自己开,选择权留给用户。

  4. 技术为体验服务,不炫技。 常驻服务(模型只加载一次)、贪心解码、Windows 下麦克风权限的绕行方案(webview 不给权限弹窗,就改用系统级录音)——这些技术细节的唯一目的,是让"点一下、说话、出字"这个动作真的快、真的稳。用户不该感知到它们的存在,它们只负责不让用户等。

常见问题

Q:转写出来一堆问号方块/乱码? A:Windows 下 Python 默认输出 GBK 编码导致。这个插件已经内置了编码修复,如果还遇到,确认你的 Python 是 3.10+ 并重启 DSH。

Q:转写出来不是我说的话? A:这是 Whisper 的幻觉,通常发生在音频太安静或噪音大时。先确认音量条在说话时确实在跳动(说明收音正常),再确认周围环境别太吵。插件已加防幻觉,静音时会提示"未识别到语音"而不是乱出字。

Q:内存占用高? A:默认 small 模型约 500MB,模型常驻是为了转写速度快。介意的话换 tiny/base(省一半以上),或者用云端 API(本地完全不占)。

Q:没声音/麦克风没反应? A:先看音量条动不动。不动就检查系统麦克风权限(设置 → 隐私 → 麦克风),确保 DSH 和 Python 都有权限。

Q:模型下载太慢? A:用的是 ModelScope 国内节点,一般不会太慢。如果网络环境特殊,可以挂代理后重试。

技术栈

  • 录音:Python sounddevice 直录系统麦克风(16kHz 单声道),绕开 webview 麦克风权限限制;实时计算 RMS 音量驱动 UI 动画
  • 转写:faster-whisper(CTranslate2),int8 量化,VAD 过滤,贪心解码
  • 常驻服务server.py 模型加载一次,stdin/stdout JSON 行协议循环处理,空闲 30 分钟自动退出
  • 简体转换:OpenCC t2s
  • 防幻觉:no_speech_threshold / log_prob_threshold / compression_ratio_threshold
  • 云端可选:OpenAI 兼容 API(Groq / SiliconFlow)
  • 降级链:云端 API → 本地常驻服务 → 本地一次性进程 → 可读错误提示

文件结构

dsh-voice-input/
├── package.json          # 插件元数据
├── cordis.patch.yml      # DSH bundle 补丁
├── config.example.json   # 配置模板
├── lib/
│   ├── index.js          # 服务端:HTTP 路由 + ASR 逻辑 + 常驻服务管理
│   ├── client.js         # 客户端:录制面板 UI(音量动画 / 计时 / 停止 / 取消)
│   ├── record.py         # 系统录音 + 实时音量输出
│   ├── server.py         # 常驻转写服务(模型加载一次)
│   └── transcribe.py     # 一次性转写(常驻服务不可用时的回退)
└── README.md

License

MIT