前言¶
做聊天機器人遲早會遇到一個需求:模型回了一段話,能不能直接發成語音條?常見做法是自己搭一套 TTS 服務,再寫腳本對接 IM,維護成本不低。還有一種折衷是直接調雲廠商的 TTS HTTP 接口,逐個請求拼湊。dsh-feiyu-say 這個插件走第三條路:它對接阿里百鍊的 TTS WebSocket 接口,把一句話合成成單聲道 WAV,幾行調用就能拿到本地文件路徑。它不綁定任何 IM,發往 QQ、微信還是隻是留在會話裏,由當前會話的傳輸方式決定。下面介紹它的能力、安裝和配置。
這是什麼¶
dsh-feiyu-say 是 DeepSeek Harness(DSH)的一個插件,維護者是 Vansnc。它給宿主提供「合成語音」這一個能力:收到一句文本,合成 WAV,返回文件路徑和試聽 URL。
它不是本地模型方案。插件本身只依賴 Node 22、ws 和 ffmpeg,沒有 Python,不需要額外部署。ffmpeg 用來把百鍊返回的 mp3 轉成目標採樣率的單聲道 WAV。
核心功能¶
插件暴露三類接口,都在會話裏直接調用。
send_voice:合成一句語音,拿回文件路徑和試聽 URL。發 QQ 語音條時傳sampleRate: 8000。voice_list:查看當前使用的音色、模型和接口。voice_status:檢查 API Key、模型、音色、地址、ffmpeg 是否就緒;傳test: true會額外真合成一句。
還有兩個面向使用者的開關:
- 設置頁試聽:輸入一句點「試聽」,頁面裏
<audio>直接播放,不必等真實發送。 - 語音提示三檔:
off/auto/always,作用是提醒模型「想用聲音就說」。auto表示看氣氛,always表示每輪都提示。
採樣率也可配,默認 24000Hz;走 QQ 語音條時改成 8000。理由是目標端對採樣率有要求,由插件統一轉好格式,比在發送側再處理更省事。
前置條件¶
安裝前先確認三件事。
- Node.js 22 或更高版本。
ffmpeg在 PATH 裏,或者高級配置裏填了正確路徑。- 有阿里百鍊的 API Key,並且有一個開通了 TTS 模型的業務空間。
第三點是這套方案的硬門檻:文本會發到阿里雲,按字符計費。不想把文本傳出本地的,這個插件不合適。
安裝與配置¶
安裝命令來自插件文檔,三種方式按用途選。
從 npm 裝,裝完要重啓 DSH:
dsh-feiyu-say
從 GitHub 源碼裝:
github:Vansnc/dsh-feiyu-say
本地開發用 link: 軟鏈到 profile 的 node_modules:
ln -s /path/to/dsh-feiyu-say ~/.dsh/profiles/desktop/node_modules/dsh-feiyu-say
有一點要記住:宿主不會熱替換已加載的模塊,改完代碼必須重啓 DSH。
裝完之後進「設置 → 魚的聲音」填四項。
| 字段 | 說明 |
|---|---|
百鍊ApiKey |
百鍊控制台 → API-KEY 創建,Key 只顯示一次。也可以改用環境變量 DASHSCOPE_API_KEY |
百鍊模型 |
默認 qwen-audio-3.1-tts-flash,CosyVoice 模型也可以用 |
百鍊音色 |
默認 longanhuan_v3.1,復刻得到的 voice_id 直接填這裏 |
百鍊地址 |
wss://<WorkspaceId>.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference,WorkspaceId 在控制台「業務空間」裏看 |
配置存在 ~/.dsh/feiyu-say-config.json,權限 0600,因爲裏面有 Key。高級選項裏還能改採樣率、超時、音頻目錄、保留條數和 ffmpeg 路徑。
典型用法¶
配置就緒後,調用方式很直接。
先確認環境沒問題:
voice_status
這條會逐項說明 API Key、模型、音色、地址、ffmpeg 哪項沒就緒。想驗證合成鏈路本身是否通,加參數:
voice_status test=true
合成一句語音並拿到路徑和試聽 URL:
send_voice text="今天先到這裏"
發 QQ 語音條時指定採樣率:
send_voice text="今天先到這裏" sampleRate=8000
想看看當前用的是哪套模型和音色:
voice_list
設置頁裏還有「運行自檢」,等價於跑 voice_status,適合不想打命令時用。
百鍊接口流程¶
這個插件調的是百鍊的 WebSocket 接口,理解流程有助於排錯。
run-task(model / voice / format / sample_rate)
→ task-started
→ continue-task(text) + finish-task
→ 二進制音頻幀
→ task-finished
實現見倉庫的 lib/bailian.mjs。返回的音頻是 mp3,插件再用 ffmpeg 轉成目標採樣率的單聲道 WAV 落到本地。
成本與隱私¶
兩點必須知道。
第一,文本會發到阿里雲並按字符計費,具體單價看百鍊對應模型的定價頁,不在插件文檔裏承諾數字。
第二,合成返回的是 24 小時有效的臨時 URL,插件會當場下載,不保存 URL、不依賴這個鏈接做後續分發。另外只使用你有權使用的聲音樣本和音色。
排錯¶
遇到問題按這個順序看。
- 先跑
voice_status或設置頁「運行自檢」,它會逐項告訴你哪一項沒就緒,比猜快。 401:API Key 錯、地域不對,或地址和 Key 不匹配。403/ 模型無權限:模型沒開通,或者業務空間沒授權。task-failed:看返回的error_message,常見原因是音色 ID 不存在、文本爲空、賬戶欠費。ffmpeg失敗:ffmpeg不在 PATH,或者高級配置裏填的路徑不對。- 改完代碼或配置後,重啓 DSH 或刷新設置頁,否則改動不生效。
小結¶
dsh-feiyu-say 解決的是「把一句話變成可發送的語音」這一件事,接口只有三個,配置填四項,沒有本地模型和額外部署。它以當前 DSH 進程的權限運行,安裝前建議先覈對源碼和許可證(MIT)。
目錄頁:https://www.skillhub.cn/plugins/Vansnc/dsh-feiyu-say
GitHub:https://github.com/Vansnc/dsh-feiyu-say