前言¶
做聊天机器人迟早会遇到一个需求:模型回了一段话,能不能直接发成语音条?常见做法是自己搭一套 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