Repository navigation
Releases
v0.9.20 — 原生悬浮字幕
0.9.20 — 原生悬浮字幕
从 dsh-go 官方仓库找到 dsh-go-example-readaloud 和 docs/plugins/voice.md:
原生朗读除了 audio / voice,还有 micro(推送字幕数据)和 overlay
(App 画的一行悬浮字幕)。这正好补上“像电脑打语音”缺的一块。
新增
- 清单增加:
capabilities: ["micro", "overlay"](与 audio/voice 一起);micro: [{ id: "caption" }];overlays: [{ id: "subtitle", channel: "caption", text: "正在准备朗读…" }]。
- 朗读 / 试听 / 念最新时返回:
audio.playvoice.startoverlay.show(对话顶栏下浮出一行字幕)
- 通过
ctx.dshGo.micro('caption')按约 10 Hz 推{ text, progress }:- 字幕按句切分,长句再按标点/60 字切,单条 ≤240 字;
- 进度按实际合成 WAV 的时长推进,不是瞎估;
- 合成完成前显示静态「正在准备朗读…」。
- 播完、被停止、用户开口、用户点 × 关字幕时自动停止推送;字幕关闭不会停掉声音。
- 新增测试:字幕通道注册、overlay 效果、朗读时实际推送字幕;
test/dshgo-smoke.mjs25/0。
验证
- 官方
manifestschema:通过 - 官方
viewschema:通过(1299 B) - 官方 effects:
open / read / test / stop / setProvider / setEmotion / readLatest全部 0 violation npm run test:ci:全绿- tarball 无真实 Breeze key
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.20.tgz重启 DSH 后手机端重新安装;朗读时看对话顶栏下是否出现字幕。
v0.9.19 — 原生单选组 + 插件详情页入口
0.9.19 — 原生单选组 + 插件详情页入口
继续看了 dsh-go 官方示例(usage / toolbox / album / styles / workbench)的 view 写法,
发现原生视图本身就有单选组 options:selected 由数据绑定,选项带说明,点按返回
value。这比上一版的列表更紧凑,也不用自己画勾。
面板
- 朗读通道改成
options:- 本地模型 — 离线运行,不联网
- Breeze 云端 — 显示「已配置,可切换」或「未配置,先去设置」
- 选中态由
data.provider绑定,系统自己画选中圆点。
- 自动情感(仅云端显示)改成
options:- 关 / 规则(按关键词,零额外请求)/ 智能(主模型逐句判断)
- 选中态由
data.emotion绑定。
- 主操作仍是 念最新 / 试听 / 停止。
- 面板从 1738 B 降到 1299 B,一屏更清爽。
入口
- 面板
placement增加plugin:较新的 App 会在插件详情页也显示「语音通话」入口;
老 App 不认识该值会忽略。 - 输入框胶囊、状态条、聊天页「插件」、sheet 弹层行为不变。
验证
- 官方
manifestschema:通过 - 官方
viewschema:通过(1299 B,主操作 3 个 + 两组单选) - 官方 effects:
open / test / stop / setProvider / setEmotion / readLatest全部 0 violation test/dshgo-smoke.mjs:23/0npm run test:ci:全绿- tarball 无真实 Breeze key
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.19.tgzv0.9.18 — 通道/情感带勾选列表
0.9.18 — 通道/情感改成带勾选的列表
上一版把通道和情感做成并排按钮,虽然不再循环,但当前选中项只能靠上面一行文字判断,
点起来仍像一排设置按钮。这一版继续参考社区朗读插件,把它们改成带勾选的列表。
面板
- 主操作仍是:念最新 / 试听 / 停止。
- 朗读通道:
本地模型— 离线运行,不联网Breeze 云端— 显示「已配置,可切换」或「未配置,先去设置」- 当前项显示 「✓ 正在用」,并用
good色标出。
- 自动情感(仅云端显示):
关— 不加情感规则— 按关键词,零额外请求智能— 主模型逐句判断- 当前项同样有「✓ 正在用」。
- 顶部状态:「语音已就绪 · 本地 / 云端」;副标题统一为
「点输入框麦克风说话,回复会读出来。」 - 列表项本身可点,点完立即刷新,不再有循环按钮。
数据/兼容
- 原生状态增加
breezeReady,Breeze 列表项可以准确提示是否已配置。 - 面板仍只用 v1 组件,老 App 能画;新 App 以 sheet 弹层显示。
- 官方
viewschema 通过(1738 B);官方 effects 校验open / test / stop / setProvider / setEmotion / readLatest全部 0 violation。
验证
test/dshgo-smoke.mjs:23/0npm run test:ci:全绿- tarball 无真实 Breeze key
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.18.tgzv0.9.17 — 原生面板重做:念最新 / 明确通道 / 按需状态条
0.9.17 — 重新整理 dsh-go 原生面板
为什么改
上一版面板把「通道 / 状态 / 语音输入 / 自动情感」堆成 5 行 keyValue,
底部再放「试听音色 / 停止朗读 / 情感 / 通道」4 个按钮;情感和通道要循环点按,
当前值不直观,空闲时输入框上方还长期占着「通话 · 就绪」一行。
这次参考 dsh-go 社区朗读插件(鲸鲸朗读)的原生面板写法,重新分层:
新的原生面板
- 顶部只留一句状态:「语音已就绪 · 本地 / 云端」,未就绪显示「语音未就绪」。
- 主操作:念最新 / 试听 / 停止。
- 「念最新」直接读本会话最后一条完整回复,不用再长按消息;
- 「试听」读一句示例;
- 「停止」只在实际播放时发 stop,避免无效效果。
- 朗读:本地 / 云端两个明确按钮;当前值显示在选项上方。
- 自动情感:关 / 规则 / 智能三个明确按钮;本地 TTS 时自动隐藏,切到云端才出现。
- 底部只保留「音色 / 最近回复」两行,以及一句输入说明,不再堆技术状态。
状态条
- 空闲时自动收起,不再长期占用输入框上方;
- 只在「正在合成…」「正在朗读…」「语音未就绪」时出现;
- 每秒刷新;入口仍保留在输入框胶囊「语音」和面板入口里。
其他
- 记住最近一条完整助手回复:监听
session/event的assistant/message+turn/end,
结构不兼容时静默降级。 - 所有按钮成功只返回
{ type: 'refresh', id: 'voice-panel' },不弹 toast。 - 官方
manifestschema 通过;官方viewschema 通过(1189 B,3 个操作区);
官方 effects 校验:open / test / stop / setProvider / setEmotion / readLatest
全部 0 violation。 test/dshgo-smoke.mjs:23/0;npm run test:ci全绿。- tarball 无真实 Breeze key。
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.17.tgzv0.9.16 — dsh-go 原生弹层
0.9.16 — dsh-go 原生弹层(sheet)
改动
- 原生「语音通话」面板加了
presentation: "sheet":- 点输入框上方「通话」状态条、胶囊「语音」、聊天页「插件」入口时,
面板以弹层盖在当前对话上; - 关闭/下滑收起后回到聊天和状态条,不再整页跳转。
- 点输入框上方「通话」状态条、胶囊「语音」、聊天页「插件」入口时,
- 面板仍保持 5 行状态和 4 个按钮(试听 / 停止 / 情感 / 通道)。
- 老 App 不认
presentation时自动按整页打开,不会坏。 test/dshgo-smoke.mjs增加 sheet 断言。
边界
dsh-go 原生插件协议没有可拖拽到屏幕任意位置的原生悬浮小窗。这次是原生里最接近
「展开 / 收起小窗」的形态:固定状态条 + 可收起的原生 sheet。真要像系统悬浮球一样
任意拖动,只能:
- 用
shell.overlay网页岛(WebView,不是原生,且麦克风仍由 App 负责); - 修改 dsh-go App,增加原生悬浮窗。
验证
- 官方
manifestschema:通过(presentation合法) - 官方
viewschema:通过(视图未改,849 B、5 keyValue、4 按钮) test/dshgo-smoke.mjs:25/0npm run test:ci:全绿- tarball 无真实 Breeze key
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.16.tgzv0.9.15 — 原生语音通话面板 + 诊断修复
0.9.15 — dsh-go 原生「语音通话」面板 + 诊断修复
界面
- 原生面板改成通话卡片:顶部动态「语音通话已就绪 / 未就绪」,
中间「朗读通道 / 音色 / 语音输入 / 自动情感 / 状态」,底部 4 个按钮:
试听音色 / 停止朗读 / 情感 / 通道。 - 状态条改为「通话 · 就绪 / Breeze / 自动情感 / 智能情感 / 未就绪」。
- 插件标题、面板标题统一为「语音通话」。
- 「语音输入」明确显示 dsh-go 官方语音输入(App 自带麦克风/SenseVoice),
不再误显示插件的asrProvider。 - 「通道」按钮:BreezeBlue 已配置时在云端 / 本地 TTS 之间切换,并写回
tts-api.json;未配置时保持本地 TTS。
修复 dsh-go 诊断里的 3 项
refresh/emotion/open/toast全部返回显式{type:...},不再依赖简写。- 情感切换成功只刷新面板,不弹 toast,避免「提示太频繁」。
- 「停止朗读」先检查是否有活跃 audio/voice 会话;没有时只刷新,
不再发audio.stop + voice.stop,避免两条「动作格式不对 / 没有协商实例」。 - 状态显示更准确:声纹开启但未录入时显示「开(未录入)」。
验证
- dsh-go 官方
manifestschema:通过。 - 官方
viewschema:通过(849 B、5 个 keyValue、4 个按钮)。 - 官方 effects 校验:
open、refresh、audio.play/stop、voice.start/stop
全部 0 violation。 test/dshgo-smoke.mjs:25/0。npm run test:ci:全绿。- Tarball 扫描无真实 Breeze key。
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.15.tgz桌面端 host 侧代码需重启 DSH;网页端刷新。手机端重新安装 0.9.15 后,
原生「语音通话」面板会刷新;之前诊断里的 3 项应消失。
真机说明
以上为宿主侧/协议层验证;dsh-go 真机上的面板布局、原生音频会话和诊断清零
仍需安装后确认。语音输入走 App 官方麦克风/SenseVoice,不需要网页。
v0.9.14 — dsh-go 原生面板情感切换
0.9.14 — dsh-go 原生面板继续优化
在 0.9.13 的固定胶囊/状态条/原生面板上继续补齐:
- 原生面板「情感」按钮:按「关 → 关键词规则 → 智能(LLM)→ 关」循环,
立即写回tts-api.json,不用打开网页就能切换情感模式。 - 状态条更准:区分「语音 · 自动情感」和「语音 · 智能情感」;
本地 TTS 下情感显示「不适用(本地 TTS)」,不会误以为规则/LLM 生效。 - 音色显示:
Breeze · voc_…,比裸 id 更清楚。 - 面板提示:加一行「点输入框的麦克风说话;长按助手回复可朗读整条消息」。
- 面板仍在上限内:试听 / 停止 / 情感 / 刷新 共 4 个按钮;910 B。
检查
- dsh-go 官方
manifestschema:通过。 - dsh-go 官方
viewschema:通过(910 B、6 keyValue、4 按钮)。 - 官方 effects 校验:
toast + refresh、audio.play + voice.start、
audio.stop + voice.stop、refresh全部 0 violation。 test/dshgo-smoke.mjs:21/0(含三段情感循环、情感动作、面板绑定、未就绪提示)。npm run test:ci:全绿。
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.14.tgz桌面端 host 侧代码需重启 DSH;网页端刷新。手机端装 0.9.14 后,
在原生「语音」面板里直接点「情感」即可循环,不需要网页。
真机说明
以上为宿主侧/协议层验证;dsh-go 真机上的胶囊、状态条、面板布局和原生音频会话仍需
安装后确认。语音输入走 App 自带麦克风,不需要网页。
v0.9.13 — dsh-go 原生语音入口
0.9.13 — dsh-go 原生固定语音入口(A 方案)
不依赖网页,在 dsh-go 原生界面直接使用:
- 输入框胶囊「语音」:点按打开原生「语音」面板。
- 输入框上方状态条:显示「语音 · 就绪 / Breeze / 智能情感 / 未就绪」,点按同样打开面板。
- 原生「语音」面板:朗读通道、音色、自动情感、ASR、声纹、状态;
「试听音色 / 停止朗读 / 刷新」。 - 语音输入仍用 dsh-go 自带麦克风;插件不申请原生录音权限。
- 长按助手回复「朗读」继续保留;试听与朗读共用同一套 audio/voice 会话。
- 面板视图只用 v1 组件,754 B,6 个 keyValue、3 个按钮。
检查
- dsh-go 官方
manifestschema:通过。 - dsh-go 官方
viewschema:通过(754 B)。 - 官方 effects 校验:
open/audio.play/voice.start/audio.stop/voice.stop/refresh全部通过,0 violation。 test/dshgo-smoke.mjs:19/0(含未就绪提示)。npm run test:ci:全绿(client 42/0、models 34/0、emotion 17/0、downloader 15/0、dsh-go 19/0 等)。
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.13.tgz桌面端 host 侧代码需要重启 DSH 后生效;网页端刷新页面即可。
真机说明
以上为宿主侧/协议层验证;dsh-go 真机上的胶囊、状态条、面板布局和原生音频会话仍需
在手机上安装后确认。语音输入走 App 自带麦克风,不需要网页。
v0.9.12
0.9.12 — 智能情感(可选)+ dsh-go 原生朗读适配
BreezeBlue 智能情感(默认关)
- 在本地关键词规则之上,新增可选的 LLM 按句判断:DSH 主模型输出
emotion / intensity / instruction,映射到 Breeze 的instructions + guidance_scale。 - 当前句播放时预取下一句的表演说明;2.2 秒超时、按句缓存,失败/坏 JSON 自动回退规则。
- 面板新增「情感模式 → 智能判断 · 智能情感(LLM)开/关」,默认关,不改变现有行为。
- 插件内部的这次小请求不会触发
llm/stream自动朗读,避免“自己读自己”。
dsh-go 原生界面专门适配
- dsh-go 原生「朗读」没有网页端
voice=1SSE:llm/streamtap 现在无论有没有语音客户端
都记录主模型路由,智能情感在原生朗读里也能沿用同一个主模型。 media一次产出整段 WAV,因此按整条消息只算一次表演说明,再让所有分段共用;
8 段不再等 8 次 LLM,更适合 dsh-go 的 30 秒 media 预算。- 网页端仍保持逐句预取;本地/桌面行为不受影响。
测试
test/smart-emotion-smoke.mjs:假 LLM + 假 Breeze 流的端到端链路(7/0)。test/emotion-smoke.mjs:17/0;test/dshgo-smoke.mjs:10/0;
test/tts-api-smoke.mjs、test/breeze-smoke.mjs全绿。npm run test:ci全绿。
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.12.tgzAPI Key 只存本机 $DSH_HOME/voice-local/tts-api.json,不随包发布。npm 发布仍待账号限制解除,
当前使用 GitHub Release tarball。
v0.9.11 — BreezeBlue 自动情感
v0.9.11 — BreezeBlue 自动情感
新增
- 按文字自动切换情感:新增
lib/tts/emotion.js,对每一句 TTS 文本做本地判断:
开心 / 难过 / 生气 / 惊讶 / 紧张 / 温柔 / 俏皮 / 认真 / 自然。- 依据情绪词、语气词、感叹号、省略号、连续问号等信号。
- 自动映射到 Breeze 的
instructions + guidance_scale + speed,每句可不同。 - 无明显信号时用「自然」,避免整段过度表演。
- 纯本地规则,不额外调用 LLM,不增加首字延迟。
- 开关与持久化:语音 API 面板新增「情感模式 · 自动情感 开/关」;
breezeAutoEmotion
写入tts-api.json,状态接口返回。 - 自动情感开启时忽略手动「表演说明 / 情感强度 / 语速」,音量仍按滑杆;关闭后恢复手动参数。
- 新增
test/emotion-smoke.mjs(12/0);breeze-smoke覆盖单次请求情感(15/0);
tts-api-smoke覆盖 autoEmotion 持久化。
实测
太好了,我终于成功了!→ 开心,2.12s对不起,我要走了……→ 难过,3.29s- 试听文件在桌面,未入仓;API Key 仅本机保存,仓库/Release 不含密钥。
安装
dsh plugin --profile <profile> add ./dsh-plugin-voice-local-0.9.11.tgznpm 发布仍待账号限制解除;当前使用 GitHub Release 附件。