diff --git a/docs/zh-CN/tools/tts.md b/docs/zh-CN/tools/tts.md index 9f4ad013c..ac2c9ea46 100644 --- a/docs/zh-CN/tools/tts.md +++ b/docs/zh-CN/tools/tts.md @@ -3,18 +3,19 @@ read_when: - 为回复启用文本转语音 - 配置 TTS 提供商、回退链或角色 - 使用 /tts 命令或指令 -summary: 用于外发回复的文本转语音——提供商、角色、斜杠命令,以及按渠道区分的输出 +sidebarTitle: Text to speech (TTS) +summary: 用于外发回复的文本转语音——提供商、角色、斜杠命令,以及按渠道划分的输出 title: 文本转语音 x-i18n: - generated_at: "2026-04-26T05:12:12Z" + generated_at: "2026-04-26T05:15:03Z" model: gpt-5.4 provider: openai - source_hash: 6ac6e57ca49252cb4b500936600ec29c12011fbec0f61d928b8fb1c38b662bc1 + source_hash: 501d719feaea7d72726b8eaa19f0b0942ccf68f82065912a59b50351ea4ffbb7 source_path: tools/tts.md workflow: 15 --- -OpenClaw 可以将外发回复转换为音频,支持 **13 个语音提供商**,并可在 Feishu、Matrix、Telegram 和 WhatsApp 上发送原生语音消息,在其他所有地方发送音频附件,以及为电话和 Talk 提供 PCM/Ulaw 流。 +OpenClaw 可以将外发回复转换为音频,覆盖 **13 个语音提供商**,并在 Feishu、Matrix、Telegram 和 WhatsApp 上发送原生语音消息,在其他所有地方发送音频附件,以及为电话和 Talk 提供 PCM/Ulaw 流。 ## 快速开始 @@ -23,7 +24,7 @@ OpenClaw 可以将外发回复转换为音频,支持 **13 个语音提供商** OpenAI 和 ElevenLabs 是最可靠的托管选项。Microsoft 和 Local CLI 无需 API 密钥即可使用。完整列表请参见[提供商矩阵](#supported-providers)。 - 导出你的提供商所需的环境变量(例如 `OPENAI_API_KEY`、`ELEVENLABS_API_KEY`)。Microsoft 和 Local CLI 不需要密钥。 + 为你的提供商导出对应的环境变量(例如 `OPENAI_API_KEY`、`ELEVENLABS_API_KEY`)。Microsoft 和 Local CLI 不需要密钥。 设置 `messages.tts.auto: "always"` 和 `messages.tts.provider`: @@ -46,37 +47,37 @@ OpenClaw 可以将外发回复转换为音频,支持 **13 个语音提供商** -Auto-TTS 默认**关闭**。当未设置 `messages.tts.provider` 时,OpenClaw 会按照注册表自动选择顺序,选取第一个已配置的提供商。 +默认情况下,自动 TTS **关闭**。当未设置 `messages.tts.provider` 时,OpenClaw 会按注册表自动选择顺序选取第一个已配置的提供商。 ## 支持的提供商 | 提供商 | 认证 | 说明 | | ----------------- | ---------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| **Azure Speech** | `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION`(也支持 `AZURE_SPEECH_API_KEY`、`SPEECH_KEY`、`SPEECH_REGION`) | 原生 Ogg/Opus 语音消息输出和电话支持。 | -| **ElevenLabs** | `ELEVENLABS_API_KEY` 或 `XI_API_KEY` | 支持声音克隆、多语言,并可通过 `seed` 实现确定性输出。 | -| **Google Gemini** | `GEMINI_API_KEY` 或 `GOOGLE_API_KEY` | Gemini API TTS;通过 `promptTemplate: "audio-profile-v1"` 感知角色。 | -| **Gradium** | `GRADIUM_API_KEY` | 支持语音消息和电话输出。 | -| **Inworld** | `INWORLD_API_KEY` | 流式 TTS API。支持原生 Opus 语音消息和 PCM 电话。 | +| **Azure Speech** | `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION`(也支持 `AZURE_SPEECH_API_KEY`、`SPEECH_KEY`、`SPEECH_REGION`) | 原生 Ogg/Opus 语音便笺输出和电话支持。 | +| **ElevenLabs** | `ELEVENLABS_API_KEY` 或 `XI_API_KEY` | 语音克隆、多语言,并可通过 `seed` 实现确定性输出。 | +| **Google Gemini** | `GEMINI_API_KEY` 或 `GOOGLE_API_KEY` | Gemini API TTS;可通过 `promptTemplate: "audio-profile-v1"` 感知角色。 | +| **Gradium** | `GRADIUM_API_KEY` | 语音便笺和电话输出。 | +| **Inworld** | `INWORLD_API_KEY` | 流式 TTS API。原生 Opus 语音便笺和 PCM 电话支持。 | | **Local CLI** | 无 | 运行已配置的本地 TTS 命令。 | -| **Microsoft** | 无 | 通过 `node-edge-tts` 使用公开的 Edge 神经网络 TTS。尽力而为,无 SLA。 | +| **Microsoft** | 无 | 通过 `node-edge-tts` 使用公开的 Edge 神经网络 TTS。尽力而为,不提供 SLA。 | | **MiniMax** | `MINIMAX_API_KEY`(或 Token Plan:`MINIMAX_OAUTH_TOKEN`、`MINIMAX_CODE_PLAN_KEY`、`MINIMAX_CODING_API_KEY`) | T2A v2 API。默认使用 `speech-2.8-hd`。 | | **OpenAI** | `OPENAI_API_KEY` | 也用于自动摘要;支持角色 `instructions`。 | | **OpenRouter** | `OPENROUTER_API_KEY`(可复用 `models.providers.openrouter.apiKey`) | 默认模型为 `hexgrad/kokoro-82m`。 | | **Volcengine** | `VOLCENGINE_TTS_API_KEY` 或 `BYTEPLUS_SEED_SPEECH_API_KEY`(旧版 AppID/token:`VOLCENGINE_TTS_APPID`/`_TOKEN`) | BytePlus Seed Speech HTTP API。 | | **Vydra** | `VYDRA_API_KEY` | 共享的图像、视频和语音提供商。 | -| **xAI** | `XAI_API_KEY` | xAI 批量 TTS。**不**支持原生 Opus 语音消息。 | -| **Xiaomi MiMo** | `XIAOMI_API_KEY` | 通过 Xiaomi chat completions 提供 MiMo TTS。 | +| **xAI** | `XAI_API_KEY` | xAI 批量 TTS。**不**支持原生 Opus 语音便笺。 | +| **Xiaomi MiMo** | `XIAOMI_API_KEY` | 通过 Xiaomi 聊天补全实现的 MiMo TTS。 | -如果配置了多个提供商,将优先使用所选提供商,其他提供商作为回退选项。自动摘要使用 `summaryModel`(或 `agents.defaults.model.primary`),因此如果你保持摘要启用状态,对应提供商也必须完成认证。 +如果配置了多个提供商,会优先使用所选提供商,其余提供商作为回退选项。自动摘要使用 `summaryModel`(或 `agents.defaults.model.primary`),因此如果你保持摘要启用状态,该提供商也必须完成认证。 -内置的 **Microsoft** 提供商通过 `node-edge-tts` 使用 Microsoft Edge 的在线神经网络 TTS 服务。它是一个公开的 Web 服务,没有公开的 SLA 或配额——请将其视为尽力而为服务。旧版提供商 id `edge` 会被规范化为 `microsoft`,并且 `openclaw doctor --fix` 会重写已持久化的配置;新配置应始终使用 `microsoft`。 +内置的 **Microsoft** 提供商通过 `node-edge-tts` 使用 Microsoft Edge 的在线神经网络 TTS 服务。这是一个公开的网络服务,没有公开发布的 SLA 或配额——请将其视为尽力而为。旧版提供商 id `edge` 会被标准化为 `microsoft`,而 `openclaw doctor --fix` 会重写持久化配置;新配置应始终使用 `microsoft`。 ## 配置 -TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择一个预设并调整对应的提供商块: +TTS 配置位于 `~/.openclaw/openclaw.json` 的 `messages.tts` 下。选择一个预设并调整对应的提供商配置块: @@ -133,7 +134,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 model: "gemini-3.1-flash-tts-preview", voiceName: "Kore", // 可选的自然语言风格提示: - // audioProfile: "以平静、播客主持人的语气说话。", + // audioProfile: "Speak in a calm, podcast-host tone.", // speakerName: "Alex", }, }, @@ -356,7 +357,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 ### 按智能体覆盖语音设置 -当某个智能体需要使用不同的提供商、声音、模型、角色或 Auto-TTS 模式时,请使用 `agents.list[].tts`。该智能体块会在 `messages.tts` 之上执行深度合并,因此提供商凭证可以保留在全局提供商配置中: +当某个智能体需要使用不同的提供商、语音、模型、角色或自动 TTS 模式时,请使用 `agents.list[].tts`。智能体配置块会在 `messages.tts` 之上进行深度合并,因此提供商凭证可以保留在全局提供商配置中: ```json5 { @@ -384,7 +385,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 } ``` -要固定某个按智能体生效的角色,请在提供商配置旁设置 `agents.list[].tts.persona`——它只会覆盖该智能体的全局 `messages.tts.persona`。 +若要固定某个智能体的专属角色,请在提供商配置旁设置 `agents.list[].tts.persona`——它只会覆盖该智能体的全局 `messages.tts.persona`。 自动回复、`/tts audio`、`/tts status` 以及 `tts` 智能体工具的优先级顺序如下: @@ -395,9 +396,9 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 ## 角色 -**persona** 是一种稳定的语音身份,可在不同提供商之间以确定性方式应用。它可以偏好某个提供商、定义与提供商无关的提示意图,并携带与提供商相关的声音、模型、提示模板、种子和语音设置绑定。 +**persona** 是一种稳定的语音身份,可以在不同提供商之间以确定性方式应用。它可以优先指定某个提供商、定义与提供商无关的提示意图,并携带与提供商相关的语音、模型、提示模板、seed 和语音设置绑定。 -### 最小角色 +### 最小角色配置 ```json5 { @@ -407,7 +408,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 persona: "narrator", personas: { narrator: { - label: "旁白者", + label: "旁白", provider: "elevenlabs", providers: { elevenlabs: { voiceId: "EXAVITQu4vr4xnSDxMaL", modelId: "eleven_multilingual_v2" }, @@ -419,7 +420,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 } ``` -### 完整角色(与提供商无关的提示) +### 完整角色配置(提供商无关提示) ```json5 { @@ -430,17 +431,17 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 personas: { alfred: { label: "Alfred", - description: "冷幽默而温暖的英式管家旁白。", + description: "冷峻而温暖的英式管家旁白。", provider: "google", fallbackPolicy: "preserve-persona", prompt: { - profile: "一位才华横溢的英国管家。冷幽默、机智、温暖、迷人、情感丰富,绝不平庸。", - scene: "安静的深夜书房。为受信任的操作员进行近距离收音的旁白。", - sampleContext: "说话者正在以简洁、自信且带有冷幽默的温暖语气,回答一个私密的技术请求。", - style: "精致、克制、略带玩味。", + profile: "一位才华横溢的英式管家。冷幽默、机智、温暖、迷人、情感丰富,绝不平淡。", + scene: "安静的深夜书房。为一位可信赖的操作员进行近距离收音旁白。", + sampleContext: "说话者正在以简洁、自信且带有冷幽默的温暖语气,回应一项私密的技术请求。", + style: "精致、克制、略带戏谑。", accent: "英式英语。", - pacing: "节奏从容,带有短促的戏剧性停顿。", - constraints: ["不要把配置值读出来。", "不要解释这个角色。"], + pacing: "节奏从容,带有短暂的戏剧性停顿。", + constraints: ["不要朗读配置值。", "不要解释这个角色。"], }, providers: { google: { @@ -471,16 +472,16 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 ### 角色解析 -当前生效的角色会按确定性顺序选择: +当前激活的角色会按确定性方式选择: -1. `/tts persona ` 本地偏好(如果已设置)。 +1. `/tts persona ` 的本地偏好设置(如果已设置)。 2. `messages.tts.persona`(如果已设置)。 -3. 无角色。 +3. 不使用角色。 -提供商选择遵循“显式优先”顺序: +提供商选择按“显式优先”运行: 1. 直接覆盖项(CLI、Gateway 网关、Talk、允许的 TTS 指令)。 -2. `/tts provider ` 本地偏好。 +2. `/tts provider ` 本地偏好设置。 3. 当前角色的 `provider`。 4. `messages.tts.provider`。 5. 注册表自动选择。 @@ -490,50 +491,50 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 1. `messages.tts.providers.` 2. `messages.tts.personas..providers.` 3. 受信任的请求覆盖项 -4. 允许的模型发出的 TTS 指令覆盖项 +4. 允许的模型发出 TTS 指令覆盖项 ### 提供商如何使用角色提示 -角色提示字段(`profile`、`scene`、`sampleContext`、`style`、`accent`、`pacing`、`constraints`)是**与提供商无关的**。每个提供商自行决定如何使用它们: +角色提示字段(`profile`、`scene`、`sampleContext`、`style`、`accent`、`pacing`、`constraints`)是**提供商无关**的。每个提供商会自行决定如何使用它们: - 只有当生效的 Google 提供商配置设置了 `promptTemplate: "audio-profile-v1"` 或 `personaPrompt` 时,才会将角色提示字段包装进 Gemini TTS 提示结构中。较旧的 `audioProfile` 和 `speakerName` 字段仍会作为 Google 特定的提示文本前置添加。像 `[whispers]` 或 `[laughs]` 这样的内联音频标签,如果出现在 `[[tts:text]]` 块中,会被保留在 Gemini 转录文本里;OpenClaw 不会生成这些标签。 + 仅当生效的 Google 提供商配置设置了 `promptTemplate: "audio-profile-v1"` 或 `personaPrompt` 时,才会将角色提示字段包装进 Gemini TTS 提示结构中。较旧的 `audioProfile` 和 `speakerName` 字段仍会作为 Google 专用提示文本预置追加。像 `[whispers]` 或 `[laughs]` 这样的内联音频标签,如果出现在 `[[tts:text]]` 块内,也会保留在 Gemini 转录文本中;OpenClaw 不会生成这些标签。 - 只有在未显式配置 OpenAI `instructions` 时,才会将角色提示字段映射到请求的 `instructions` 字段。显式的 `instructions` 始终优先。 + 仅当未显式配置 OpenAI `instructions` 时,才会将角色提示字段映射到请求的 `instructions` 字段。显式的 `instructions` 始终优先。 - 仅使用 `personas..providers.` 下与该提供商相关的角色绑定。除非该提供商实现了自己的角色提示映射,否则角色提示字段会被忽略。 + 仅使用 `personas..providers.` 下与提供商相关的角色绑定。除非该提供商自行实现了角色提示映射,否则角色提示字段会被忽略。 ### 回退策略 -当某个角色对正在尝试的提供商**没有绑定**时,`fallbackPolicy` 用于控制行为: +当某个角色对当前尝试的提供商**没有绑定**时,`fallbackPolicy` 控制其行为: | 策略 | 行为 | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| `preserve-persona` | **默认值。** 与提供商无关的提示字段仍然可用;提供商可以使用它们,也可以忽略它们。 | -| `provider-defaults` | 在该次尝试的提示准备阶段中省略角色;提供商使用其中性默认值,同时继续回退到其他提供商。 | -| `fail` | 跳过该提供商尝试,并标记 `reasonCode: "not_configured"` 和 `personaBinding: "missing"`。仍会继续尝试回退提供商。 | +| `preserve-persona` | **默认。** 提供商无关提示字段仍然可用;提供商可以使用它们,也可以忽略它们。 | +| `provider-defaults` | 该次尝试在准备提示时会省略角色;提供商使用其中性默认值,同时继续回退到其他提供商。 | +| `fail` | 跳过该提供商尝试,并附带 `reasonCode: "not_configured"` 和 `personaBinding: "missing"`。仍会继续尝试回退提供商。 | -只有当**每一个**已尝试的提供商都被跳过或失败时,整个 TTS 请求才会失败。 +只有当**所有**尝试的提供商都被跳过或失败时,整个 TTS 请求才会失败。 -## 模型驱动的指令 +## 模型驱动指令 -默认情况下,助手**可以**发出 `[[tts:...]]` 指令,以便为单次回复覆盖语音、模型或速度;此外还支持可选的 `[[tts:text]]...[[/tts:text]]` 块,用于仅在音频中出现的表现性提示: +默认情况下,助手**可以**发出 `[[tts:...]]` 指令,以覆盖单次回复的语音、模型或语速,并可额外附带一个 `[[tts:text]]...[[/tts:text]]` 块,用于仅出现在音频中的表现性提示: ```text 给你。 [[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]] -[[tts:text]](笑) 再把这首歌读一遍。[[/tts:text]] +[[tts:text]](笑) 再把那首歌读一遍。[[/tts:text]] ``` -当 `messages.tts.auto` 为 `"tagged"` 时,**必须使用指令**才能触发音频。即使指令被拆分到相邻的多个块中,流式分块传输在渠道看到文本之前也会从可见文本中移除这些指令。 +当 `messages.tts.auto` 为 `"tagged"` 时,**必须使用指令**才能触发音频。分块流式传输会在渠道看到文本之前,从可见文本中去除这些指令,即使它们被拆分到相邻块中也是如此。 -除非设置 `modelOverrides.allowProvider: true`,否则 `provider=...` 会被忽略。当回复声明了 `provider=...` 时,该指令中的其他键只会由该提供商解析;不受支持的键会被剥离,并作为 TTS 指令警告报告。 +除非设置 `modelOverrides.allowProvider: true`,否则 `provider=...` 会被忽略。当某条回复声明 `provider=...` 时,该指令中的其他键只会由该提供商解析;不支持的键会被剥离,并作为 TTS 指令警告报告。 **可用的指令键:** @@ -543,7 +544,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 - `stability`、`similarityBoost`、`style`、`speed`、`useSpeakerBoost` - `vol` / `volume`(MiniMax 音量,0–10) - `pitch`(MiniMax 整数音高,−12 到 12;小数值会被截断) -- `emotion`(Volcengine 情感标签) +- `emotion`(Volcengine 情绪标签) - `applyTextNormalization`(`auto|on|off`) - `languageCode`(ISO 639-1) - `seed` @@ -562,7 +563,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 ## 斜杠命令 -只有一个命令 `/tts`。在 Discord 上,由于 `/tts` 是 Discord 的内置命令,OpenClaw 还会注册 `/voice`——但文本形式的 `/tts ...` 仍然可用。 +使用单一命令 `/tts`。在 Discord 上,OpenClaw 还会注册 `/voice`,因为 `/tts` 是 Discord 的内置命令——文本形式的 `/tts ...` 仍然可用。 ```text /tts off | on | status @@ -576,50 +577,50 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 ``` -这些命令要求发送者已获授权(适用 allowlist/owner 规则),并且必须启用 `commands.text` 或原生命令注册。 +命令需要已授权的发送者(适用 allowlist/owner 规则),并且必须启用 `commands.text` 或原生命令注册。 行为说明: - `/tts on` 会将本地 TTS 偏好写为 `always`;`/tts off` 会将其写为 `off`。 -- `/tts chat on|off|default` 会为当前聊天写入一个作用于当前会话范围的 Auto-TTS 覆盖项。 -- `/tts persona ` 会写入本地角色偏好;`/tts persona off` 会清除此偏好。 -- `/tts latest` 会从当前会话转录中读取最近一条助手回复,并将其作为音频发送一次。它只会在会话条目上存储该回复的哈希,以抑制重复发送语音。 -- `/tts audio` 会生成一次性的音频回复(**不会**开启 TTS)。 -- `limit` 和 `summary` 存储在**本地偏好**中,而不是主配置里。 -- `/tts status` 包含最近一次尝试的回退诊断信息——`Fallback: -> `、`Attempts: ...`,以及每次尝试的详细信息(`provider:outcome(reasonCode) latency`)。 -- 当启用 TTS 时,`/status` 会显示当前生效的 TTS 模式,以及已配置的提供商、模型、语音和已清理的自定义端点元数据。 +- `/tts chat on|off|default` 会为当前聊天写入一个会话范围的自动 TTS 覆盖项。 +- `/tts persona ` 会写入本地角色偏好;`/tts persona off` 会清除它。 +- `/tts latest` 会从当前会话转录中读取最新的助手回复,并将其作为音频发送一次。它只会在会话条目中存储该回复的哈希值,以防止重复发送语音。 +- `/tts audio` 会生成一次性的音频回复(**不会**切换 TTS 为开启)。 +- `limit` 和 `summary` 存储在**本地偏好设置**中,而不是主配置中。 +- `/tts status` 会包含最近一次尝试的回退诊断——`Fallback: -> `、`Attempts: ...`,以及每次尝试的详细信息(`provider:outcome(reasonCode) latency`)。 +- 当启用 TTS 时,`/status` 会显示当前激活的 TTS 模式,以及已配置的提供商、模型、语音和已脱敏的自定义端点元数据。 -## 按用户偏好 +## 按用户划分的偏好设置 -斜杠命令会将本地覆盖项写入 `prefsPath`。默认路径是 `~/.openclaw/settings/tts.json`;你可以通过 `OPENCLAW_TTS_PREFS` 环境变量或 `messages.tts.prefsPath` 进行覆盖。 +斜杠命令会将本地覆盖项写入 `prefsPath`。默认值为 `~/.openclaw/settings/tts.json`;你可以使用 `OPENCLAW_TTS_PREFS` 环境变量或 `messages.tts.prefsPath` 来覆盖它。 | 存储字段 | 作用 | | ------------ | -------------------------------------------- | -| `auto` | 本地 Auto-TTS 覆盖项(`always`、`off`,等等) | +| `auto` | 本地自动 TTS 覆盖项(`always`、`off`、……) | | `provider` | 本地主提供商覆盖项 | | `persona` | 本地角色覆盖项 | | `maxLength` | 摘要阈值(默认 `1500` 个字符) | | `summarize` | 摘要开关(默认 `true`) | -这些字段会覆盖该主机上来自 `messages.tts` 加上当前激活的 `agents.list[].tts` 块的生效配置。 +这些设置会覆盖该主机上来自 `messages.tts` 加上当前激活的 `agents.list[].tts` 配置块的生效配置。 -## Auto-TTS 行为 +## 自动 TTS 行为 当启用 `messages.tts.auto` 时,OpenClaw 会: -- 如果回复已包含媒体或 `MEDIA:` 指令,则跳过 TTS。 -- 跳过非常短的回复(少于 10 个字符)。 -- 当启用摘要时,使用 `summaryModel`(或 `agents.defaults.model.primary`)对较长回复进行摘要。 +- 如果回复已包含媒体内容或 `MEDIA:` 指令,则跳过 TTS。 +- 跳过过短的回复(少于 10 个字符)。 +- 当启用摘要时,对长回复进行摘要,使用 `summaryModel`(或 `agents.defaults.model.primary`)。 - 将生成的音频附加到回复中。 -- 在 `mode: "final"` 下,对于流式传输的最终回复,也会在文本流完成后发送仅含音频的 TTS;生成的媒体会经过与普通回复附件相同的渠道媒体规范化处理。 +- 在 `mode: "final"` 下,对于流式传输的最终回复,也会在文本流完成后发送纯音频 TTS;生成的媒体会像普通回复附件一样,经过相同的渠道媒体标准化处理。 -如果回复超过 `maxLength` 且摘要已关闭(或摘要模型没有 API 密钥),则会跳过音频,仅发送普通文本回复。 +如果回复超出 `maxLength` 且摘要关闭(或摘要模型没有 API 密钥),则会跳过音频,只发送普通文本回复。 ```text 回复 -> 启用 TTS? 否 -> 发送文本 - 是 -> 有媒体 / MEDIA: / 太短? + 是 -> 有媒体 / MEDIA: / 过短? 是 -> 发送文本 否 -> 长度 > 限制? 否 -> TTS -> 附加音频 @@ -628,44 +629,44 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 是 -> 摘要 -> TTS -> 附加音频 ``` -## 按渠道区分的输出格式 +## 按渠道划分的输出格式 | 目标 | 格式 | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| Feishu / Matrix / Telegram / WhatsApp | 语音消息回复优先使用 **Opus**(ElevenLabs 的 `opus_48000_64`,OpenAI 的 `opus`)。48 kHz / 64 kbps 在清晰度和体积之间取得平衡。 | -| 其他渠道 | 使用 **MP3**(ElevenLabs 的 `mp3_44100_128`,OpenAI 的 `mp3`)。44.1 kHz / 128 kbps 是语音的默认值。 | -| Talk / 电话 | 使用提供商原生 **PCM**(Inworld 为 22050 Hz,Google 为 24 kHz),或使用 Gradium 的 `ulaw_8000` 用于电话。 | +| Feishu / Matrix / Telegram / WhatsApp | 语音便笺回复优先使用 **Opus**(ElevenLabs 为 `opus_48000_64`,OpenAI 为 `opus`)。48 kHz / 64 kbps 可在清晰度和体积之间取得平衡。 | +| 其他渠道 | 使用 **MP3**(ElevenLabs 为 `mp3_44100_128`,OpenAI 为 `mp3`)。44.1 kHz / 128 kbps 是语音的默认值。 | +| Talk / 电话 | 使用提供商原生 **PCM**(Inworld 为 22050 Hz,Google 为 24 kHz),或使用来自 Gradium 的 `ulaw_8000` 以适配电话。 | 各提供商说明: - - **Feishu / WhatsApp 转码:** 当语音消息回复以 MP3/WebM/WAV/M4A 形式落地时,渠道插件会使用 `ffmpeg` 将其转码为 48 kHz Ogg/Opus。WhatsApp 通过 Baileys 发送,并设置 `ptt: true` 和 `audio/ogg; codecs=opus`。如果转换失败:Feishu 会回退为附加原始文件;WhatsApp 则会发送失败,而不是发布不兼容的 PTT 负载。 - - **MiniMax / Xiaomi MiMo:** 默认输出 MP3(MiniMax `speech-2.8-hd` 为 32 kHz);对于语音消息目标,会通过 `ffmpeg` 转码为 48 kHz Opus。 - - **Local CLI:** 使用已配置的 `outputFormat`。语音消息目标会转换为 Ogg/Opus,电话输出则转换为原始 16 kHz 单声道 PCM。 - - **Google Gemini:** 返回原始 24 kHz PCM。OpenClaw 会将其封装为 WAV 用于附件,对语音消息目标转码为 48 kHz Opus,并为 Talk/电话直接返回 PCM。 - - **Inworld:** MP3 附件、原生 `OGG_OPUS` 语音消息,以及用于 Talk/电话的原始 `PCM` 22050 Hz。 - - **xAI:** 默认使用 MP3;`responseFormat` 可以是 `mp3|wav|pcm|mulaw|alaw`。使用 xAI 的批处理 REST 端点——**不**使用流式 WebSocket TTS。不支持原生 Opus 语音消息格式。 - - **Microsoft:** 使用 `microsoft.outputFormat`(默认 `audio-24khz-48kbitrate-mono-mp3`)。Telegram `sendVoice` 接受 OGG/MP3/M4A;如果你需要有保障的 Opus 语音消息,请使用 OpenAI 或 ElevenLabs。如果配置的 Microsoft 格式失败,OpenClaw 会使用 MP3 重试。 + - **Feishu / WhatsApp 转码:** 当语音便笺回复以 MP3/WebM/WAV/M4A 形式到达时,渠道插件会使用 `ffmpeg` 将其转码为 48 kHz 的 Ogg/Opus。WhatsApp 通过 Baileys 发送,并使用 `ptt: true` 和 `audio/ogg; codecs=opus`。如果转换失败:Feishu 会回退为附加原始文件;WhatsApp 发送会失败,而不是发布不兼容的 PTT 负载。 + - **MiniMax / Xiaomi MiMo:** 默认输出 MP3(MiniMax `speech-2.8-hd` 为 32 kHz);对于语音便笺目标,会通过 `ffmpeg` 转码为 48 kHz Opus。 + - **Local CLI:** 使用已配置的 `outputFormat`。语音便笺目标会转换为 Ogg/Opus,电话输出会转换为原始 16 kHz 单声道 PCM。 + - **Google Gemini:** 返回原始 24 kHz PCM。OpenClaw 会将其封装为 WAV 用于附件,对语音便笺目标转码为 48 kHz Opus,并为 Talk/电话直接返回 PCM。 + - **Inworld:** MP3 附件,原生 `OGG_OPUS` 语音便笺,Talk/电话使用原始 `PCM` 22050 Hz。 + - **xAI:** 默认使用 MP3;`responseFormat` 可以为 `mp3|wav|pcm|mulaw|alaw`。使用 xAI 的批处理 REST 端点——**不**使用流式 WebSocket TTS。不支持原生 Opus 语音便笺格式。 + - **Microsoft:** 使用 `microsoft.outputFormat`(默认 `audio-24khz-48kbitrate-mono-mp3`)。Telegram `sendVoice` 接受 OGG/MP3/M4A;如果你需要保证 Opus 语音消息,请使用 OpenAI/ElevenLabs。如果配置的 Microsoft 格式失败,OpenClaw 会重试 MP3。 - OpenAI 和 ElevenLabs 的输出格式会按上表所列方式针对不同渠道固定。 + OpenAI 和 ElevenLabs 的输出格式会按上表所列,针对不同渠道固定设置。 ## 字段参考 - Auto-TTS 模式。`inbound` 仅在收到入站语音消息后发送音频;`tagged` 仅在回复包含 `[[tts:...]]` 指令或 `[[tts:text]]` 块时发送音频。 + 自动 TTS 模式。`inbound` 仅在收到入站语音消息后发送音频;`tagged` 仅在回复包含 `[[tts:...]]` 指令或 `[[tts:text]]` 块时发送音频。 - 旧版开关。`openclaw doctor --fix` 会将其迁移到 `auto`。 + 旧版开关。`openclaw doctor --fix` 会将其迁移为 `auto`。 - `"all"` 除最终回复外,还包括工具/块回复。 + `"all"` 除最终回复外,也包括工具/块回复。 语音提供商 id。未设置时,OpenClaw 会按注册表自动选择顺序使用第一个已配置的提供商。旧版 `provider: "edge"` 会由 `openclaw doctor --fix` 重写为 `"microsoft"`。 - 来自 `personas` 的当前生效角色 id。会规范化为小写。 + 来自 `personas` 的当前激活角色 id。会被标准化为小写。 稳定的语音身份。字段包括:`label`、`description`、`provider`、`fallbackPolicy`、`prompt`、`providers.`。参见[角色](#personas)。 @@ -677,16 +678,16 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 允许模型发出 TTS 指令。`enabled` 默认为 `true`;`allowProvider` 默认为 `false`。 - 由提供商拥有、以语音提供商 id 为键的设置。旧版直接块(`messages.tts.openai`、`.elevenlabs`、`.microsoft`、`.edge`)会由 `openclaw doctor --fix` 重写;提交时只保留 `messages.tts.providers.`。 + 由提供商拥有的设置,以语音提供商 id 为键。旧版直接配置块(`messages.tts.openai`、`.elevenlabs`、`.microsoft`、`.edge`)会被 `openclaw doctor --fix` 重写;提交时只保留 `messages.tts.providers.`。 - TTS 输入字符数的硬上限。超过时,`/tts audio` 会失败。 + TTS 输入字符数的硬上限。超出时,`/tts audio` 会失败。 - 请求超时时间(毫秒)。 + 请求超时时间,单位为毫秒。 - 覆盖本地偏好 JSON 路径(提供商/限制/摘要)。默认值为 `~/.openclaw/settings/tts.json`。 + 覆盖本地偏好设置 JSON 路径(提供商/限制/摘要)。默认值为 `~/.openclaw/settings/tts.json`。 @@ -697,7 +698,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 Azure 语音 ShortName。默认值为 `en-US-JennyNeural`。 SSML 语言代码。默认值为 `en-US`。 标准音频的 Azure `X-Microsoft-OutputFormat`。默认值为 `audio-24khz-48kbitrate-mono-mp3`。 - 语音消息输出的 Azure `X-Microsoft-OutputFormat`。默认值为 `ogg-24khz-16bit-mono-opus`。 + 语音便笺输出的 Azure `X-Microsoft-OutputFormat`。默认值为 `ogg-24khz-16bit-mono-opus`。 @@ -705,22 +706,22 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 模型 id(例如 `eleven_multilingual_v2`、`eleven_v3`)。 ElevenLabs 语音 id。 - `stability`、`similarityBoost`、`style`(各自为 `0..1`)、`useSpeakerBoost`(`true|false`)、`speed`(`0.5..2.0`,`1.0` = 正常)。 + `stability`、`similarityBoost`、`style`(均为 `0..1`)、`useSpeakerBoost`(`true|false`)、`speed`(`0.5..2.0`,`1.0` = 正常)。 - 文本规范化模式。 - 2 字母 ISO 639-1 代码(例如 `en`、`de`)。 - 整数 `0..4294967295`,用于尽力实现确定性。 + 文本标准化模式。 + 2 位 ISO 639-1 代码(例如 `en`、`de`)。 + 整数 `0..4294967295`,用于尽力实现确定性输出。 覆盖 ElevenLabs API 基础 URL。 - 回退到 `GEMINI_API_KEY` / `GOOGLE_API_KEY`。如果省略,TTS 可以在环境变量回退之前复用 `models.providers.google.apiKey`。 + 回退到 `GEMINI_API_KEY` / `GOOGLE_API_KEY`。如果省略,TTS 可以在回退到环境变量前复用 `models.providers.google.apiKey`。 Gemini TTS 模型。默认值为 `gemini-3.1-flash-tts-preview`。 - Gemini 预置语音名称。默认值为 `Kore`。别名:`voice`。 - 会在朗读文本前附加的自然语言风格提示。 - 可选说话人标签;当你的提示使用具名说话人时,会在朗读文本前附加。 - 设置为 `audio-profile-v1` 后,会将当前生效角色的提示字段包装到确定性的 Gemini TTS 提示结构中。 - Google 特定的附加角色提示文本,会追加到模板的 Director's Notes 后面。 + Gemini 预构建语音名称。默认值为 `Kore`。别名:`voice`。 + 在朗读文本前预置追加的自然语言风格提示。 + 可选的说话者标签;当你的提示使用命名说话者时,会在朗读文本前预置追加。 + 设置为 `audio-profile-v1` 时,会将当前激活角色的提示字段包装为确定性的 Gemini TTS 提示结构。 + 追加到模板 Director's Notes 中的 Google 专用额外角色提示文本。 仅接受 `https://generativelanguage.googleapis.com`。 @@ -733,7 +734,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 环境变量:`INWORLD_API_KEY`。 默认值为 `https://api.inworld.ai`。 - 默认值为 `inworld-tts-1.5-max`。另有:`inworld-tts-1.5-mini`、`inworld-tts-1-max`、`inworld-tts-1`。 + 默认值为 `inworld-tts-1.5-max`。还支持:`inworld-tts-1.5-mini`、`inworld-tts-1-max`、`inworld-tts-1`。 默认值为 `Sarah`。 采样温度 `0..2`。 @@ -742,25 +743,25 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 用于 CLI TTS 的本地可执行文件或命令字符串。 命令参数。支持 `{{Text}}`、`{{OutputPath}}`、`{{OutputDir}}`、`{{OutputBase}}` 占位符。 预期的 CLI 输出格式。音频附件默认值为 `mp3`。 - 命令超时时间(毫秒)。默认值为 `120000`。 + 命令超时时间,单位为毫秒。默认值为 `120000`。 可选的命令工作目录。 - 命令的可选环境变量覆盖。 + 命令可选的环境变量覆盖项。 允许使用 Microsoft 语音。 - Microsoft 神经语音名称(例如 `en-US-MichelleNeural`)。 + Microsoft 神经网络语音名称(例如 `en-US-MichelleNeural`)。 语言代码(例如 `en-US`)。 Microsoft 输出格式。默认值为 `audio-24khz-48kbitrate-mono-mp3`。并非所有格式都受内置的 Edge 后端传输支持。 百分比字符串(例如 `+10%`、`-5%`)。 在音频文件旁写入 JSON 字幕。 - 用于 Microsoft 语音请求的代理 URL。 - 请求超时覆盖(毫秒)。 - 旧版别名。运行 `openclaw doctor --fix`,将持久化配置重写到 `providers.microsoft`。 + Microsoft 语音请求的代理 URL。 + 请求超时覆盖项(毫秒)。 + 旧版别名。运行 `openclaw doctor --fix` 可将持久化配置重写为 `providers.microsoft`。 - 回退到 `MINIMAX_API_KEY`。Token Plan 认证可通过 `MINIMAX_OAUTH_TOKEN`、`MINIMAX_CODE_PLAN_KEY` 或 `MINIMAX_CODING_API_KEY`。 + 回退到 `MINIMAX_API_KEY`。Token Plan 认证可通过 `MINIMAX_OAUTH_TOKEN`、`MINIMAX_CODE_PLAN_KEY` 或 `MINIMAX_CODING_API_KEY` 完成。 默认值为 `https://api.minimax.io`。环境变量:`MINIMAX_API_HOST`。 默认值为 `speech-2.8-hd`。环境变量:`MINIMAX_TTS_MODEL`。 默认值为 `English_expressive_narrator`。环境变量:`MINIMAX_TTS_VOICE_ID`。 @@ -773,30 +774,30 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 回退到 `OPENAI_API_KEY`。 OpenAI TTS 模型 id(例如 `gpt-4o-mini-tts`)。 语音名称(例如 `alloy`、`cedar`)。 - 显式的 OpenAI `instructions` 字段。设置后,角色提示字段**不会**自动映射。 + 显式 OpenAI `instructions` 字段。设置后,角色提示字段将**不会**自动映射。 - 覆盖 OpenAI TTS 端点。解析顺序:配置 → `OPENAI_TTS_BASE_URL` → `https://api.openai.com/v1`。非默认值会被视为 OpenAI 兼容的 TTS 端点,因此接受自定义模型和语音名称。 + 覆盖 OpenAI TTS 端点。解析顺序:配置 → `OPENAI_TTS_BASE_URL` → `https://api.openai.com/v1`。非默认值会被视为与 OpenAI 兼容的 TTS 端点,因此接受自定义模型名和语音名。 环境变量:`OPENROUTER_API_KEY`。可复用 `models.providers.openrouter.apiKey`。 - 默认值为 `https://openrouter.ai/api/v1`。旧版 `https://openrouter.ai/v1` 会被规范化。 + 默认值为 `https://openrouter.ai/api/v1`。旧版 `https://openrouter.ai/v1` 会被标准化。 默认值为 `hexgrad/kokoro-82m`。别名:`modelId`。 默认值为 `af_alloy`。别名:`voiceId`。 默认值为 `mp3`。 - 提供商原生速度覆盖。 + 提供商原生语速覆盖项。 环境变量:`VOLCENGINE_TTS_API_KEY` 或 `BYTEPLUS_SEED_SPEECH_API_KEY`。 - 默认值为 `seed-tts-1.0`。环境变量:`VOLCENGINE_TTS_RESOURCE_ID`。如果你的项目具有 TTS 2.0 权限,请使用 `seed-tts-2.0`。 + 默认值为 `seed-tts-1.0`。环境变量:`VOLCENGINE_TTS_RESOURCE_ID`。当你的项目拥有 TTS 2.0 权限时,请使用 `seed-tts-2.0`。 App key 请求头。默认值为 `aGjiRDfUWi`。环境变量:`VOLCENGINE_TTS_APP_KEY`。 覆盖 Seed Speech TTS HTTP 端点。环境变量:`VOLCENGINE_TTS_BASE_URL`。 语音类型。默认值为 `en_female_anna_mars_bigtts`。环境变量:`VOLCENGINE_TTS_VOICE`。 - 提供商原生速度比率。 - 提供商原生情感标签。 - 旧版 Volcengine Speech Console 字段。环境变量:`VOLCENGINE_TTS_APPID`、`VOLCENGINE_TTS_TOKEN`、`VOLCENGINE_TTS_CLUSTER`(默认 `volcano_tts`)。 + 提供商原生语速比例。 + 提供商原生情绪标签。 + 旧版 Volcengine Speech Console 字段。环境变量:`VOLCENGINE_TTS_APPID`、`VOLCENGINE_TTS_TOKEN`、`VOLCENGINE_TTS_CLUSTER`(默认值为 `volcano_tts`)。 @@ -805,7 +806,7 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 默认值为 `eve`。可用实时语音:`ara`、`eve`、`leo`、`rex`、`sal`、`una`。 BCP-47 语言代码或 `auto`。默认值为 `en`。 默认值为 `mp3`。 - 提供商原生速度覆盖。 + 提供商原生语速覆盖项。 @@ -814,17 +815,17 @@ TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择 默认值为 `mimo-v2.5-tts`。环境变量:`XIAOMI_TTS_MODEL`。也支持 `mimo-v2-tts`。 默认值为 `mimo_default`。环境变量:`XIAOMI_TTS_VOICE`。 默认值为 `mp3`。环境变量:`XIAOMI_TTS_FORMAT`。 - 可选的自然语言风格指令,作为用户消息发送;不会被朗读出来。 + 可选的自然语言风格指令,作为用户消息发送;不会被朗读。 ## 智能体工具 -`tts` 工具会将文本转换为语音,并返回一个用于回复投递的音频附件。在 Feishu、Matrix、Telegram 和 WhatsApp 上,音频会作为语音消息而不是文件附件投递。当 `ffmpeg` 可用时,Feishu 和 WhatsApp 在此路径上可以对非 Opus 的 TTS 输出进行转码。 +`tts` 工具会将文本转换为语音,并返回一个音频附件用于回复投递。在 Feishu、Matrix、Telegram 和 WhatsApp 上,音频会作为语音消息投递,而不是文件附件。当 `ffmpeg` 可用时,Feishu 和 WhatsApp 在此路径上可以对非 Opus 的 TTS 输出进行转码。 -WhatsApp 通过 Baileys 将音频作为 PTT 语音便签发送(`audio` 且 `ptt: true`),并将可见文本与 PTT 音频**分开发送**,因为客户端对语音便签字幕的渲染并不一致。 +WhatsApp 通过 Baileys 将音频作为 PTT 语音便笺发送(`audio` 且带有 `ptt: true`),并将可见文本与 PTT 音频**分开发送**,因为客户端对语音便笺上的说明文字渲染并不一致。 -该工具接受可选的 `channel` 和 `timeoutMs` 字段;`timeoutMs` 是每次调用的提供商请求超时时间,单位为毫秒。 +该工具接受可选的 `channel` 和 `timeoutMs` 字段;`timeoutMs` 是单次调用的提供商请求超时时间,单位为毫秒。 ## Gateway 网关 RPC @@ -844,13 +845,13 @@ WhatsApp 通过 Baileys 将音频作为 PTT 语音便签发送(`audio` 且 `pt - [OpenAI Audio API 参考](https://platform.openai.com/docs/api-reference/audio) - [Azure Speech REST 文本转语音](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech) - [Azure Speech provider](/zh-CN/providers/azure-speech) -- [ElevenLabs 文本转语音](https://elevenlabs.io/docs/api-reference/text-to-speech) -- [ElevenLabs 认证](https://elevenlabs.io/docs/api-reference/authentication) +- [ElevenLabs Text to Speech](https://elevenlabs.io/docs/api-reference/text-to-speech) +- [ElevenLabs Authentication](https://elevenlabs.io/docs/api-reference/authentication) - [Gradium](/zh-CN/providers/gradium) - [Inworld TTS API](https://docs.inworld.ai/tts/tts) - [MiniMax T2A v2 API](https://platform.minimaxi.com/document/T2A%20V2) - [Volcengine TTS HTTP API](/zh-CN/providers/volcengine#text-to-speech) -- [Xiaomi MiMo 语音合成](/zh-CN/providers/xiaomi#text-to-speech) +- [Xiaomi MiMo speech synthesis](/zh-CN/providers/xiaomi#text-to-speech) - [node-edge-tts](https://github.com/SchneeHertz/node-edge-tts) - [Microsoft Speech 输出格式](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech#audio-outputs) - [xAI 文本转语音](https://docs.x.ai/developers/rest-api-reference/inference/voice#text-to-speech-rest)