weizhida/dsh-voice-danmaku ↗★ 0
dsh-voice-danmaku
DSH 全局热键语音弹幕:游戏里按 F9 说话,识别结果浮在游戏上方,F10 确认发送到 B 站直播间,全程不切出游戏 适合在游戏等全屏场景下,通过语音快捷发送弹幕的B站主播。
インストール
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:weizhida/dsh-voice-danmakuドキュメント
README 全文を読む ↗配置
有两条路,随便走哪条。
设置界面(推荐)
设置 → 语音弹幕。一页里按组分好了 7 组 —— 按键、媒体键、浮层、录音、识别服务、 发送通道、行为。
改完点「保存」才写入。密钥字段(ASR 密钥)永远显示为空:宿主侧把它标记为 secret,
下发的描述里根本不含实际值,所以界面无法回显已保存的密钥 —— 只能看出"填过"(一串
圆点)还是"没有"。留空 = 不修改,右边另有一个「清除」按钮(走 unset 移除该键,而不是
写入空字符串)。这是有意为之 —— 那个值不该出现在任何能被截图的地方。
弹幕通道不需要任何凭证,所以整个设置页只有一个密钥字段。少一个存登录态的地方, 就少一份泄露风险。
模型下拉框里有哪些模型
设置页「识别服务 → 模型」的候选名单来自配置项 asr.modelOptions:想加模型就进配置
文件加一行,改完立刻生效,不用改代码也不用等插件更新。
候选只是候选:真正决定用哪个模型的是 asr.model,把它填成任何字符串都生效,
哪怕不在候选里(界面上的「自定义…」就是干这个的)。
直接改配置文件
设置界面右上角有「打开配置文件」,也可以直接编辑 ~/.dsh/settings.yaml:
voice-danmaku:
keys:
record: F9
send: F10
cancel: F11
# 普通按键在游戏里没反应时打开这一组(见上文"媒体键")
mediaKeys:
enabled: true
record: AudioVolumeMute # 静音键:按一下开始录,再按一下结束
send: MediaPlayPause # 播放/暂停键
cancel: MediaTrackNext # 下一曲键
channel:
roomId: '你的直播间号' # 留空则任意直播间页面都接受
page:
port: 39217
token: '扩展弹窗里要填同一份口令'
asr:
apiKey: '你的密钥'
改动热加载,不需要重启。
⚠️ 唯一需要保密的是
asr.apiKey—— 它以明文存在这个文件里。设置页对密钥字段只 显示"已设置",不回显内容。
常用字段:
| 设置 | 默认 | 说明 |
|---|---|---|
keys.record | F9 | 开始/停止录音 |
keys.send | F10 | 发送弹幕 |
keys.cancel | F11 | 取消当前识别结果 |
mediaKeys.enabled | false | 是否启用媒体键(默认关:它们是共享资源,不主动去抢) |
mediaKeys.record | AudioVolumeMute | 静音键,按一下开始录音、再按一下结束 |
mediaKeys.send | MediaPlayPause | 播放/暂停键,确认发送 |
mediaKeys.cancel | MediaTrackNext | 下一曲键,取消 |
overlay.anchorXPercent | 50 | 浮层水平位置 |
overlay.marginTop | 0 | 浮层距屏幕上边缘 |
overlay.clickThrough | true | 点击穿透到游戏 |
channel.maxLength | 20 | 弹幕长度上限(20–100),超长自动截断并告知 |
channel.minIntervalMs | 4000 | 两条弹幕之间的最小间隔 |
channel.maxPerHour | 20 | 每小时最多发多少条 |
asr.modelOptions | 三个模型名 | 只是下拉框里的候选,不影响识别;改它立即生效 |
behavior.consumeKeys | true | 普通热键是否对游戏隐藏(媒体键永远不隐藏) |
按键用虚拟键码配置,写名字也行(F9、PageUp、Num0、MediaPlayPause…)。
完整字段与默认值见 src/config.ts(每一行都带人话说明)。
直接改配置文件
设置界面右上角有「打开配置文件」,也可以直接编辑 ~/.dsh/settings.yaml:
voice-danmaku:
keys:
record: F9
send: F10
cancel: F11
# 普通按键在游戏里没反应时打开这一组(见上文"媒体键")
mediaKeys:
enabled: true
record: AudioVolumeMute # 静音键:按一下开始录,再按一下结束
send: MediaPlayPause # 播放/暂停键
cancel: MediaTrackNext # 下一曲键
channel:
roomId: '你的直播间号' # 留空则任意直播间页面都接受
page:
port: 39217
token: '扩展弹窗里要填同一份口令'
asr:
apiKey: '你的密钥'
改动热加载,不需要重启。
⚠️ 唯一需要保密的是
asr.apiKey—— 它以明文存在这个文件里。设置页对密钥字段只 显示"已设置",不回显内容。
常用字段:
| 设置 | 默认 | 说明 |
|---|---|---|
keys.record | F9 | 开始/停止录音 |
keys.send | F10 | 发送弹幕 |
keys.cancel | F11 | 取消当前识别结果 |
mediaKeys.enabled | false | 是否启用媒体键(默认关:它们是共享资源,不主动去抢) |
mediaKeys.record | AudioVolumeMute | 静音键,按一下开始录音、再按一下结束 |
mediaKeys.send | MediaPlayPause | 播放/暂停键,确认发送 |
mediaKeys.cancel | MediaTrackNext | 下一曲键,取消 |
overlay.anchorXPercent | 50 | 浮层水平位置 |
overlay.marginTop | 0 | 浮层距屏幕上边缘 |
overlay.clickThrough | true | 点击穿透到游戏 |
channel.maxLength | 20 | 弹幕长度上限(20–100),超长自动截断并告知 |
channel.minIntervalMs | 4000 | 两条弹幕之间的最小间隔 |
channel.maxPerHour | 20 | 每小时最多发多少条 |
asr.modelOptions | 三个模型名 | 只是下拉框里的候选,不影响识别;改它立即生效 |
behavior.consumeKeys | true | 普通热键是否对游戏隐藏(媒体键永远不隐藏) |
按键用虚拟键码配置,写名字也行(F9、PageUp、Num0、MediaPlayPause…)。
完整字段与默认值见 src/config.ts(每一行都带人话说明)。