- Início
- Plugins
- Visão, voz e multimodal
- dsha-tts-bridge
dsha-tts-bridge
flyinghouse-ma/dsha-tts-bridge
Host-side TTS bridge for dsh that synthesizes speech over the Edge TTS protocol and serves MP3 on a same-origin route, for containers with no audio device.
Instalar
dsh plugin --profile web add github:flyinghouse-ma/dsha-tts-bridgeREADME
dsha-tts-bridge
给 DeepSeek Harness 用的宿主侧语音合成桥。
一句话:容器里没声卡、WebView 又念不出中文?那就把语音合成搬到宿主,用 MP3 送进页面播。
它解决什么问题
DSH 在安卓上常跑在 proot 容器里,容器内 /dev/snd 不可访问,ffplay/aplay 全都没用;
而某些 ROM 的 Android WebView speechSynthesis 拿不到中文语音包,speak() 直接静默。
唯一稳定成立的路径是:页面里用 <audio> 播放一个 MP3。于是这个插件在 DSH 宿主进程里
把文字合成成 MP3,通过 DSH 自带的 webServer 暴露同源路由,页面直接 src 指过去即可。
用法
装好后,任何页面(含 WebView)都可以这样播报:
<audio src="/dsh-tts/say.mp3?text=需要你确认一下" autoplay></audio>
或者用 fetch 取 Blob 再播放(便于控制音量和复用):
const r = await fetch('/dsh-tts/say.mp3?text=' + encodeURIComponent('你好'));
const url = URL.createObjectURL(await r.blob());
new Audio(url).play();
参数:
| 参数 | 说明 |
|---|---|
text | 要念的文字,上限 200 字(防止被当成通用 TTS 代理滥用) |
voice | 可选音色,默认 zh-CN-XiaoxiaoNeural(晓晓,中文女声) |
成功返回 audio/mpeg;失败返回 502 + 纯文本原因。
安装
dsh plugin --profile web add @flyinghouse-ma/dsha-tts-bridge
然后重启 dsh web(这是宿主侧模块,热加载不生效)。
实现说明
- 走微软 Edge 朗读的 WebSocket 协议(
api.msedgeservices.com/ 旧版speech.platform.bing.com), 不是官方 Azure TTS SDK —— 不需要 API Key、不需要账号。 - 自己实现了 WebSocket 客户端(
lib/websocket.js),所以零 npm 依赖。 - 内存里对最近 40 条合成结果做 LRU 缓存:同一句话反复播报不会重复请求。
- 单次合成 15 秒超时,失败就返回错误,绝不把页面卡住。
已知限制
- 需要能访问微软的语音服务端点;被墙的网络环境下会 502。
- 只做「文字 → MP3」,不负责播放控制;播放由页面自己决定(音量、打断、队列)。
- 单条 200 字上限是按「提醒播报」场景定的,不适合朗读长文。
谁在用它
dsh-approval-voice 的本地补丁版:待审批时把「待办摘要」念出来,避免漏看弹窗。
它替换掉了原本走 speechSynthesis 的路径 —— 那条路在安卓 WebView 上不可靠。
许可证
MIT。
Plugins relacionados
dsh-web-ui (dsh-tool-describe-image)
zhu1090093659/dsh-web-ui
modlens
liustack/modlens
ipollowork
devin-axis/ipollowork
dsh-vision-router
ysr666/dsh-vision-router