dsh-feiyu-say:給 DSH 加一個「合成語音」的工具

前言

做聊天機器人遲早會遇到一個需求:模型回了一段話,能不能直接發成語音條?常見做法是自己搭一套 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。

核心功能

插件暴露三類接口,都在會話裏直接調用。

  1. send_voice:合成一句語音,拿回文件路徑和試聽 URL。發 QQ 語音條時傳 sampleRate: 8000。
  2. voice_list:查看當前使用的音色、模型和接口。
  3. voice_status:檢查 API Key、模型、音色、地址、ffmpeg 是否就緒;傳 test: true 會額外真合成一句。

還有兩個面向使用者的開關:

  • 設置頁試聽:輸入一句點「試聽」,頁面裏 <audio> 直接播放,不必等真實發送。
  • 語音提示三檔:off / auto / always,作用是提醒模型「想用聲音就說」。auto 表示看氣氛,always 表示每輪都提示。

採樣率也可配,默認 24000Hz;走 QQ 語音條時改成 8000。理由是目標端對採樣率有要求,由插件統一轉好格式,比在發送側再處理更省事。

前置條件

安裝前先確認三件事。

  1. Node.js 22 或更高版本。
  2. ffmpeg 在 PATH 裏,或者高級配置裏填了正確路徑。
  3. 有阿里百鍊的 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

羽毛球分组比赛记分
小程序二维码

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

小夜