weizhida/dsh-voice-danmaku ↗★ 0

dsh-voice-danmaku

DSH 全局热键语音弹幕:游戏里按 F9 说话,识别结果浮在游戏上方,F10 确认发送到 B 站直播间,全程不切出游戏 适合在游戏等全屏场景下,通过语音快捷发送弹幕的B站主播。

パッケージ
dsh-voice-danmaku
互換性
未検証
バージョン
0.1.0
ライセンス
MIT
最終更新
2026/09/29

インストール

$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.recordF9开始/停止录音
keys.sendF10发送弹幕
keys.cancelF11取消当前识别结果
mediaKeys.enabledfalse是否启用媒体键(默认关:它们是共享资源,不主动去抢)
mediaKeys.recordAudioVolumeMute静音键,按一下开始录音、再按一下结束
mediaKeys.sendMediaPlayPause播放/暂停键,确认发送
mediaKeys.cancelMediaTrackNext下一曲键,取消
overlay.anchorXPercent50浮层水平位置
overlay.marginTop0浮层距屏幕上边缘
overlay.clickThroughtrue点击穿透到游戏
channel.maxLength20弹幕长度上限(20–100),超长自动截断并告知
channel.minIntervalMs4000两条弹幕之间的最小间隔
channel.maxPerHour20每小时最多发多少条
asr.modelOptions三个模型名只是下拉框里的候选,不影响识别;改它立即生效
behavior.consumeKeystrue普通热键是否对游戏隐藏(媒体键永远不隐藏)

按键用虚拟键码配置,写名字也行(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.recordF9开始/停止录音
keys.sendF10发送弹幕
keys.cancelF11取消当前识别结果
mediaKeys.enabledfalse是否启用媒体键(默认关:它们是共享资源,不主动去抢)
mediaKeys.recordAudioVolumeMute静音键,按一下开始录音、再按一下结束
mediaKeys.sendMediaPlayPause播放/暂停键,确认发送
mediaKeys.cancelMediaTrackNext下一曲键,取消
overlay.anchorXPercent50浮层水平位置
overlay.marginTop0浮层距屏幕上边缘
overlay.clickThroughtrue点击穿透到游戏
channel.maxLength20弹幕长度上限(20–100),超长自动截断并告知
channel.minIntervalMs4000两条弹幕之间的最小间隔
channel.maxPerHour20每小时最多发多少条
asr.modelOptions三个模型名只是下拉框里的候选,不影响识别;改它立即生效
behavior.consumeKeystrue普通热键是否对游戏隐藏(媒体键永远不隐藏)

按键用虚拟键码配置,写名字也行(F9、PageUp、Num0、MediaPlayPause…)。

完整字段与默认值见 src/config.ts(每一行都带人话说明)。