dsh-space-ptt:給 DSH 語音輸入加一個對講機鍵

前言

在 DeepSeek Harness(DSH)裏用語音輸入,常規流程是:點一下輸入框、點麥克風、說完、點插入、點發送。步驟多,桌面端打字和說話來回切換時尤其彆扭。dsh-space-ptt 把這套流程壓成一次長按:按住空格說話,鬆手後自動識別併發送。下面介紹這個插件的定位、安裝、配置和實現方式。

插件由 wuyou0423 維護,歸類爲客戶端插件,託管在 GitHub,源碼倉庫自帶一個插件市場索引,也可以直接掛到索引源裏安裝。

這是什麼

一句話定位:給 DSH 的語音輸入加一個 push-to-talk(PTT)鍵,全局接管空格,實現「按住說話 → 鬆手自動發送」。

它不替代官方語音輸入功能,而是疊在官方 Bundle 之上。前置條件是先用官方 Bundle @deepseek-ai/dsh-experimental-voice-input-bundle,並在設置裏把語音模型下載準備好(麥克風按鈕能點開)。插件還依賴官方 UI 的無障礙標籤來定位按鈕,屬於外部契約,宿主大版本升級後需要回歸一次。

核心功能

  1. 全局模式:焦點不在輸入框時按空格,自動聚焦輸入框開始錄音,不用先點輸入框。
  2. 鬆手即發:鬆手後停止識別、插入文字、發送,一氣呵成。
  3. 安全旁路:輸入框有草稿、有彈窗打開、按住不足 250ms、中文輸入法選詞中,插件都不接管,空格照常工作。
  4. 錄音態易退:錄音中按 Esc 取消,切走窗口(Alt+Tab)自動取消,不會卡在錄音態。
  5. 空結果與超時不發送:識別結果爲空不發;超過 30s 未返回結果,轉寫留在草稿裏不發。
  6. 可關閉自動發送:改一個常量就能只把轉寫放進草稿,交由用戶手動發送。

安裝與啓用

從 GitHub 安裝

不需要 npm,直接用官方插件命令加 GitHub 源:

dsh plugin --profile desktop add "github:wuyou0423/dsh-space-ptt"

# 或者指定分支
dsh plugin --profile desktop add "github:wuyou0423/dsh-space-ptt#main"

裝完要重啓 DSH,Host 端是空殼,重啓主要是讓客戶端 bundle 生效。

從 npm 安裝

插件市場靠 npm 收錄,發佈到 npm 後可用:

dsh plugin --profile <你的 profile> add dsh-space-ptt

從本地目錄開發

改代碼時用 link 指向本地倉庫:

dsh plugin --profile desktop add "link:/path/to/dsh-space-ptt"

啓用前置條件

  1. 啓用官方 Bundle 語音輸入:@deepseek-ai/dsh-experimental-voice-input-bundle。
  2. 在設置裏把語音模型「下載並準備」好,確認麥克風按鈕能點開。

不滿足時插件完全不接管空格,空格照常是空格,屬於保守的降級行爲。

典型用法

打開 DSH 窗口,焦點在哪都行,流程如下:

打開 DSH(焦點在哪都行)
  ↓ 按住空格
開始錄音(輸入框自動獲得焦點)
  ↓ 鬆手
停止識別 → 自動插入文字 → 自動發送

不接管的邊界

場景 行爲
焦點不在輸入框,按空格 自動聚焦輸入框,開始錄音(全局模式)
輸入框裏有草稿 不接管,空格照常輸入
有彈窗 / 對話框打開 不接管
按住不到 250ms 就鬆手 當誤觸,取消錄音,不發送
錄音中按 Esc 取消本次錄音
錄音中切走窗口(Alt+Tab) 自動取消
識別結果爲空 不發送
識別超時 30s 不發送,轉寫留在草稿裏
中文輸入法選詞時按空格 不接管(檢測 isComposing)

配置

改 lib/client.js 頂部的常量,然後刷新頁面即可生效,不需要重新打包:

const AUTO_SEND = true;        // false = 只把轉寫放進草稿,不自動發送
const MIN_HOLD_MS = 250;       // 最短按住時長,短於此當誤觸
const STOP_TIMEOUT_MS = 30000; // 等待識別結果的上限
const GLOBAL_SPACE = true;     // false = 恢復成「必須先點進輸入框」
const POLL_MS = 120;           // 輪詢識別狀態的間隔

不喜歡全局空格的,把 GLOBAL_SPACE 設成 false 即可,犧牲一點方便度換取更安全的輸入行爲。

它怎麼實現的

插件不 import 宿主內部模塊,而是通過官方 UI 上的無障礙標籤找到按鈕並點擊。這樣升級宿主時大概率不會碎,官方改文案時只改 SEL_* 常量即可。

目標 aria-label 來源包
開始錄音 / 停止並識別 / 取消 同名 @deepseek-ai/dsh-experimental-client-ui-voice-input
插入文字 插入文字 / Insert text 同上
發送消息 發送消息 / Send message @deepseek-ai/dsh-client-ui-conversation

兩個已踩過的坑

  1. 按住時的鍵盤重複事件。只攔第一個 keydown 不夠,瀏覽器會持續發 repeat 事件,空格會灌進輸入框。一旦草稿被改動,語音插件就不肯自動插入,只能手動點「插入文字」。所以錄音期間必須持續 preventDefault。
  2. 識別完不一定自動插入。語音插件檢測到草稿被改過時,會改成保留結果並讓用戶點「插入文字」。插件會替用戶點這個按鈕兜底。

這兩個坑解釋了爲什麼需要 POLL_MS 輪詢識別狀態,以及爲什麼要知道「插入文字」按鈕的 aria-label。

適用場景與注意

適合「桌面端爲主、語音輸入高頻使用」的 DSH 開發者或重度用戶:想用按住說話的交互、又不想改宿主代碼的人。

注意幾點:

  • 插件只在 Web / 桌面端 Web UI 生效,配置裏聲明 dsh.client.platform: web。
  • 全局空格意味着焦點在空白處按空格會啓動錄音,需要時就把 GLOBAL_SPACE 關掉。
  • 依賴官方 UI 的 aria-label,屬外部契約,宿主大版本升級後要回歸一次「按住說話 → 插入 → 發送」的完整鏈路。
  • 插件以當前 dsh 進程權限運行,安裝前建議先檢查源碼與許可證(倉庫爲 MIT)。
  • 從第三方源安裝插件時,請確認源碼內容與打包產物一致,不要直接在生產環境運行未經審閱的代碼。

版本與運行環境:0.2.0,要求 dsh >=0.2.1-rc.2 <0.3.0、node >=20,License 爲 MIT。

插件市場索引

倉庫自帶一個 DSH 插件市場索引(format 1,git 源),不經過 npm 也能在「插件 → 發現」裏瀏覽安裝:

https://raw.githubusercontent.com/wuyou0423/dsh-space-ptt/main/market/index.json

在 DSH 裏:插件 → 發現 → 添加索引源,粘貼上面的 URL,刷新後即可看到「按住空格說話(對講機)」。索引文件在 market/index.json,格式由 @deepseek-ai/dsh-plugin-market-index 校驗。

小結

dsh-space-ptt 的價值在於把 DSH 語音輸入的入口從一連串點擊變成一次空格長按,同時保留了草稿、彈窗、輸入法等場景下的剋制行爲。代價是引入了一層對官方 UI aria-label 的依賴,升級宿主時要記得迴歸。如果你的日常就是邊打字邊說話,值得裝一個試試。

  • 目錄頁:https://www.skillhub.cn/plugins/wuyou0423/dsh-space-ptt
  • GitHub:https://github.com/wuyou0423/dsh-space-ptt
羽毛球分组比赛记分
小程序二维码

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

小夜