dsh-fish-tts:给 DSH Web GUI 接上 Fish Audio 语音朗读

前言

在 DeepSeek Harness(DSH)的 Web GUI 里,助手回复是纯文本,长回复只能逐行看。如果你已经持有 Fish Audio 的 API Key 和自己的音色,缺的只是一层把这些能力接进 Web GUI 的胶水——不用复制文本去别的工具,也不用自己写脚本调 API。下面介绍的 dsh-fish-tts 就做这件事。

这是什么

dsh-fish-tts 是面向 DSH Web GUI 的第三方语音合成(TTS)插件,由 MaRi23333 维护,MIT 许可证,当前版本 0.2.11。它仅支持 Fish Audio API,需自备 Key,插件不分发、不托管任何 Key。已针对 DSH 0.1.2-rc.1 的会话 API 与界面图标变化完成适配和验证,要求 Node >= 22(Node 20 已 EOL)。

接入方式上,client 侧注册了 conversation.chat.assistant-actionsconversation.input.leftsettings.section 三个 slot,分别对应消息操作条、输入框工具行和设置页,朗读按钮、自动朗读开关和设置页因此出现在原生界面的对应位置。

核心功能

逐条朗读

每条定稿的助手消息操作条上有一个「朗读 / Read aloud」按钮,点击合成并播放该条回复:

  1. 播放中再点一次即中断停止,不会从头重播;
  2. 点其他消息的按钮直接切换播放;
  3. 合成等待中再点一次可取消。

合成前会清洗 markdown,路径、URL、长编号和代码块不会被读出来。

自动朗读

输入框工具行有一个「自动朗读」开关(与设置页同步),开启后自动朗读页面加载后产生的新回复。

设置页

入口在 Settings → 语音朗读(Voice (Fish TTS)),可配置:

  • TTS 模型:下拉建议加手动输入,支持 s2.1-pro-free / s2.1-pro / s2-pro 等,默认 s2.1-pro-free;
  • 音色 reference_id:必填。音色是个人数据,插件不提供默认音色;
  • API Key:AES-256-GCM 加密存储;
  • HTTP 代理:直连不通时可填;
  • 试听按钮、音量滑条(默认 60%)、倍速滑条(0.5–2.0×,不变调;浏览器不支持时固定 1×)。

所有设置保存后立即生效,无需重启。朗读和试听都走你配置的语音,可以使用自己的 Fish 音色 reference_id,包括自行克隆的音色。界面为中英双语,跟随 DSH 语言设置。

安装与启用

从 npm 安装(推荐):

npx @deepseek-ai/dsh plugin --profile web add dsh-fish-tts

安装后重启 dsh web(关掉终端重新运行 dsh web)并刷新页面。

也可以从 GitHub 安装,仓库已提交 lib/ 构建产物,git 安装无需本地构建:

npx @deepseek-ai/dsh plugin --profile web add github:MaRi23333/dsh-fish-tts

一个已知的坑:从 GitHub 版换到 npm 源时,裸包名 add dsh-fish-tts 对已装的 git 版是静默空操作,需改用 @latest,或先 removeadd

npx @deepseek-ai/dsh plugin --profile web add dsh-fish-tts@latest

配置与首次使用

经过上面的步骤插件已装好,接下来在设置页完成首次配置:

  1. 打开 Settings → 语音朗读;
  2. 填入 API Key 和音色 reference_id
  3. 点保存设置,API Key 状态变为「已配置」;
  4. 点试听验证——未保存或音色为空时,试听按钮保持置灰。

也可以在 profile 的 cordis.patch.yml 里给 fish-tts 行加 config 作为默认值(会被设置页保存的值覆盖):

- id: fish-tts
  config:
    model: s2.1-pro-free
    format: wav
    stateDir: /custom/state/dir

安全与限制

  • API Key 以 AES-256-GCM 加密落盘于 $DSH_HOME/fish-tts/settings.json,密钥文件 key.bin 自动生成并在 Windows 上收紧 ACL;Key 不出现在任何 GET 响应、日志或仓库中。
  • 仅本机使用:所有 /fish-tts/* 路由拒绝非 loopback(127.0.0.1 / ::1 / ::ffff:127.0.0.1)来源的请求(403),即使宿主监听在 0.0.0.0 也不开放远程访问。
  • 写接口(synthesize/config)强制 application/json 并校验同源/loopback Origin。
  • 代理不支持带用户名密码的地址(保存时被拒绝);环境变量 HTTPS_PROXY/HTTP_PROXY 带凭据会被忽略。
  • 合成请求文本上限 12000 字符;结果在进程内缓存,最多 200 条,重启即清。

适用场景与注意

适合谁:已持有 Fish Audio 账号和 Key、想用自己的音色(含自行克隆的音色)在 DSH Web GUI 里听回复的用户。

使用前注意几点:

  • 只可使用你有权使用的音色(reference_id),未经授权不得克隆或模仿公众人物、名人或他人的声音;对外分发生成的音频时,建议主动披露其为 AI 合成内容;
  • Fish Audio 免费额度仅限个人、非商业用途,商业使用需订阅官方付费套餐;
  • 本项目为独立社区项目,与 Fish Audio / Hanabi AI Inc. 无隶属、合作或背书关系,与 DeepSeek 也无隶属关系;
  • 插件以当前 dsh 进程权限运行,安装前建议先检查源码与许可证。

结尾

回顾一下:dsh-fish-tts 把 Fish Audio 的合成能力接进 DSH Web GUI——消息旁一键朗读、输入栏自动朗读、设置页统一管理模型、音色和加密 Key,配置保存即生效。仓库与目录页:

  • GitHub:https://github.com/MaRi23333/dsh-fish-tts
  • 社区插件目录页:https://www.skillhub.cn/plugins/MaRi23333/dsh-fish-tts
羽毛球分组比赛记分
小程序二维码

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

Xiaoye