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

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

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

小夜