dsh-koein
Wake-word voice input for DeepSeek Harness: an always-on, low-power keyword spotter wakes the agent, then local ASR turns what you say next into a submitted message. No API key, no cloud, no typing.
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Miyamiz39/dsh-koein说明文档
阅读完整 README ↗然后配置 modelDir: D:/models
### 2. 装进 profile
```bash
dsh plugin --profile web add
dsh plugin add 会自动把包加进该 profile 的 dsh.profile.bundles,并套用它自带的 cordis.patch.yml。
3. 重启
dsh web
插件是 bundle 行,必须重启才生效。
装好后:发送按钮左边会出现一个麦克风图标,它就是全部的语音控制。
一个按钮,两种说话方式
| 手势 | 作用 |
|---|---|
| 单击 | 开/关「直接说话」——不用唤醒词,点开就直接说 |
| 右键单击 | 开/关「唤醒词监听」——说唤醒词即可开口 |
颜色就是状态,不需要额外的指示条:
| 颜色 | 含义 |
|---|---|
| 灰 | 停止 |
| 绿 | 现在说话就会进输入框(左键单击直接听写,或唤醒词已命中) |
| 蓝 | 正在等唤醒词(右键单击后) |
| 红 | 出错,鼠标悬停看原因 |
识别中时绿色会轻微呼吸,表示确实听到了。连续说几句会追加到输入框(中文之间不加空格,英文自动加),不会覆盖你已经写好的内容。
两种模式共用一条音频流,所以听写开着时唤醒词监听自动让位。识别出来的文字默认只填进输入框,不直接发送——你看一眼再按回车。想让它说完就发,把 autoSend 改成 true。
"设置 → 语音唤醒"里能看到模型状态和当前生效的唤醒词。
配置
在 $DSH_HOME/profiles/web/cordis.patch.yml 里覆盖(patch 是 whole-replace 语义,要写全字段):
- id: koein
config:
wakeWords:
- 你好小鲸
- 小鲸小鲸
autoSend: false
injectMode: composer
| 字段 | 默认 | 说明 |
|---|---|---|
wakeWords | ['你好小鲸','小鲸小鲸'] | 唤醒词,可任意中文短语 |
keywordsFile | '' | 已有的 sherpa-onnx keywords.txt;非空则忽略 wakeWords |
keywordsScore | 1.0 | 关键词增强分数,漏检多就调大 |
keywordsThreshold | 0.25 | 触发阈值,误唤醒多就调大 |
numTrailingBlanks | 1 | 关键词后空白帧数,唤醒词含重叠 token 时调大(如 8) |
modelDir | $DSH_HOME/koein-models | 模型根目录 |
numThreads | 2 | 两个引擎各自的推理线程数 |
autoSend | false | 识别完直接发送;默认 false 只填进输入框,由你确认后发送 |
injectMode | composer | composer = 走输入框正常提交;agent = 宿主直接以用户消息注入会话(后台标签页也能用) |
silenceMs | 800 | 说完静音多久判定句子结束 |
onsetTimeoutMs | 4000 | 唤醒后等开口的最长时间 |
maxUtteranceMs | 20000 | 单句最长时长 |
minUtteranceMs | 300 | 更短的语音丢弃(多半是噪声) |
energyThreshold | 0.012 | 语音起始能量阈值(RMS),环境噪声大就调大 |
stayAwakeMs | 0 | 一句话结束后继续聆听的时长,便于连续追问;0 = 每次都要说唤醒词 |
调唤醒词
唤醒词质量取决于你的声音、麦克风和房间——这是唯一无法用官方测试音频验证的东西。录一段自己念唤醒词的 16kHz 单声道 WAV,然后:
node tools/probe-wake-word.mjs "你好小鲸" 我的录音.wav
## 配置
在 `$DSH_HOME/profiles/web/cordis.patch.yml` 里覆盖(patch 是 **whole-replace** 语义,要写全字段):
```yaml
- id: koein
config:
wakeWords:
- 你好小鲸
- 小鲸小鲸
autoSend: false
injectMode: composer
| 字段 | 默认 | 说明 |
|---|---|---|
wakeWords | ['你好小鲸','小鲸小鲸'] | 唤醒词,可任意中文短语 |
keywordsFile | '' | 已有的 sherpa-onnx keywords.txt;非空则忽略 wakeWords |
keywordsScore | 1.0 | 关键词增强分数,漏检多就调大 |
keywordsThreshold | 0.25 | 触发阈值,误唤醒多就调大 |
numTrailingBlanks | 1 | 关键词后空白帧数,唤醒词含重叠 token 时调大(如 8) |
modelDir | $DSH_HOME/koein-models | 模型根目录 |
numThreads | 2 | 两个引擎各自的推理线程数 |
autoSend | false | 识别完直接发送;默认 false 只填进输入框,由你确认后发送 |
injectMode | composer | composer = 走输入框正常提交;agent = 宿主直接以用户消息注入会话(后台标签页也能用) |
silenceMs | 800 | 说完静音多久判定句子结束 |
onsetTimeoutMs | 4000 | 唤醒后等开口的最长时间 |
maxUtteranceMs | 20000 | 单句最长时长 |
minUtteranceMs | 300 | 更短的语音丢弃(多半是噪声) |
energyThreshold | 0.012 | 语音起始能量阈值(RMS),环境噪声大就调大 |
stayAwakeMs | 0 | 一句话结束后继续聆听的时长,便于连续追问;0 = 每次都要说唤醒词 |