前言¶
DSH 的理念是「一切皆插件」。在終端智能體裏,有兩種操作成本常被低估:人離開鍵盤時,想把一句指令變成消息;任務運行時,不想逐字讀大段輸出。dsh-voice 是面向 DSH 的語音 bundle,覆蓋語音轉文字、文字轉語音和離開式朗讀。它默認本地優先,音頻文件落在本機,不自動錄音、不自動播放。
這是什麼¶
Jesse-njx/dsh-voice 由 Jesse-njx 維護,許可證爲 MIT,已覈實版本爲 0.1.0,要求 Node.js >=20。它是 DSH bundle,提供 transcribe、speak、/voice 相關能力,並在 Web 客戶端渲染 voice-note 卡片。
核心功能¶
語音轉文字¶
transcribe 支持兩類來源:
{ file: <path> }:轉寫既有音頻文件。{ record: { seconds? } }:從麥克風錄製後轉寫。
轉寫結果被插入爲用戶消息,Web 客戶端以 voice-note 卡片展示。
文字轉語音¶
speak 接收文本,在後臺任務中合成並播放,並立即返回 { jobId, audioRef }。它適合用於長構建與 headless runs 的 walk-away narration,例如把結果合成成一句狀態播報。
自動朗讀回覆¶
readReplies 與 /voice 提供會話級自動朗讀回覆開關,默認關閉。可以用 /voice 即時切換。
本地優先¶
音頻是 ~/.dsh/voice/ 下的普通文件,會話日誌只保存引用與轉錄。默認值如下:
stt.backend自動離線選擇whisper-local到macostts.backend爲sayreadReplies爲falseaudioDir爲~/.dsh/voice
後端¶
STT 後端支持 whisper-local、openai、macos、fake。
TTS 後端支持 say、piper、edge-tts、fake。
雲端後端僅在顯式配置時可用,不會被自動選擇。
配合 dsh-crosstalk¶
在 dsh-crosstalk installed 時,transcribe({ source, to: <peer> }) 可將 transcribe 結果作爲 peer message 發送到另一本地會話。
安裝與啓用¶
先確認本機滿足 Node.js >=20,然後執行安裝命令:
dsh plugin --profile web add @dsh-voice/bundle
安裝後,transcribe、speak、/voice 由該 bundle 提供。
典型用法¶
使用 /voice¶
下面命令用於查看狀態、切換自動朗讀,或直接朗讀一行文本:
/voice status
/voice on
/voice off
/voice speak build finished, 0 failures
調用 transcribe¶
下面調用分別演示文件轉寫和麥克風錄音轉寫:
transcribe({ source: { file: "/path/to/note.m4a" } })
transcribe({ source: { record: { seconds: 5 } } })
source 二選一:已有音頻文件路徑,或麥克風錄製參數。
調用 speak¶
下面調用演示朗讀一段文本:
speak({ text: "build finished, 0 failures" })
返回 { jobId, audioRef }。
發送到另一本地會話¶
在 dsh-crosstalk installed 時,可以這樣調用:
transcribe({ source: { file: "/path/to/note.m4a" }, to: "<peer>" })
適用場景與注意¶
適合需要在 DSH 會話裏用語音留下指令、希望回覆可朗讀,或在長任務後收到狀態播報的使用者。
注意以下邊界:
- 插件以當前
dsh進程權限運行,安裝前應檢查源碼與許可證。 - 音頻默認不離開本機;只有顯式設置以下雲端後端時,纔可能發送到雲端:
stt.backend: openai
tts.backend: edge-tts
openai後端通過OPENAI_API_KEY憑證讀取。- 錄製與播放只在顯式工具調用時發生;
readReplies默認關閉。 v0.1非目標包括即時流式對話、外呼合成語音、羣組微信上下文音頻、說話人分離、音樂/特效、原始音頻入會話日誌、喚醒詞/持續監聽。
結尾¶
經過上面步驟,dsh-voice 可以把語音輸入變成用戶消息,把回覆變成可播放的本地音頻,並默認保持本地存儲。
GitHub:https://github.com/Jesse-njx/dsh-voice
社區目錄頁:已覈實資料中未提供具體 URL。