# 用户手册

在线预览中的[用户手册](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#manual)、[QQBot 接入](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#qqbot)与[豆包语音接入](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#doubao)为侧栏同级页面。两份接入教程分别提供准备条件、配置步骤、验收方法与故障排查，支持中文和英文；日语、法语界面显示英文正文。在线预览使用模拟配置和演示音频，真实接入请在 DSH 与对应服务控制台完成。

## 开始使用

在宿主插件列表显式启用本插件后，会显示居中的启动引导弹窗。按 Esc、点击遮罩、右上角关闭按钮或「稍后再说」均可关闭，并停止试听。可以先「试听浏览器语音」，或打开插件设置选择小米 / 豆包并保存 API Key；也可以选择「稍后再说」关闭引导。试听只使用浏览器语音，失败时不会请求云端。自动播报和 UI 音效默认关闭。

插件设置顶部的语音开关、自动朗读、音效库和服务商按钮，在鼠标悬停时会显示随指针移动的全息反光与轻微倾斜，移出后归位。反光位于人物图片后方，仅作用于卡片背景与边缘，人物、文字与状态标记保持清晰，关闭态的反光较弱；极简模式、只读配置和触屏不启用指针跟随效果。系统开启「减少动态效果」时，鼠标悬停和键盘聚焦仅显示静态高光。

## ⚙️ 配置要点

- **小米**：内置音色 `mimo-v2.5-tts`；音色设计 `mimo-v2.5-tts-voicedesign` 支持预设或描述。
- **豆包**：标准合成 `seed-tts-2.0`；声音复刻 `seed-icl-2.0` 需先[创建音色](https://console.volcengine.com/speech/new/experience/clone?projectName=default)并填写 ID。需开通对应资源，Agent Plan 使用专属 Key，Coding Plan 不含语音模型。
- **服务商**：各自保留密钥、模型和音色；豆包按 Key 自动选择标准或 Agent Plan 线路。
- **语音指令**：小米与豆包标准合成分别提供情绪、风格和方言预设，也可自行输入；两家的指令独立保存，切换服务商不会覆盖。本地语音和豆包复刻不应用指令。
- **本地语音**：可选云端优先、本地优先或关闭；云端已开始播放后失败不会自动兜底或重播。
- **朗读范围**：智能模式自动读前两个语义段、手动读全文；全文模式始终读全文；首段模式只读首个语义段。
- **连接**：豆包持续文本输入需 Host 支持 WebSocket upgrade，反向代理需转发 Upgrade。
- **鲸鱼娘 Agent 预设**：默认关闭，在「设置 → 插件 → 本插件 → 包含的组件」开启，新建会话时选择。附带[本地表情包](skills/whale-girl/memes.json)


小米内置音色的 `presetStylePrompt` 和 `instruction` 默认均为空，未选择风格时只发送待朗读文本。选择预设或填写非空指令后，仅使用该指令，不再叠加 `presetStylePrompt`。如果已有非空的 `presetStylePrompt` 配置，它仅在语音指令为空时生效；将两项均清空即可完全不附加风格。升级不会删除已保存的自定义配置。音色设计模式继续保留 `voiceDesignPrompt`，并追加语音指令；音色描述与指令应避免矛盾。风格效果随模型、音色和文本变化，建议先试听。

豆包语音指令仅适用于支持指令的 TTS 2.0 标准音色；自定义 ID 也需确认是该系列音色，声音复刻不发送指令。指令按 `req_params.additions` 中的 `context_texts` 数组发送，建会话和每次文本请求均携带相同配置。方言预设目前发送自然语言指令，并未设置接口的 `explicit_dialect` 参数；固定方言能力还取决于音色支持。云端试听请选择「关闭本地语音」，以免浏览器语音兜底掩盖云端失败；听到浏览器语音不代表豆包指令已生效。

官方文档：[小米风格控制](https://mimo.mi.com/docs/zh-CN/quick-start/usage-guide/audio/speech-synthesis-v2.5) · [豆包音色](https://docs.volcengine.com/docs/DoubaoVoice/Tonelist-1?lang=zh) · [豆包语音指令](https://docs.volcengine.com/docs/DoubaoVoice/DoubaoTextToSpeech20CapabilityIntroduction?lang=zh) · [Agent Plan 语音](https://docs.volcengine.com/docs/6561/2532486?lang=zh)。

## 豆包语音接入

完整分步教程见独立的[豆包语音接入页](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#doubao)。首次接入建议先验证标准音色，再尝试复刻和实时朗读。

自定义标准音色 ID 和复刻音色 ID 在失焦或按 Enter 后会记入下方最近使用的标签。已收录的标准音色自动显示名称；其他音色可填写「备注名称」，清空备注后恢复显示 ID。备注和历史仅保存在当前浏览器，标准音色与复刻音色分别记录；点击标签始终填回原始 ID，不会把名称作为合成参数。标签最大宽度为 120px，超出部分省略，悬停可查看完整名称及 ID。当前不查询控制台昵称：官方 `ListSpeakers` 需要独立的 AK/SK 签名，`get_voice` 仅提供复刻状态等信息，没有名称字段。

1. **准备资源与正确的 Key。** 标准服务使用[豆包语音新版控制台 API Key](https://console.volcengine.com/speech/new/setting/apikeys?projectName=default)，并开通所需模型资源。Agent Plan 使用套餐专属 Key，插件自动选择线路，无需手填地址；Coding Plan 不包含语音模型，区别见[官方说明](https://docs.volcengine.com/docs/ark/agent-plan-personal-faq?lang=zh)。旧版 AppID、Access Token、Secret Key 不能直接替代这里的 API Key。
2. **在真实 DSH 保存密钥。** 打开本插件设置，切换到「豆包语音」，粘贴 Key 并点击底部「保存」。新密钥草稿不会被试听使用；「格式已识别」不代表权限或连接已经验证。
3. **用标准音色建立基线。** 在「调音台」选择标准合成 `seed-tts-2.0`、一个内置音色、1× 语速，语音指令留空。需要自定义标准音色时，从[音色库](https://console.volcengine.com/speech/new/voices?projectName=default)复制完整 TTS 2.0 音色 ID，而非显示名称。
4. **关闭本地兜底后验收。** 本地语音策略选「关闭本地语音」并保存，在「播报台」输入一句短话手动试听，确认状态显示豆包且音频播放完成。最多使用 100 字符的试听文本。启用引导中的浏览器语音和在线 preview 的演示音频都不能证明云端可用。
5. **保存试听满意的配置。** 模型、音色、语速和指令可以用草稿试听，但 QQ 等宿主渠道只使用已保存配置。确认后点击「保存」；验证完成可按需要恢复本地兜底策略并再次保存。
6. **可选：接入复刻音色。** 在控制台完成音色创建并确认可合成，切到声音复刻 `seed-icl-2.0`，填入完整「复刻音色 ID」并保存、试听。不要填写任务 ID 或昵称，且当前 Key 必须有该音色的使用权限。标准音色与复刻 ID 分别保留，复刻不应用标准合成的语音指令。
7. **可选：启用实时朗读。** 保存语音播放、自动播放开关，用新的对话消息测试。宿主「全部回复」支持增量朗读，「仅最终回答」等待轮次完成。持续文本输入要求宿主支持 WebSocket upgrade，反向代理需转发 Upgrade；停止或切换会话不会补播旧内容。QQ 发送另按下文的 QQBot 流程配置，不由浏览器自动播放控制。

| 现象 | 优先检查 |
| --- | --- |
| 密钥未配置或被拒绝 | 是否选择豆包、Key 是否保存与有效、标准或 Agent Plan 凭据是否匹配，以及账号／项目权限。 |
| 资源未开通、音色不可用 | 模型资源与音色系列是否对应；复刻是否创建完成、ID 是否完整、当前 Key 是否有权限。可用内置标准音色作对比。 |
| 限流、额度不足、超时 | 控制台用量和并发；停止并发试听后用单条短句重试。超时检查 DSH 所在机器到供应商的网络和日志。 |
| 能发声但音色或指令不对 | 关闭本地兜底并确认实际来源；检查模型、指令支持与保存状态。旧历史录音不会随设置更新，需重新合成。 |
| 手动正常，实时朗读失败 | 自动播放权限、宿主回复偏好、WebSocket 支持，以及直连与代理访问的差异。 |

分享问题时保留版本、服务路线、模型、音色、错误类型和脱敏请求标识，并说明代理与兜底状态；移除密钥、账号凭据和私人文本。

## 自动朗读与宿主回复偏好

宿主的「全部回复 / 仅最终回答」决定自动朗读哪些回复，插件的「智能 / 全文 / 首段」决定每条回复读多长。

- **全部回复**：支持实时语音的模型按原有方式在生成过程中朗读；其余模型在回复完成后播放。
- **避免重复朗读**：已经进入实时朗读队列的正文，不会在生成结束后再从头自动播放；手动点击消息朗读按钮仍可重播。
- **仅最终回答**：等待回合结束，只朗读宿主确认的最终回复，再应用插件选择的朗读范围；不在生成过程中播放过程文字。
- **切换宿主偏好**：停止当前自动朗读，本轮不补播，从下一轮开始应用。手动点击消息的朗读按钮，仍按该消息与插件朗读范围执行。
- 切换会话或中途打开正在生成的会话，不补播已存在的内容。

## 通用宿主语音与渠道联动

宿主语音独立于浏览器播放：其他插件可以合成音频、导出文件，或注册自己的渠道发送适配器。小米、豆包及其已保存音色共用原有配置；密钥不会交给模型或发送适配器。浏览器的本地语音兜底、自动播放开关、音量和音频历史不控制这条链路。宿主不需要打开浏览器即可工作。

### 内置工具与预设

通用语音工具通过 `dsh-xiaomi-tts/speech-agent` 模块组合到已有预设中，不额外提供需要用户开启的通用预设组件。QQ 联动只提供一个「QQ Bot 传声」组件，由它内部装配发送器和「QQ 鲸鱼娘」预设（`qq-speech-assistant`）。模块提供以下工具，自动语音默认关闭：

| 工具 | 用途 |
| --- | --- |
| `synthesize_speech` | 生成 MP3、WAV 或 SILK 文件，返回绝对路径、格式与大小；供模型再用 `present` 或其他文件工具交付。不会自行发送到聊天。 |
| `speak` | 合成并通过预设指定的适配器交付。默认 `file` 适配器只导出 WAV 文件；渠道适配器可发送到对应会话。成功后不要再重复发送同一音频。 |
| `speech_mode` | 通用渠道的会话自动模式控制；QQ 预设不注册此工具，自动发送直接由播报台的来源开关控制。 |

可以说「把这段文字生成音频」「用语音回答」。自然语言按需请求由模型调用对应工具；QQ 来源开关开启后，每轮成功结束时的自动合成由宿主代码触发，不需要再通过会话指令开启，也不依赖模型每轮再次调用 `speak`。

自动模式只朗读最后一条助手正文，不读工具过程、思考、代码、链接或文件路径，不重播历史回复，也不朗读取消、失败或被打断的轮次及子任务。**QQ 不再按 300 字或 60 秒限制发送，不截断、不生成摘要。** 超过合成接口单次文本上限时，按顺序分段合成并发送完整正文；单次合成大小、供应商与 QQ 平台的实际限制仍会检查，发送失败时停止后续段落且不自动重复发送。其他渠道的通用模块仍默认采用 300 字自动范围、60 秒时长，可将对应限制设为 `0` 取消；`synthesize_speech` 继续遵循单次合成限制。

通用渠道的会话模式保存在 `~/.dsh-xiaomi-tts/sessions`，重启后恢复；QQ 忽略此前保存的会话自动模式，只读取来源开关。文件导出保存在 `~/.dsh-xiaomi-tts/audio`，至少保留到 24 小时过期，宿主每小时清理一次。导出的音频不会自动进入浏览器音频历史；`speech/delivered` 事件会报告导出路径或渠道交付结果，其他插件可据此展示附件。

### QQBot 接入

在线完整教程已独立为 [QQBot 接入页](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#qqbot)，与用户手册同级，可按目录查看连接、预设、验收和分层排错。

先确认本插件已安装并启用，在插件设置中选择小米或豆包，填写并保存 API Key、模型和音色，并确认**云端试听**正常。浏览器本地语音试听成功不能代替云端验证。以下配置需在同一个 DSH 实例／profile 中完成。

1. **安装并连接 QQBot。** 在 DSH「插件 → 添加插件」输入 `@tencent-connect/dsh-qqbot@latest`，安装并启动；进入「设置 → QQ 机器人」，用手机 QQ 扫码连接。先在 QQ 中向机器人发送一条消息，确认它能够正常回复文字。安装和绑定方式详见 [QQBot 官方说明](https://github.com/tencent-connect/dsh-qqbot#安装)。

2. **开启组件开关。** 进入「设置 → 插件 → 本插件 → 包含的组件」，开启 **QQ Bot 传声**。它同时提供发送适配和内置的 **QQ 鲸鱼娘** Agent 预设，只需开启这一个 QQ 联动组件。

3. **开启播报来源。** 在本插件「播报台 → 插件联动」打开 **QQ Bot** 来源开关，然后点击**保存**。开启后，新会话中的普通回复也会自动发送完整语音，不需要额外开启浏览器自动播放，也不需要在 QQ 中再设置会话自动模式。可以关闭网页，但 DSH 宿主需继续运行。

4. **在 QQ 中用官方指令切换 Agent 预设。** 向机器人发送 `/preset`，查看可用预设，确认列表中有 **QQ 鲸鱼娘（`qq-speech-assistant`）**，再单独发送：

   ```text
   /preset qq-speech-assistant
   ```

   参数使用预设 ID `qq-speech-assistant`。机器人应确认预设已切换，并提示新会话生效；仅发送 `/preset` 查看列表不会完成切换。该命令及生效方式见 [QQBot 官方预设命令](https://github.com/tencent-connect/dsh-qqbot/blob/main/src/commands/preset.ts)。预设 ID 沿用旧版「QQ 语音助手」，已保存该 ID 的用户无需修改。

5. **用 `/new` 开启应用预设的新对话。** 在刚才切换预设的同一个 QQ 私聊或群聊中，单独发送：

   ```text
   /new
   ```

   `/preset` 设置下一次会话使用的预设，当前对话仍保留原预设，因此这一步不能省略。新对话会启用 QQ 鲸鱼娘的人设、语音和表情包能力。私聊和各个群聊分别选择预设；在一个私聊里切换，不会替其他群聊切换。

6. **发送消息测试 QQ 语音。** 在新对话中发送「你好，介绍一下自己」。来源开启时，无需特别要求语音，应能在 QQ 会话中收到文字回复和可点击播放的语音消息；播放确认内容与当前配置的音色符合预期。群聊中请按 QQBot 设置要求 **@机器人**，命令和测试消息都在同一个目标群内发送。

发送规则如下，可在基础流程完成后分别验证：

| 组件开关 | QQ Bot 来源开关 | 发送规则与测试方法 |
| --- | --- | --- |
| 开启 | 开启并保存 | 普通消息触发自动语音；长回复完整发送，超过单次合成上限时顺序分段。 |
| 开启 | 关闭并保存 | 普通消息不自动发送语音；发送「请用语音说一句你好」验证按需发送。 |
| 关闭 | 任意 | 本插件的按需、自动语音均不可发送，QQBot 仍可回复文字。 |

来源默认关闭。关闭来源只取消待处理的自动语音，不影响按需语音；再次开启不会补发关闭期间的回复。如果 `/preset` 列表没有 QQ 鲸鱼娘，先检查 QQ Bot 传声组件是否已启用，以及两个插件是否运行在同一个 DSH 实例。若只有文字没有语音，依次检查来源开关是否保存、是否执行了 `/preset qq-speech-assistant` 和 `/new`、云端试听是否正常；进一步的发送失败原因查看 QQBot 与本插件日志。

适配器将音频转换为 SILK，临时放入 QQBot 默认允许的 `~/.dsh-qqbot/media`，通过已注册的 `qqbot_send_file` 工具发送，并在发送操作结束后清理。目标由 QQBot 根据当前 Agent 解析，不让模型填写 openid；发送继续经过 DSH 工具策略、QQBot 路径白名单和回复额度管理。缺少发送工具、工具被限制、平台拒绝或额度不足时，不会另起连接或绕过限制发送，也不会盲目自动重试。

QQ 原有文字回复照常发送。自动语音在轮次成功结束后开始合成，但由于 QQBot 没有公开文字送达确认接口，不严格保证文字与语音到达先后。新轮次、关闭语音或插件卸载会取消尚未发送的旧任务；QQBot 的上传发送一旦开始，取消信号不能保证撤回已经送出的消息，`/stop` 也不能作为语音撤回命令。请在 QQBot 日志核对发送结果后再决定是否重试。

内置「QQ 鲸鱼娘」改编自本项目鲸鱼娘人设，保留机灵嘴硬、心软可靠的性格，日常默认一到三句口语短话，随当前话题自然吐槽、接梗，不固定用安慰、建议或追问收尾；明确要求详细解释时才展开。米饭只是背景喜好，仅在聊吃饭、询问喜好或对方主动接梗时提及，不用它串联无关话题，也避免反复套用摸鱼、犯困等口头禅。它使用随包附带的 [QQ 鲸鱼娘 skill](skills/qqbot-whale-girl/SKILL.md)，由预设自动注入，无需用户单独安装或手动加载。更新人设后，重新启动「QQ Bot 传声」组件，再在目标 QQ 私聊或群聊发送 `/new`，让新对话使用更新后的设定。

表情包与普通鲸鱼娘共用[本地素材目录](skills/whale-girl/memes.json)。QQ 预设提供 `qqbot_send_meme`，按目录 ID 将图片文件发送到当前 QQ 私聊或群聊，默认按语境偶尔发一张；要求不发图或只要语音时不发。发送沿用 `qqbot_send_file` 的权限、路由和额度检查，不需要 shell 或修改路径白名单。图片会临时复制到 `~/.dsh-qqbot/media`，发送结束删除；异常退出遗留的副本在 24 小时过期后由每小时清理任务处理。缺图或发送失败时退回文字，不自动重试。播报台来源开关只控制自动语音，不控制表情包。

内置 QQ 预设专注聊天、语音和表情包。如需保留其他既有人格、文件和网页工具，在原预设的 `plugins` 中追加下面的通用模块即可，不需要替换人格：

```yaml
- id: conversation-speech
  name: 'dsh-xiaomi-tts/speech-agent'
  config:
    delivery: qqbot # 也可以是 file 或其他插件注册的适配器 ID
    # QQ 自动模式由来源开关控制，不需要额外配置长度或时长限制。
```

将这个模块仅挂到需要语音能力的预设。QQ 发送适配器只挂一份；面向 QQ 的预设应只分配给 QQBot 会话。一次会话中显式调用 `speak` 后，本轮不再自动补发，避免同一内容发送两次。

### 插件开发接口

公开类型从 `dsh-xiaomi-tts/host-api` 导入。在插件中声明 `inject = ['speechSynthesis']`，通过 `ctx.speechSynthesis` 调用：

```ts
import type { Context } from '@deepseek-ai/cordis'
import type {} from 'dsh-xiaomi-tts/host-api'

export const inject = ['speechSynthesis']

export async function apply(ctx: Context) {
  const controller = new AbortController()
  const audio = await ctx.speechSynthesis.synthesize({
    text: '这是一段宿主合成的语音。',
    format: 'wav', // mp3 / wav / silk
    signal: controller.signal,
  })
  // audio.data 是 Buffer；交给自己的播放器、上传或存储逻辑。
  ctx.logger.info(`Generated ${audio.data.length} bytes`)
}
```

`exportAudio(request)` 返回托管文件及幂等的 `remove()`；`synthesize(request)` 只返回内存音频。请求可覆盖 `provider`、`model`、`voice`、`speechInstruction`、`voiceDesignPrompt` 和豆包 `voiceRate`，不支持从模型参数传入密钥或合成地址。`maxDurationMs` 要求使用 WAV/SILK，以便在交付前检查实际时长。

渠道插件通过 `registerDelivery({ id, format, check?, send })` 注册适配器，并用 `ctx.effect(() => registerDelivery(...))` 绑定卸载清理。可选的 `check({ agent, signal })` 在合成前检查发送前提，缺少发送工具时避免消耗云端请求。`send(audio, { agent, signal })` 负责按当前 Agent 路由和执行渠道权限检查，返回 `{ adapter, messageId?, target?, path? }`；通用模块使用 `deliver(request, id, { agent, signal })` 完成合成和交付。适配器不接触供应商密钥，`file` 是保留 ID。适配器需要遵守取消信号，发送失败或结果不明时不要自动重复发送。

`setDeliveryEnabled(id, enabled)` 可单独控制某个渠道并取消其全部待处理任务；`hasDelivery(id)` 检查适配器是否注册及是否允许交付。`setAutomaticDeliveryEnabled(id, enabled)` 和 `isAutomaticDeliveryEnabled(id)` 单独控制自动发送，关闭时保留显式请求。QQ 的自动发送由宿主设置 `qqbotEnabled` 控制，组件注册本身决定是否具备发送能力；纯 CLI 也可配置该设置。`deliver` 的上下文使用 `automatic: true` 标记自动任务，长文完整交付可在请求中设置 `splitLongText: true`。

纯 CLI／无 Web 服务的 profile 可以将宿主插件条目设为 `dsh-xiaomi-tts/host`，配置沿用本插件的 `provider`、API Key、音色和限制等字段。它只提供宿主语音服务，不要求 `webServer`。它与默认 Web 入口二选一，不要在同一个服务作用域重复挂载；`speech-agent` 和渠道适配器仍按需挂载。

本地回归验证合成、转码、会话隔离、取消、策略拒绝及临时文件清理；QQ 平台权限、实际回复额度和手机端播放需要在真实账号上验证。

## 插件详情页

在宿主中打开本插件的组合包详情，可通过「用户手册」直接打开[在线使用手册](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#manual)，其左侧的「赏个Star」可打开项目仓库。两个按钮均沿用宿主按钮样式，「赏个Star」保留悬停扫光效果；详情同时显示当前已保存服务商的密钥格式状态。组件详情、其他插件和官方条目不显示这些扩展。

在线手册包含[自动朗读与回复偏好](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#manual-reading)、[QQ Bot 接入流程](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#manual-qqbot)及[试听与故障排查](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/#manual-troubleshooting)，目录可直接定位章节。预览站点的保存、组件状态和云端合成均为演示，不会修改真实 DSH 配置，也不会向 QQ 发送消息；供应商权限、真实音色和 QQ 语音送达需在 DSH 与 QQ 中验证。

密钥状态区分检查中、未配置、格式已识别、格式不支持和无法检查。**格式已识别仅表示密钥格式受支持**，不代表额度、音色权限或网络连接正常；请在插件设置中试听确认。无法检查时可「重新检查」。浏览器语音无需云端密钥。

配置卡、独立语音朗读页与详情状态共用查询。保存配置、恢复宿主连接或插件变更完成后会刷新；变更期间暂停查询。详情中的手册入口始终可用，不会修改只读配置。版本、更新、启停和卸载继续由宿主管理。

## 音频历史

在插件设置页底部点击「音频历史 · 数量」，进入二级页面查看当前浏览器保存的音频。支持搜索、按来源筛选、播放 / 暂停、拖动进度、下载、删除及清空，各按钮使用宿主样式与交互效果。点击顶部标题或底部「返回设置页」按钮均可回到设置页，未保存的设置会保留；返回或离开页面会停止回放。关闭语音播放后仍可访问历史。

历史最多保存 100 条 / 100 MB。存储不可用或已满时会显示临时保存提示，请下载要保留的音频。浏览器本地语音不保存录音。

## 插件变更与更新

安装、启停或更新本插件及其组件时，播放会停止，设置暂时不可操作，密钥状态查询暂停；变更结束后重新查询。尚未保存的设置草稿不会因进入变更状态而被主动清空。

版本查询、安装和更新统一使用宿主原生能力。本插件不再查询 npm 版本，也不再显示自研更新提示；本地链接安装是否可更新由宿主决定。

## 界面语言

界面随宿主语言切换，支持中文、英文、日语和法语。语言切换不会修改服务商、音色 ID 或已保存配置；界面语言不代表所选音色支持该语言。

## 交互预览

[在线预览](https://ppy-web.github.io/dsh-plugin-xiaomi-mimo-tts/)和 `pnpm dev` 提供同一套预览界面。侧栏按语音体验、插件管理、工具与帮助分组，可独立打开插件设置、语音朗读、对话效果、详情、组件、文本过滤和手册；音频历史从插件设置页底部进入二级页面，「启用引导」直接打开弹窗。侧栏各页面支持链接直达和浏览器前进、后退。

顶部可切换语言与深浅主题；侧栏底部提供只读配置模拟和重置。手机端点击顶部侧栏按钮打开导航，预览环境控件收在折叠区。所有配置修改均为本地模拟，不会写入 DSH；预览中的云端试听使用本地演示音频。
