deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
English | 中文
dsh web 的语音播报插件:把每个助手答复的最终结果用 Edge TTS(微软神经语音)朗读出来,实现开口即答的语音交流。
speechSynthesis(离线也能出声)。zh-CN-XiaoxiaoNeural 等 20+ 个 Edge 神经音色,滑块调语速 (0.5×–2×)。dsh-plugin topic: (https://github.com/topics/dsh-plugin)
默认音色
zh-CN-XiaoxiaoNeural(晓晓)。如需更多官方音色,自行在src/voices.ts里追加 EdgeShortName即可。

前置要求:dsh 的应用闭包需包含插件的
@deepseek-ai/dsh-*peer 包——即任何带@deepseek-ai/dsh-web-appbundle 的部署(dsh web官方 profile 都满足)。
本项目当前以源码仓库形式发布,没有已构建的 release
tgz。你要先在仓库里构建出dsh-tts-0.1.0.tgz,再通过它安装。
克隆/进入仓库并构建:
git clone https://github.com/Vim0x3c/dsh-tts.git dsh-tts
cd dsh-tts
pnpm install
pnpm build # tsdown:产出 lib/index.js、lib/client.js 等
npm pack # 生成 dsh-tts-0.1.0.tgz
若你只想在本机用,也可以直接在仓库根执行
pnpm build拿到lib/;但安装到 dsh 建议用 tarball(npm pack生成)。
安装到 web profile:
dsh plugin --profile web add -w ./dsh-tts-0.1.0.tgz
-w标志是必须的:每个 profile 都带一个pnpm-workspace.yaml,pnpm 会把 profile 目录当作 workspace 根,裸add会报ERR_PNPM_ADDING_TO_ROOT。
重启 dsh web(宿主端会在启动时加载插件):
dsh web # 或 dsh --profile web
验证安装成功:
# ① 插件已在组合配置里(应看到 - id: dsh-tts)
dsh --profile web --dump-config | grep dsh-tts
# ② 宿主桥已起来(应返回 200 {"ok":true})
curl http://127.0.0.1:8765/health
dsh plugin --profile web add github:Vim0x3c/dsh-tts
⚠️ 不推荐:从 git 安装取到的是源码而非构建好的
lib/,且插件的 peer 包未发布到 npm,git 安装通常无法构建或解析它们。请先本地构建 tarball 再按方式一安装。
dsh plugin --profile web remove dsh-tts # 卸载
dsh plugin --profile web add -w ./dsh-tts-0.1.0.tgz # 重装(覆盖)
自动播放策略:浏览器通常要求页面有过一次用户交互后才允许自动播声音。因为你只有在发消息后才会收到答复,所以一般没问题;若仍被拦截,先在设置里点一次「试听音色」即可解锁。
语音输入(话筒/STT)暂未包含:浏览器
SpeechRecognition只在 Chrome/Edge 可用、Safari 不支持,且 dsh 无内置 STT。若需要语音输入,可参考 dsh-plugin-voice-input 或 dsh-voice。
pnpm install
pnpm build # tsdown:产出 lib/index.js(宿主)、lib/invariant.js、lib/client.js(浏览器)
pnpm test # vitest:跑单元/回归测试
构建自包含(tsdown + lightningcss),无需 monorepo 检出。prepare 运行同一构建,因此允许的 git 安装也会产出产物。
本仓库本地
node_modules复用了dsh-skin-appearance的 pnpm store,是为了离线类型检查/构建;发布 tarball 时 peer 包不必打成依赖(它们由 dsh 应用闭包在运行时解析)。
lib/index.js):启动一个仅绑定 127.0.0.1 的小型 HTTP 服务(探测端口 8765–8780),路由:GET /health —— 桥是否活着;POST /synthesize —— 传入 { text, voice, rate },走原生 Edge 协议合成 MP3 返回。src/edge/)即 Edge 浏览器“大声朗读”所用接口:Sec-MS-GEC(SHA-256 FILETIME)+ Sec-MS-GEC-Version 鉴权、浏览器指纹握手头(Origin/User-Agent/Cookie: muid)、speech.config → SSML 两条消息、二进制帧按「2 字节头长 + 内嵌 Path: audio 头 + MP3」解析拼装。WebSocket 用自实现的 RFC 6455 手动握手。零第三方依赖。lib/client.js):通过 ctx.sessions 订阅当前会话,识别每个回合的最终答复、只读最新一条、长文分段串行播放,fetch 宿主桥取回 MP3 用隐藏 <audio> 播放。播放用“代次 token + AbortController”保证停止/打断竞态正确,停止也会一并静音审批提示音。朗读失败自动降级到浏览器 Web Speech API(speechSynthesis)。设置项持久化在浏览器 localStorage(dsh-tts.settings),因为 dsh web 宿主只向浏览器暴露固定白名单的 settings 命名空间,独立插件无法扩展(见 api-proxy.ts 的 WEB_SETTINGS_NAMESPACES)。speech.platform.bing.com。确认前请先用设置面板“试听音色”;若返回 could not connect 或 403,说明本机到 Edge 端点被网络/区域/防滥用机制拦下——此时会自动改用浏览器本地 Web Speech 语音,功能仍可用。Sec-MS-GEC 令牌已验证对齐当前 edge-tts 算法(SHA-256 FILETIME + Sec-MS-GEC-Version)。若微软再次轮换算法,改 src/edge/token.ts 一处即可(“试听音色”会立刻暴露 403)。dsh web 宿主生命周期启停;停掉 dsh web 即关闭。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。