为 DSH 对话内每条 AI 回复添加 🔊 点读按钮,用豆包 TTS 自然音色朗读(BYOK,Key 仅存本地 macOS 引擎)。
- 语言
- Swift
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add dsh-omi-voice在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 PolinniZhong/dsh-omi-voice:先查看仓库 https://github.com/PolinniZhong/dsh-omi-voice 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
在 DeepSeek Harness 对话里每条 AI 回复旁加一个 🔊 按钮,点一下让本机的 Omi 引擎调用豆包 TTS 1.0 念出最终回答文本,豆包 API Key 只留在你自己 Mac 的 Keychain 里(BYOK)。
核心能力
- 在每条 assistant 回复旁注入一个三态 🔊 按钮:点一次朗读、播放中再点暂停、再点从暂停处继续播放
- 只朗读最终回答正文,工具调用日志、思考过程、命令执行、纯代码围栏、纯表格与盒绘/ASCII 图形在请求前由引擎过滤,按钮在无可朗读内容时显示为禁用态
- 引擎主动轮询
/v1/status同步播放/暂停/失败/空闲状态,朗读失败时弹出具体原因 toast,引擎断连后按钮自动复位 - 文本与播放控制全部走本机
127.0.0.1:8765HTTP 协议,插件侧不存储、不接触豆包 Key - 引擎做成本控制:相同文本 3 秒去重、任意朗读 300ms 节流、进程内 LRU 缓存 3 条/≤5MB、纯内存退出即清
技术实现
- 语言: JavaScript(插件端,浏览器内运行)+ Swift 6(Omi 引擎,独立源码仓内目录)
- 关键依赖: 无运行时依赖(
package.json的dependencies为空);浏览器端使用 DSH 内置 React;引擎使用 Foundation / AVFoundation / Network / Swift Concurrency - 架构模式: DSH cordis client 插件,通过
cordis.patch.yml挂载极简 Node 占位入口,exports["./client"]+dsh.client.platform: web触发客户端 bundle 自动加载;客户端向conversation.chat.assistant-actions槽位注册朗读按钮组件(client/lib/client.js:247-258),不修改宿主 Node 侧逻辑 - 入口文件: 插件入口
host/lib/index.js(占位)+ 客户端入口client/lib/client.js;引擎入口engine/Sources/ReadAloudConfig/main.swift与engine/Sources/ReadAloudService/main.swift,HTTP 服务在engine/Sources/ReadAloudService/LocalTTSService.swift
适用场景
阅读 DSH 长回复时希望「听」而不是「读」、做家务/通勤时回放 AI 答案、或是想让视障/低视力用户能在桌面端听 AI 回答的人。代价是要在 Mac 上常驻一个未签名的 Omi 引擎、付豆包按字符计费的账单。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
DeepSeek Harness(dsh web) | 未声明 | 插件客户端通过 dsh.client.platform: web 注入;Node 入口为空占位,package.json 未声明 dshWorkshop / engines 版本 |
| Node | 未声明 | package.json 未声明 engines.node;host/lib/index.js 仅作占位导出 |
| 操作系统 | macOS 13+ Apple Silicon | 引擎 engine/Package.swift:6 声明 platforms: [.macOS(.v13)];engine/README.md:15 与 engine/CHANGELOG.md:101 进一步限制为 Apple Silicon Mac,Windows/Linux 引擎不可用 |
| Xcode Command Line Tools | 未固定版本 | 引擎需从源码用 swiftc 构建并 codesign(engine/README.md:15、engine/build/build-service.sh) |
| 豆包 TTS 1.0 服务 | 控制台开通「语音合成 1.0」 | BYOK,需要在火山引擎控制台创建关联该服务的 Access Key 并填入 Omi 引擎设置页 |
| 原生模块 | 无 | 插件 dependencies: {},未引入 node:sqlite / node-pty 等 |
安装方式
dsh plugin --profile web add github:PolinniZhong/dsh-omi-voice
引擎(
engine/,macOS 菜单栏 App)需按engine/README.md单独构建并ditto到~/Applications/Omi DSH.app,本仓库 plugin 安装命令不会替你装引擎。
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| 引擎 HTTP 地址 | localStorage 字符串(键 dsh-omi-voice/engineBase) | 插件调用引擎时使用的 base URL,例如当 Omi 引擎端口被改动或通过 SSH 转发时覆盖 | http://127.0.0.1:8765(client/lib/client.js:58-65) |
豆包 API Key、当前音色、语速等设置由 Omi 引擎独立管理,不在本插件配置项内;本插件未实现 DSH cordis 风格的
ctx.configSchema。
常见问题
Q: 点 🔊 提示「未检测到 Omi DSH 引擎」怎么办?
A: 引擎没在跑或被关闭。打开「Omi DSH」(应用程序文件夹或 ⌘空格 搜「Omi」),建议在设置里勾上「应用偏好 > 开机启动」。
Q: 提示「请先在 Omi 设置页配置豆包 API Key」如何处理?
A: 引擎在跑但还没存 Key。打开 Omi 设置页「API Key」项,按 README「获取豆包 API Key」三步在火山引擎控制台开「语音合成 1.0」、建关联的 Access Key 并填入;插件自身没有 Key 输入入口。
Q: 按钮是灰的、点了没反应?
A: 这条回复经引擎清洗后没有可朗读的有效内容(纯代码、纯表格、纯盒绘/ASCII 图形),v0.1.1 起按钮以禁用态呈现并 hover 提示「这条回复没有可朗读的内容」,不会发起豆包请求。
Q: 能否切换豆包音色?插件里有音色选择 UI 吗?
A: 插件侧没有音色 UI,v1 协议只回传当前 voice 字段;切换需在 Omi 引擎设置页「音色 ID」里改,音色列表接口 /v1/voices 在协议里标注为 v1.1 预留。
Q: 支持 Windows 或 Linux 吗?
A: 不支持。Omi 引擎仅面向 macOS 13+ Apple Silicon,需要从源码构建;插件 JS 部分虽然能在任意 dsh web 加载,但没有 macOS 引擎就放不出声音。
Q: 和零配置朗读插件(如 dsh-voice-chat)有什么差别?
A: 零配置类通常用系统自带 TTS、不需要 Key、音色偏机械、按整段读;本插件用豆包 TTS 1.0 自然音色、只读最终回答并过滤噪音内容,代价是 BYOK 按字符计费、需要本机常驻 Omi 引擎。
Q: 数据存在哪?会写聊天历史吗?
A: 引擎不落盘朗读文本、不写历史、不回调任何远程端点;插件只通过 127.0.0.1 通信,PRIVACY.md 与 docs/API.md §5 明确文本与 Key 均不外发。
Q: 怎么卸载?
A: 用 dsh plugin --profile web remove github:PolinniZhong/dsh-omi-voice 卸插件,再用 rm -rf "$HOME/Applications/Omi DSH.app" 删引擎;插件卸载同时 client.js:46-55 启动时会清理旧版本残留的 localStorage 项(dsh-omi-voice/settings、dsh-omi-voice/autoSeq/*)。
上手难度
入门 — 插件本身只暴露一个按钮和可选的引擎地址覆写,但要让它真的出声需要完成三件额外事:在 Mac 上构建未签名引擎、申请豆包 Access Key、填写到 Omi 设置页。
已知问题与限制
- 引擎仅支持 macOS 13+ Apple Silicon(
engine/Package.swift:6、engine/CHANGELOG.md:101),Windows / Linux 无对应构建产物 - 引擎当前是「macOS 源码构建版 Developer Preview」,未完成 Developer ID 签名、公证、安装包分发(
engine/SECURITY.md:24、engine/CHANGELOG.md多处声明),需要在隔离开发环境评估 - 协议 v1 未实现长文本自动分段与预取,需等 v1.1(
engine/CHANGELOG.md:103、docs/API.md:23);当前文本按 ≤900 UTF-8 字节自然分段顺序播放 - 协议 v1 无鉴权 token,本机任意进程都可调用引擎触发朗读;当前影响面仅「本机扬声器出声」,
docs/API.md:172与engine/CHANGELOG.md:104均标注后续若支持读本地文件必须加 token - v0.1.1 起移除自动朗读与 📢 开关(
CHANGELOG.md:13),刻意仅保留点读;产品决策,请勿重新引入 - 当前 Keychain 访问策略面向未正式签名的本机开发包(
engine/CHANGELOG.md:105),正式签名版本需要迁移到 Data Protection Keychain 与正式 Access Group
dsh-omi-voice
沉浸式听朗读 · 豆包音质
点一下 🔊,把 AI 回复用豆包的自然音色念给你听——无需复制,不做自动朗读
DeepSeek Harness 插件 · BYOK · MIT
让 DeepSeek Harness(DSH)桌面端里的 AI 回复,用豆包自然音色读给你听。语音由你本机常驻的 Omi 引擎合成,豆包 API Key 只留在你自己的钥匙串里(BYOK)。
快速概览
| 项目 | 说明 |
|---|---|
| 插件名称 | dsh-omi-voice |
| 适配平台 | DeepSeek Harness(dsh web,含桌面端)+ macOS 上的 Omi 引擎 v0.1.2+ |
| 解决的问题 | DSH 内置朗读(系统语音 / Edge TTS)音色机械、像上个时代的播报腔;通用剪贴板工具又要先复制再读 |
| 工作方式 | 点回复旁 🔊 朗读/暂停/继续;只读最终回答,工具日志/代码/表格/图形朗读前自动过滤 |
| 语音能力 | 豆包 TTS 1.0(seed-tts-1.0),自然中文音色,支持暂停/继续(从暂停处续播) |
| 隐私特性 | API Key 存入 Omi 引擎的 macOS Keychain;插件零 Key;仅本机 127.0.0.1 通信 |
| 成本 | BYOK,按字符计费;内存 LRU 缓存 + 去重,避免重复请求 |
| 开源协议 | MIT License |
三步开始朗读
- 安装插件 + 构建并打开 Omi 引擎(见下方「获取豆包 API Key」与「安装」)。
- 在 Omi 引擎设置页保存一次豆包 API Key。
- 在 DSH 对话里点 AI 回复旁的 🔊,即可朗读。
flowchart LR
A[点 🔊] --> B[插件取回复的最终回答文本]
B --> C[POST 127.0.0.1:8765/v1/speak]
C --> D[Omi 引擎清洗 + 分段]
D --> E[豆包 TTS 流式合成]
E --> F[本机扬声器播放]
获取豆包 API Key(新手必读)
本插件是 BYOK(自带 Key):豆包语音由你自己的火山引擎账户按字符计费。三步拿到 Key:
第 1 步 · 找到「豆包语音」:登录火山引擎控制台,进入「豆包语音」(语音技术)服务。

第 2 步 · 开通「语音合成 1.0」:在产品列表里开通「语音合成大模型 / 语音合成 1.0」。

第 3 步 · 创建 API Key:创建 Access Key 时,关联第 2 步开通的「语音合成 1.0」服务;把得到的 API Key 填进 Omi 引擎「设置 > API Key」并保存。

API Key 只保存进 Omi 引擎的 macOS Keychain,插件侧零 Key、不出本机。
安装
dsh plugin --profile web add "github:PolinniZhong/dsh-omi-voice#v0.1.2&path:/"
本地开发可直接装目录:
dsh plugin --profile web add /path/to/dsh-omi-voice
引擎(Omi DSH)构建见 engine/README.md:./engine/build/build-service.sh 后 ditto 到 ~/Applications/Omi DSH.app。
使用
- 🔊 点读;播放中再点 = 暂停,再点 = 从暂停处继续;点其它消息的 🔊 = 打断并读新的。
- 只读最终回答:工具执行日志、思考过程不会读;代码围栏、表格、纯图形(盒绘/ASCII)在请求前过滤,回复若只有这些内容,按钮呈禁用态并提示"没有可朗读的内容"。
- 引擎未启动 / 未配置 Key 时,点击会给出明确提示(含去哪打开 Omi)。
成本透明
豆包 TTS(seed-tts-1.0)按字符数计费,由你在火山引擎账户自行承担。为此:
- 只有手动点 🔊 才合成,不自动朗读;
- 引擎对相同文本 3 秒内去重,且进程内 LRU 缓存最近 3 条(≤5MB、纯内存、退出即清),重复朗读不重复计费;
- 纯表格/纯代码等无有效内容不发请求(
invalid_text)。
架构与协议
插件只是"遥控器":播放、变速、暂停/继续、缓存、文本清洗全部在 Omi 引擎内完成。协议见 docs/API.md(/v1/status、/v1/speak、/v1/pause、/v1/resume、/v1/stop)。
FAQ
| 问题 | 回答 |
|---|---|
| 点 🔊 提示"未检测到 Omi DSH 引擎" | 打开应用「Omi DSH」(~/Applications 或 ⌘空格 搜 "Omi"),建议开「开机启动」 |
| 提示"请先在 Omi 设置页配置豆包 API Key" | 打开「Omi DSH」设置,按上文「获取豆包 API Key」填一次并保存 |
| 按钮是灰的 / 点它没反应 | 这条回复没有可朗读的内容(纯代码/表格/图形),已自动过滤 |
| 音色能换吗 | 在 Omi 设置页「音色 ID」改(当前插件不提供音色 UI) |
| 支持 Windows 吗 | 暂不支持:Omi 引擎仅 macOS Apple Silicon |
| 和 dsh-voice-chat 的区别 | 它零 Key 零成本但用系统机械音色;本插件用豆包自然音色,代价是 BYOK 按字符计费 |
相关
- 引擎:本仓库
engine/(Omi DSH 本地引擎,Swift 源码 + 构建脚本) - 生态:awesome-dsh-plugin
项目文档
- AGENTS.md — 给 AI 编码代理的项目说明(Codex 约定)
- docs/DESIGN.md — 架构与设计
- docs/DECISIONS.md — 设计决策记录
- docs/MEMORY.md — 长期知识库(坑/结论)
- docs/HANDOFF.md — 交接与续作
- docs/API.md — 本地协议
License
MIT
查看使用指南 →
该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。
收录徽章
[](https://deepseek-plugin.org/plugins/PolinniZhong/dsh-omi-voice)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。