diff --git a/docs/zh-CN/tools/tts.md b/docs/zh-CN/tools/tts.md index e1dc5ff6c..46891213a 100644 --- a/docs/zh-CN/tools/tts.md +++ b/docs/zh-CN/tools/tts.md @@ -1,111 +1,115 @@ --- read_when: - 为回复启用文本转语音 - - 配置 TTS 提供商或限制 - - 使用 `/tts` 命令 -summary: 用于外发回复的文本转语音(TTS) + - 配置 TTS 提供商、回退链或音色角色 + - 使用 `/tts` 命令或指令 +summary: 用于外发回复的文本转语音——提供商、音色角色、斜杠命令,以及按渠道划分的输出 title: 文本转语音 x-i18n: - generated_at: "2026-04-26T04:25:31Z" + generated_at: "2026-04-26T05:03:49Z" model: gpt-5.4 provider: openai - source_hash: 4ce80ec3a07cd87d719a5aae892717da24b55c4ce58c68f302ec5941499613bb + source_hash: a1034592bfea99395133f07e6e629088ecb4a22d737028681006d897a10df157 source_path: tools/tts.md workflow: 15 --- -OpenClaw 可以使用 Azure Speech、ElevenLabs、Google Gemini、Gradium、Inworld、Local CLI、Microsoft、MiniMax、OpenAI、Volcengine、Vydra、xAI 或 Xiaomi MiMo 将外发回复转换为音频。 -它适用于 OpenClaw 能发送音频的任何地方。 +OpenClaw 可以将外发回复转换为音频,支持 **13 种语音提供商**,并在 Feishu、Matrix、Telegram 和 WhatsApp 上发送原生语音消息,在其他所有地方发送音频附件,并为电话和 Talk 提供 PCM/Ulaw 流。 -## 支持的服务 +## 快速开始 -- **Azure Speech**(主要或回退提供商;使用 Azure AI Speech REST API) -- **ElevenLabs**(主要或回退提供商) -- **Google Gemini**(主要或回退提供商;使用 Gemini API TTS) -- **Gradium**(主要或回退提供商;支持语音笔记和电话输出) -- **Inworld**(主要或回退提供商;使用 Inworld 流式 TTS API) -- **Local CLI**(主要或回退提供商;运行已配置的本地 TTS 命令) -- **Microsoft**(主要或回退提供商;当前内置实现使用 `node-edge-tts`) -- **MiniMax**(主要或回退提供商;使用 T2A v2 API) -- **OpenAI**(主要或回退提供商;也用于摘要) -- **Volcengine**(主要或回退提供商;使用 BytePlus Seed Speech HTTP API) -- **Vydra**(主要或回退提供商;共享图像、视频和语音提供商) -- **xAI**(主要或回退提供商;使用 xAI TTS API) -- **Xiaomi MiMo**(主要或回退提供商;通过 Xiaomi chat completions 使用 MiMo TTS) + + + OpenAI 和 ElevenLabs 是最可靠的托管选项。Microsoft 和 Local CLI 无需 API 密钥即可使用。完整列表请参阅[提供商矩阵](#supported-providers)。 + + + 为你的提供商导出环境变量(例如 `OPENAI_API_KEY`、`ELEVENLABS_API_KEY`)。Microsoft 和 Local CLI 不需要密钥。 + + + 设置 `messages.tts.auto: "always"` 和 `messages.tts.provider`: -### Microsoft 语音说明 + ```json5 + { + messages: { + tts: { + auto: "always", + provider: "elevenlabs", + }, + }, + } + ``` -内置的 Microsoft 语音提供商当前通过 `node-edge-tts` 库使用 Microsoft Edge 的在线神经 TTS 服务。它是托管服务(不是本地服务),使用 Microsoft 端点,并且不需要 API 密钥。 -`node-edge-tts` 提供语音配置选项和输出格式,但并非所有选项都受该服务支持。使用 `edge` 的旧版配置和指令输入仍然有效,并会被标准化为 `microsoft`。 + + + `/tts status` 会显示当前状态。`/tts audio Hello from OpenClaw` 会发送一次性的音频回复。 + + -由于此路径是一个没有公开 SLA 或配额说明的公共 Web 服务,应将其视为“尽力而为”。如果你需要有保障的限制和支持,请使用 OpenAI 或 ElevenLabs。 + +默认情况下,自动 TTS **关闭**。当未设置 `messages.tts.provider` 时,OpenClaw 会按注册表自动选择顺序挑选第一个已配置的提供商。 + -## 可选键 +## 支持的提供商 -如果你要使用 Azure Speech、ElevenLabs、Google Gemini、Gradium、Inworld、MiniMax、OpenAI、Volcengine、Vydra、xAI 或 Xiaomi MiMo: +| 提供商 | 认证 | 说明 | +| ----------------- | ---------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| **OpenAI** | `OPENAI_API_KEY` | 也用于自动摘要;支持音色角色 `instructions`。 | +| **ElevenLabs** | `ELEVENLABS_API_KEY` 或 `XI_API_KEY` | 支持语音克隆、多语言,并可通过 `seed` 实现确定性。 | +| **Google Gemini** | `GEMINI_API_KEY` 或 `GOOGLE_API_KEY` | Gemini API TTS;可通过 `promptTemplate: "audio-profile-v1"` 感知音色角色。 | +| **Azure Speech** | `AZURE_SPEECH_KEY` + `AZURE_SPEECH_REGION`(也支持 `AZURE_SPEECH_API_KEY`、`SPEECH_KEY`、`SPEECH_REGION`) | 原生 Ogg/Opus 语音便笺输出和电话支持。 | +| **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`。 | +| **Inworld** | `INWORLD_API_KEY` | 流式 TTS API。原生 Opus 语音便笺和 PCM 电话支持。 | +| **xAI** | `XAI_API_KEY` | xAI 批量 TTS。**不**支持原生 Opus 语音便笺。 | +| **Volcengine** | `VOLCENGINE_TTS_API_KEY` 或 `BYTEPLUS_SEED_SPEECH_API_KEY`(旧版 AppID/token:`VOLCENGINE_TTS_APPID`/`_TOKEN`) | BytePlus Seed Speech HTTP API。 | +| **Xiaomi MiMo** | `XIAOMI_API_KEY` | 通过 Xiaomi chat completions 提供 MiMo TTS。 | +| **OpenRouter** | `OPENROUTER_API_KEY`(可复用 `models.providers.openrouter.apiKey`) | 默认模型为 `hexgrad/kokoro-82m`。 | +| **Gradium** | `GRADIUM_API_KEY` | 支持语音便笺和电话输出。 | +| **Vydra** | `VYDRA_API_KEY` | 共享的图像、视频和语音提供商。 | +| **Local CLI** | 无 | 运行已配置的本地 TTS 命令。 | -- `AZURE_SPEECH_KEY` 加 `AZURE_SPEECH_REGION`(也接受 `AZURE_SPEECH_API_KEY`、`SPEECH_KEY` 和 `SPEECH_REGION`) -- `ELEVENLABS_API_KEY`(或 `XI_API_KEY`) -- `GEMINI_API_KEY`(或 `GOOGLE_API_KEY`) -- `GRADIUM_API_KEY` -- `INWORLD_API_KEY` -- `MINIMAX_API_KEY`;MiniMax TTS 也接受通过 `MINIMAX_OAUTH_TOKEN`、`MINIMAX_CODE_PLAN_KEY` 或 `MINIMAX_CODING_API_KEY` 提供的 Token Plan 认证 -- `OPENAI_API_KEY` -- `VOLCENGINE_TTS_API_KEY`(或 `BYTEPLUS_SEED_SPEECH_API_KEY`);旧版 AppID/token 认证也接受 `VOLCENGINE_TTS_APPID` 和 `VOLCENGINE_TTS_TOKEN` -- `VYDRA_API_KEY` -- `XAI_API_KEY` -- `XIAOMI_API_KEY` +如果配置了多个提供商,会优先使用所选提供商,其他提供商则作为回退选项。自动摘要使用 `summaryModel`(或 `agents.defaults.model.primary`),因此如果你保持摘要启用状态,该提供商也必须完成认证。 -Local CLI 和 Microsoft 语音**不**需要 API 密钥。 - -如果配置了多个提供商,将优先使用已选提供商,其余提供商作为回退选项。 -自动摘要使用已配置的 `summaryModel`(或 `agents.defaults.model.primary`),因此如果你启用摘要,该提供商也必须已完成认证。 - -## 服务链接 - -- [OpenAI Text-to-Speech guide](https://platform.openai.com/docs/guides/text-to-speech) -- [OpenAI Audio API reference](https://platform.openai.com/docs/api-reference/audio) -- [Azure Speech REST text-to-speech](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech) -- [Azure Speech provider](/zh-CN/providers/azure-speech) -- [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 speech synthesis](/zh-CN/providers/xiaomi#text-to-speech) -- [node-edge-tts](https://github.com/SchneeHertz/node-edge-tts) -- [Microsoft Speech output formats](https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech#audio-outputs) -- [xAI Text to Speech](https://docs.x.ai/developers/rest-api-reference/inference/voice#text-to-speech-rest) - -## 默认启用吗? - -不是。自动 TTS 默认**关闭**。可在配置中通过 `messages.tts.auto` 启用,或在本地使用 `/tts on` 启用。 - -当未设置 `messages.tts.provider` 时,OpenClaw 会按照注册表自动选择顺序,挑选第一个已配置的语音提供商。 + +内置的 **Microsoft** 提供商通过 `node-edge-tts` 使用 Microsoft Edge 的在线神经网络 TTS 服务。 +这是一个公开的 Web 服务,没有公开的 SLA 或配额——请将其视为尽力而为的服务。旧版提供商 id `edge` 会被规范化为 `microsoft`,并且 `openclaw doctor --fix` 会重写持久化配置;新配置应始终使用 `microsoft`。 + ## 配置 -TTS 配置位于 `openclaw.json` 中的 `messages.tts` 下。 -完整 schema 见 [Gateway 网关配置](/zh-CN/gateway/configuration)。 - -### 最小配置(启用 + 提供商) +TTS 配置位于 `~/.openclaw/openclaw.json` 中的 `messages.tts` 下。选择一个预设并调整提供商配置块: + + ```json5 { messages: { tts: { auto: "always", - provider: "elevenlabs", + provider: "openai", + summaryModel: "openai/gpt-4.1-mini", + modelOverrides: { enabled: true }, + providers: { + openai: { + apiKey: "${OPENAI_API_KEY}", + model: "gpt-4o-mini-tts", + voice: "alloy", + }, + elevenlabs: { + apiKey: "${ELEVENLABS_API_KEY}", + model: "eleven_multilingual_v2", + voiceId: "EXAVITQu4vr4xnSDxMaL", + voiceSettings: { stability: 0.5, similarityBoost: 0.75, style: 0.0, useSpeakerBoost: true, speed: 1.0 }, + applyTextNormalization: "auto", + languageCode: "en", + }, + }, }, }, } ``` - -### 每个智能体的语音覆盖 - -当某个智能体需要使用不同的提供商、声音、模型、风格或自动 TTS 模式时,使用 `agents.list[].tts`。该智能体块会在 `messages.tts` 之上执行深度合并,因此提供商凭证可以保留在全局提供商配置中。 - + + ```json5 { messages: { @@ -116,77 +120,37 @@ TTS 配置位于 `openclaw.json` 中的 `messages.tts` 下。 elevenlabs: { apiKey: "${ELEVENLABS_API_KEY}", model: "eleven_multilingual_v2", + voiceId: "EXAVITQu4vr4xnSDxMaL", }, }, }, }, - agents: { - list: [ - { - id: "reader", - tts: { - providers: { - elevenlabs: { - voiceId: "EXAVITQu4vr4xnSDxMaL", - }, - }, - }, - }, - ], - }, } ``` - -自动回复、`/tts audio`、`/tts status` 以及 `tts` 智能体工具的优先级如下: - -1. `messages.tts` -2. 当前激活的 `agents.list[].tts` -3. 此主机的本地 `/tts` 偏好设置 -4. 启用模型覆盖时的内联 `[[tts:...]]` 指令 - -### 以 OpenAI 为主,ElevenLabs 为回退 - + + ```json5 { messages: { tts: { auto: "always", - provider: "openai", - summaryModel: "openai/gpt-4.1-mini", - modelOverrides: { - enabled: true, - }, + provider: "google", providers: { - openai: { - apiKey: "openai_api_key", - baseUrl: "https://api.openai.com/v1", - model: "gpt-4o-mini-tts", - voice: "alloy", - }, - elevenlabs: { - apiKey: "elevenlabs_api_key", - baseUrl: "https://api.elevenlabs.io", - voiceId: "voice_id", - modelId: "eleven_multilingual_v2", - seed: 42, - applyTextNormalization: "auto", - languageCode: "en", - voiceSettings: { - stability: 0.5, - similarityBoost: 0.75, - style: 0.0, - useSpeakerBoost: true, - speed: 1.0, - }, + google: { + apiKey: "${GEMINI_API_KEY}", + model: "gemini-3.1-flash-tts-preview", + voiceName: "Kore", + // 可选的自然语言风格提示: + // audioProfile: "Speak in a calm, podcast-host tone.", + // speakerName: "Alex", }, }, }, }, } ``` - -### Azure Speech 主提供商 - + + ```json5 { messages: { @@ -195,8 +159,8 @@ TTS 配置位于 `openclaw.json` 中的 `messages.tts` 下。 provider: "azure-speech", providers: { "azure-speech": { - // apiKey 回退到 AZURE_SPEECH_KEY。 - // region 回退到 AZURE_SPEECH_REGION。 + apiKey: "${AZURE_SPEECH_KEY}", + region: "eastus", voice: "en-US-JennyNeural", lang: "en-US", outputFormat: "audio-24khz-48kbitrate-mono-mp3", @@ -207,11 +171,8 @@ TTS 配置位于 `openclaw.json` 中的 `messages.tts` 下。 }, } ``` - -Azure Speech 使用的是 Speech 资源密钥,而不是 Azure OpenAI 密钥。解析顺序为 `messages.tts.providers.azure-speech.apiKey` -> `AZURE_SPEECH_KEY` -> `AZURE_SPEECH_API_KEY` -> `SPEECH_KEY`,区域则为 `messages.tts.providers.azure-speech.region` -> `AZURE_SPEECH_REGION` -> `SPEECH_REGION`。新配置应使用 `azure-speech`;`azure` 也可作为提供商别名使用。 - -### Microsoft 主提供商(无 API 密钥) - + + ```json5 { messages: { @@ -224,17 +185,16 @@ Azure Speech 使用的是 Speech 资源密钥,而不是 Azure OpenAI 密钥。 voice: "en-US-MichelleNeural", lang: "en-US", outputFormat: "audio-24khz-48kbitrate-mono-mp3", - rate: "+10%", - pitch: "-5%", + rate: "+0%", + pitch: "+0%", }, }, }, }, } ``` - -### MiniMax 主提供商 - + + ```json5 { messages: { @@ -243,8 +203,7 @@ Azure Speech 使用的是 Speech 资源密钥,而不是 Azure OpenAI 密钥。 provider: "minimax", providers: { minimax: { - apiKey: "minimax_api_key", - baseUrl: "https://api.minimax.io", + apiKey: "${MINIMAX_API_KEY}", model: "speech-2.8-hd", voiceId: "English_expressive_narrator", speed: 1.0, @@ -256,33 +215,8 @@ Azure Speech 使用的是 Speech 资源密钥,而不是 Azure OpenAI 密钥。 }, } ``` - -MiniMax TTS 认证解析顺序为 `messages.tts.providers.minimax.apiKey`,然后是已存储的 `minimax-portal` OAuth/token 配置,再然后是 Token Plan 环境变量键(`MINIMAX_OAUTH_TOKEN`、`MINIMAX_CODE_PLAN_KEY`、`MINIMAX_CODING_API_KEY`),最后是 `MINIMAX_API_KEY`。当未显式设置 TTS `baseUrl` 时,OpenClaw 可以复用已配置的 `minimax-portal` OAuth 主机用于 Token Plan 语音。 - -### Google Gemini 主提供商 - -```json5 -{ - messages: { - tts: { - auto: "always", - provider: "google", - providers: { - google: { - apiKey: "gemini_api_key", - model: "gemini-3.1-flash-tts-preview", - voiceName: "Kore", - }, - }, - }, - }, -} -``` - -Google Gemini TTS 使用 Gemini API 密钥路径。这里可以使用限制为 Gemini API 的 Google Cloud Console API 密钥,它与内置 Google 图像生成提供商使用的是同一类密钥。解析顺序为 `messages.tts.providers.google.apiKey` -> `models.providers.google.apiKey` -> `GEMINI_API_KEY` -> `GOOGLE_API_KEY`。 - -### Inworld 主提供商 - + + ```json5 { messages: { @@ -291,45 +225,18 @@ Google Gemini TTS 使用 Gemini API 密钥路径。这里可以使用限制为 G provider: "inworld", providers: { inworld: { - apiKey: "inworld_api_key", - baseUrl: "https://api.inworld.ai", - voiceId: "Sarah", + apiKey: "${INWORLD_API_KEY}", modelId: "inworld-tts-1.5-max", - temperature: 0.8, + voiceId: "Sarah", + temperature: 0.7, }, }, }, }, } ``` - -`apiKey` 值必须是从 Inworld 控制台(Workspace > API Keys)原样复制的 Base64 编码凭证字符串。提供商会直接将它作为 `Authorization: Basic ` 发送,不会进行任何额外编码,因此不要传入原始 bearer token,也不要自行对其进行 Base64 编码。该密钥会回退到 `INWORLD_API_KEY` 环境变量。完整设置请参见 [Inworld provider](/zh-CN/providers/inworld)。 - -### Volcengine 主提供商 - -```json5 -{ - messages: { - tts: { - auto: "always", - provider: "volcengine", - providers: { - volcengine: { - apiKey: "byteplus_seed_speech_api_key", - resourceId: "seed-tts-1.0", - voice: "en_female_anna_mars_bigtts", - speedRatio: 1.0, - }, - }, - }, - }, -} -``` - -Volcengine TTS 使用的是来自 Speech Console 的 BytePlus Seed Speech API 密钥,而不是 Doubao 模型提供商所使用的 OpenAI 兼容 `VOLCANO_ENGINE_API_KEY`。解析顺序为 `messages.tts.providers.volcengine.apiKey` -> `VOLCENGINE_TTS_API_KEY` -> `BYTEPLUS_SEED_SPEECH_API_KEY`。旧版 AppID/token 认证仍可通过 `messages.tts.providers.volcengine.appId` / `token` 或 `VOLCENGINE_TTS_APPID` / `VOLCENGINE_TTS_TOKEN` 使用。语音笔记目标会请求提供商原生的 `ogg_opus`;普通音频文件目标会请求 `mp3`。 - -### xAI 主提供商 - + + ```json5 { messages: { @@ -338,22 +245,37 @@ Volcengine TTS 使用的是来自 Speech Console 的 BytePlus Seed Speech API provider: "xai", providers: { xai: { - apiKey: "xai_api_key", + apiKey: "${XAI_API_KEY}", voiceId: "eve", language: "en", responseFormat: "mp3", - speed: 1.0, }, }, }, }, } ``` - -xAI TTS 与内置 Grok 模型提供商共用同一 `XAI_API_KEY` 路径。解析顺序为 `messages.tts.providers.xai.apiKey` -> `XAI_API_KEY`。当前可用的实时声音有 `ara`、`eve`、`leo`、`rex`、`sal` 和 `una`;默认值为 `eve`。`language` 接受 BCP-47 标签或 `auto`。 - -### Xiaomi MiMo 主提供商 - + + +```json5 +{ + messages: { + tts: { + auto: "always", + provider: "volcengine", + providers: { + volcengine: { + apiKey: "${VOLCENGINE_TTS_API_KEY}", + resourceId: "seed-tts-1.0", + voice: "en_female_anna_mars_bigtts", + }, + }, + }, + }, +} +``` + + ```json5 { messages: { @@ -362,23 +284,18 @@ xAI TTS 与内置 Grok 模型提供商共用同一 `XAI_API_KEY` 路径。解析 provider: "xiaomi", providers: { xiaomi: { - apiKey: "xiaomi_api_key", - baseUrl: "https://api.xiaomimimo.com/v1", + apiKey: "${XIAOMI_API_KEY}", model: "mimo-v2.5-tts", voice: "mimo_default", format: "mp3", - style: "Bright, natural, conversational tone.", }, }, }, }, } ``` - -Xiaomi MiMo TTS 与内置 Xiaomi 模型提供商共用同一 `XIAOMI_API_KEY` 路径。语音提供商 id 是 `xiaomi`;`mimo` 也可作为别名使用。目标文本会作为 assistant 消息发送,这与 Xiaomi 的 TTS 协议保持一致。可选的 `style` 会作为用户指令发送,不会被读出来。 - -### OpenRouter 主提供商 - + + ```json5 { messages: { @@ -387,7 +304,7 @@ Xiaomi MiMo TTS 与内置 Xiaomi 模型提供商共用同一 `XIAOMI_API_KEY` provider: "openrouter", providers: { openrouter: { - apiKey: "openrouter_api_key", + apiKey: "${OPENROUTER_API_KEY}", model: "hexgrad/kokoro-82m", voice: "af_alloy", responseFormat: "mp3", @@ -397,11 +314,26 @@ Xiaomi MiMo TTS 与内置 Xiaomi 模型提供商共用同一 `XIAOMI_API_KEY` }, } ``` - -OpenRouter TTS 与内置 OpenRouter 模型提供商共用同一 `OPENROUTER_API_KEY` 路径。解析顺序为 `messages.tts.providers.openrouter.apiKey` -> `models.providers.openrouter.apiKey` -> `OPENROUTER_API_KEY`。 - -### Local CLI 主提供商 - + + +```json5 +{ + messages: { + tts: { + auto: "always", + provider: "gradium", + providers: { + gradium: { + apiKey: "${GRADIUM_API_KEY}", + voiceId: "YTpq7expH9539ERJ", + }, + }, + }, + }, +} +``` + + ```json5 { messages: { @@ -420,22 +352,67 @@ OpenRouter TTS 与内置 OpenRouter 模型提供商共用同一 `OPENROUTER_API_ }, } ``` + + -Local CLI TTS 会在 Gateway 网关主机上运行已配置的命令。`{{Text}}`、`{{OutputPath}}`、`{{OutputDir}}` 和 `{{OutputBase}}` 占位符会在 `args` 中展开;如果不存在 `{{Text}}` 占位符,OpenClaw 会将要朗读的文本写入 stdin。`outputFormat` 接受 `mp3`、`opus` 或 `wav`。语音笔记目标会被转码为 Ogg/Opus,电话输出会使用 `ffmpeg` 转码为原始 16 kHz 单声道 PCM。旧版提供商别名 `cli` 仍然可用,但新配置应使用 `tts-local-cli`。 +### 按智能体覆盖语音设置 -### Gradium 主提供商 +当某个智能体需要使用不同的提供商、声音、模型、音色角色或自动 TTS 模式时,请使用 `agents.list[].tts`。智能体配置块会在 `messages.tts` 之上进行深度合并,因此提供商凭证可以保留在全局提供商配置中: ```json5 { messages: { tts: { auto: "always", - provider: "gradium", + provider: "elevenlabs", providers: { - gradium: { - apiKey: "gradium_api_key", - baseUrl: "https://api.gradium.ai", - voiceId: "YTpq7expH9539ERJ", + elevenlabs: { apiKey: "${ELEVENLABS_API_KEY}", model: "eleven_multilingual_v2" }, + }, + }, + }, + agents: { + list: [ + { + id: "reader", + tts: { + providers: { + elevenlabs: { voiceId: "EXAVITQu4vr4xnSDxMaL" }, + }, + }, + }, + ], + }, +} +``` + +要固定某个智能体的音色角色,请在提供商配置之外设置 `agents.list[].tts.persona`——它只会覆盖该智能体的全局 `messages.tts.persona`。 + +对于自动回复、`/tts audio`、`/tts status` 以及 `tts` 智能体工具,优先级顺序如下: + +1. `messages.tts` +2. 当前激活的 `agents.list[].tts` +3. 此主机上的本地 `/tts` 偏好设置 +4. 当启用[模型覆盖](#model-driven-directives)时,内联 `[[tts:...]]` 指令 + +## 音色角色 + +**persona** 是一种稳定的语音身份,可以跨提供商以确定性的方式应用。它可以偏好某个提供商、定义与提供商无关的提示意图,并携带提供商特定的语音、模型、提示模板、种子和语音设置绑定。 + +### 最小 persona + +```json5 +{ + messages: { + tts: { + auto: "always", + persona: "narrator", + personas: { + narrator: { + label: "旁白", + provider: "elevenlabs", + providers: { + elevenlabs: { voiceId: "EXAVITQu4vr4xnSDxMaL", modelId: "eleven_multilingual_v2" }, + }, }, }, }, @@ -443,9 +420,7 @@ Local CLI TTS 会在 Gateway 网关主机上运行已配置的命令。`{{Text}} } ``` -### TTS personas - -当你希望获得可跨提供商稳定、可确定性应用的语音身份时,请使用 `messages.tts.personas`。persona 可以偏好某个提供商、定义与提供商无关的提示意图,并携带针对特定提供商的声音、模型、提示模板、种子和语音设置绑定。 +### 完整 persona(提供商无关提示) ```json5 { @@ -456,17 +431,17 @@ Local CLI TTS 会在 Gateway 网关主机上运行已配置的命令。`{{Text}} personas: { alfred: { label: "Alfred", - description: "Dry, warm British butler narrator.", + description: "冷幽默、温暖的英式管家旁白。", provider: "google", fallbackPolicy: "preserve-persona", prompt: { - profile: "A brilliant British butler. Dry, witty, warm, charming, emotionally expressive, never generic.", - scene: "A quiet late-night study. Close-mic narration for a trusted operator.", - sampleContext: "The speaker is answering a private technical request with concise confidence and dry warmth.", - style: "Refined, understated, lightly amused.", - accent: "British English.", - pacing: "Measured, with short dramatic pauses.", - constraints: ["Do not read configuration values aloud.", "Do not explain the persona."], + profile: "一位出色的英国管家。冷幽默、机智、温暖、迷人、情感丰富,绝不平淡。", + scene: "安静的深夜书房。为一位受信任的操作员进行近距离收音的旁白。", + sampleContext: "说话者正在以简洁、自信且带有冷幽默温度的方式回答一个私人的技术请求。", + style: "精致、克制、略带玩味。", + accent: "英式英语。", + pacing: "节奏从容,带有短暂的戏剧性停顿。", + constraints: ["不要把配置值读出来。", "不要解释这个 persona。"], }, providers: { google: { @@ -474,10 +449,7 @@ Local CLI TTS 会在 Gateway 网关主机上运行已配置的命令。`{{Text}} voiceName: "Algieba", promptTemplate: "audio-profile-v1", }, - openai: { - model: "gpt-4o-mini-tts", - voice: "cedar", - }, + openai: { model: "gpt-4o-mini-tts", voice: "cedar" }, elevenlabs: { voiceId: "voice_id", modelId: "eleven_multilingual_v2", @@ -498,324 +470,154 @@ Local CLI TTS 会在 Gateway 网关主机上运行已配置的命令。`{{Text}} } ``` -解析是确定性的: +### Persona 解析 -1. 本地偏好 `/tts persona `,如果已设置。 -2. `messages.tts.persona`,如果已设置。 +当前激活的 persona 会按确定性规则选择: + +1. `/tts persona ` 本地偏好(如果已设置)。 +2. `messages.tts.persona`(如果已设置)。 3. 无 persona。 -提供商选择遵循“显式优先”: +提供商选择按“显式优先”执行: -1. 来自 CLI、Gateway 网关、Talk 或允许的 TTS 指令的直接提供商覆盖。 -2. 本地偏好 `/tts provider `。 +1. 直接覆盖项(CLI、Gateway 网关、Talk、允许的 TTS 指令)。 +2. `/tts provider ` 本地偏好。 3. 当前 persona 的 `provider`。 4. `messages.tts.provider`。 5. 注册表自动选择。 -对于每次提供商尝试,OpenClaw 会合并: +对于每次提供商尝试,OpenClaw 会按以下顺序合并配置: 1. `messages.tts.providers.` 2. `messages.tts.personas..providers.` -3. 受信任的请求覆盖 -4. 允许的模型发出的 TTS 指令覆盖 +3. 受信任的请求覆盖项 +4. 允许的模型发出 TTS 指令覆盖项 -`fallbackPolicy` 控制当当前 persona 对某个尝试的提供商没有绑定时会发生什么: +### 提供商如何使用 persona 提示 -- `preserve-persona` 会让与提供商无关的 persona 提示字段继续可用于各提供商。这是默认值。 -- `provider-defaults` 会在该次尝试中从提供商提示准备阶段省略 persona,因此提供商将使用其中性默认值,同时仍允许继续回退。 -- `fail` 会跳过该提供商尝试,并带上 `reasonCode: "not_configured"` 和 `personaBinding: "missing"`。仍会继续尝试回退提供商;只有当所有尝试的提供商都被跳过或失败时,整个 TTS 请求才会失败。 +Persona 提示字段(`profile`、`scene`、`sampleContext`、`style`、`accent`、`pacing`、`constraints`)是**提供商无关**的。每个提供商会自行决定如何使用它们: -persona 提示字段与提供商无关。具体如何使用由提供商决定。只有当生效的 Google 提供商配置设置了 `promptTemplate: "audio-profile-v1"` 或 `personaPrompt` 时,Google 才会包装这些字段;其较旧的 `audioProfile` 和 `speakerName` 字段仍会作为 Google 专用提示文本前置。OpenAI 会在未显式配置 OpenAI `instructions` 值时,将提示字段映射到 `instructions`。没有类似提示控制的提供商仅使用 provider-specific 的 persona 绑定。 + + + 只有当生效的 Google 提供商配置设置了 `promptTemplate: "audio-profile-v1"` 或 `personaPrompt` 时,才会将 persona 提示字段包装进 Gemini TTS 提示结构中。较旧的 `audioProfile` 和 `speakerName` 字段仍会作为 Google 特定的提示文本预置到前面。像 `[whispers]` 或 `[laughs]` 这样的内联音频标签,如果位于 `[[tts:text]]` 块内,会在 Gemini 转录文本中保留;OpenClaw 不会生成这些标签。 + + + 只有在未显式配置 OpenAI `instructions` 时,才会将 persona 提示字段映射到请求的 `instructions` 字段。显式 `instructions` 始终优先。 + + + 只使用 `personas..providers.` 下特定于提供商的 persona 绑定。除非该提供商实现了自己的 persona 提示映射,否则 persona 提示字段会被忽略。 + + -Gemini 内联音频标签属于 transcript 内容,而不是 persona 配置。如果 assistant 或显式的 `[[tts:text]]` 块包含诸如 `[whispers]` 或 `[laughs]` 之类的标签,OpenClaw 会在 Gemini transcript 中保留它们。OpenClaw 不会生成已配置的起始标签。 +### 回退策略 -### 禁用 Microsoft 语音 +`fallbackPolicy` 用于控制当某个 persona 对当前尝试的提供商**没有绑定**时的行为: -```json5 -{ - messages: { - tts: { - providers: { - microsoft: { - enabled: false, - }, - }, - }, - }, -} -``` +| 策略 | 行为 | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `preserve-persona` | **默认值。** 提供商无关的提示字段仍然可用;提供商可以使用它们,也可以忽略它们。 | +| `provider-defaults` | 在该次尝试中,persona 不参与提示准备;提供商使用其默认设置,同时继续回退到其他提供商。 | +| `fail` | 以 `reasonCode: "not_configured"` 和 `personaBinding: "missing"` 跳过该提供商尝试。仍会继续尝试回退提供商。 | -### 自定义限制 + prefs 路径 +只有当**所有**已尝试的提供商都被跳过或失败时,整个 TTS 请求才会失败。 -```json5 -{ - messages: { - tts: { - auto: "always", - maxTextLength: 4000, - timeoutMs: 30000, - prefsPath: "~/.openclaw/settings/tts.json", - }, - }, -} -``` +## 模型驱动指令 -### 仅在收到入站语音消息后用音频回复 +默认情况下,助手**可以**发出 `[[tts:...]]` 指令,以覆盖单条回复的声音、模型或语速,还可以附带一个可选的 `[[tts:text]]...[[/tts:text]]` 块,用于只在音频中出现的表现性提示: -```json5 -{ - messages: { - tts: { - auto: "inbound", - }, - }, -} -``` - -### 为长回复禁用自动摘要 - -```json5 -{ - messages: { - tts: { - auto: "always", - }, - }, -} -``` - -然后运行: - -``` -/tts summary off -``` - -### 字段说明 - -- `auto`:自动 TTS 模式(`off`、`always`、`inbound`、`tagged`)。 - - `inbound` 仅在收到入站语音消息后发送音频。 - - `tagged` 仅在回复包含 `[[tts:key=value]]` 指令或 `[[tts:text]]...[[/tts:text]]` 块时发送音频。 -- `enabled`:旧版开关(Doctor 会将其迁移为 `auto`)。 -- `mode`:`"final"`(默认)或 `"all"`(包括工具/分块回复)。 -- `provider`:语音提供商 id,例如 `"elevenlabs"`、`"google"`、`"gradium"`、`"inworld"`、`"microsoft"`、`"minimax"`、`"openai"`、`"volcengine"`、`"vydra"`、`"xai"` 或 `"xiaomi"`(回退为自动)。 -- 如果 `provider` **未设置**,OpenClaw 会按照注册表自动选择顺序使用第一个已配置的语音提供商。 -- 旧版 `provider: "edge"` 配置可通过 `openclaw doctor --fix` 修复,并重写为 `provider: "microsoft"`。 -- `persona`:来自 `personas` 的默认 TTS persona id。 -- `personas.`:稳定的语音身份。该 id 会被标准化为小写。 -- `personas..provider`:该 persona 偏好的语音提供商。显式提供商覆盖和本地提供商偏好仍然优先。 -- `personas..fallbackPolicy`:`preserve-persona`(默认)、`provider-defaults` 或 `fail`;参见 [TTS personas](#tts-personas)。 -- `personas..prompt`:与提供商无关的 persona 提示字段(`profile`、`scene`、`sampleContext`、`style`、`accent`、`pacing`、`constraints`)。 -- `personas..providers.`:针对特定提供商的 persona 绑定,会在 `providers.` 之上合并。 -- `summaryModel`:用于自动摘要的可选低成本模型;默认值为 `agents.defaults.model.primary`。 - - 接受 `provider/model` 或已配置的模型别名。 -- `modelOverrides`:允许模型发出 TTS 指令(默认开启)。 - - `allowProvider` 默认为 `false`(提供商切换需要显式启用)。 -- `providers.`:由提供商拥有的设置,以语音提供商 id 为键。 -- 旧版直接提供商块(`messages.tts.openai`、`messages.tts.elevenlabs`、`messages.tts.microsoft`、`messages.tts.edge`)可通过 `openclaw doctor --fix` 修复;提交的配置应使用 `messages.tts.providers.`。 -- 旧版 `messages.tts.providers.edge` 也可通过 `openclaw doctor --fix` 修复;提交的配置应使用 `messages.tts.providers.microsoft`。 -- `maxTextLength`:TTS 输入的硬性上限(字符数)。超出时,`/tts audio` 会失败。 -- `timeoutMs`:请求超时(毫秒)。 -- `prefsPath`:覆盖本地 prefs JSON 路径(provider/limit/summary)。 -- `apiKey` 值会回退到环境变量(`AZURE_SPEECH_KEY`/`AZURE_SPEECH_API_KEY`/`SPEECH_KEY`、`ELEVENLABS_API_KEY`/`XI_API_KEY`、`GEMINI_API_KEY`/`GOOGLE_API_KEY`、`GRADIUM_API_KEY`、`INWORLD_API_KEY`、`MINIMAX_API_KEY`、`OPENAI_API_KEY`、`VYDRA_API_KEY`、`XAI_API_KEY`、`XIAOMI_API_KEY`)。Volcengine 则使用 `appId`/`token`。 -- `providers.azure-speech.apiKey`:Azure Speech 资源密钥(环境变量:`AZURE_SPEECH_KEY`、`AZURE_SPEECH_API_KEY` 或 `SPEECH_KEY`)。 -- `providers.azure-speech.region`:Azure Speech 区域,例如 `eastus`(环境变量:`AZURE_SPEECH_REGION` 或 `SPEECH_REGION`)。 -- `providers.azure-speech.endpoint` / `providers.azure-speech.baseUrl`:可选的 Azure Speech endpoint/base URL 覆盖。 -- `providers.azure-speech.voice`:Azure 语音 ShortName(默认 `en-US-JennyNeural`)。 -- `providers.azure-speech.lang`:SSML 语言代码(默认 `en-US`)。 -- `providers.azure-speech.outputFormat`:用于标准音频输出的 Azure `X-Microsoft-OutputFormat`(默认 `audio-24khz-48kbitrate-mono-mp3`)。 -- `providers.azure-speech.voiceNoteOutputFormat`:用于语音笔记输出的 Azure `X-Microsoft-OutputFormat`(默认 `ogg-24khz-16bit-mono-opus`)。 -- `providers.elevenlabs.baseUrl`:覆盖 ElevenLabs API base URL。 -- `providers.openai.baseUrl`:覆盖 OpenAI TTS endpoint。 - - 解析顺序:`messages.tts.providers.openai.baseUrl` -> `OPENAI_TTS_BASE_URL` -> `https://api.openai.com/v1` - - 非默认值会被视为 OpenAI 兼容的 TTS endpoint,因此接受自定义模型名和语音名。 -- `providers.elevenlabs.voiceSettings`: - - `stability`、`similarityBoost`、`style`:`0..1` - - `useSpeakerBoost`:`true|false` - - `speed`:`0.5..2.0`(1.0 = 正常) -- `providers.elevenlabs.applyTextNormalization`:`auto|on|off` -- `providers.elevenlabs.languageCode`:2 位 ISO 639-1 代码(例如 `en`、`de`) -- `providers.elevenlabs.seed`:整数 `0..4294967295`(尽力保证确定性) -- `providers.minimax.baseUrl`:覆盖 MiniMax API base URL(默认 `https://api.minimax.io`,环境变量:`MINIMAX_API_HOST`)。 -- `providers.minimax.model`:TTS 模型(默认 `speech-2.8-hd`,环境变量:`MINIMAX_TTS_MODEL`)。 -- `providers.minimax.voiceId`:语音标识符(默认 `English_expressive_narrator`,环境变量:`MINIMAX_TTS_VOICE_ID`)。 -- `providers.minimax.speed`:播放速度 `0.5..2.0`(默认 1.0)。 -- `providers.minimax.vol`:音量 `(0, 10]`(默认 1.0;必须大于 0)。 -- `providers.minimax.pitch`:整数音高偏移 `-12..12`(默认 0)。在调用 MiniMax T2A 之前,小数值会被截断,因为该 API 不接受非整数音高值。 -- `providers.tts-local-cli.command`:用于 CLI TTS 的本地可执行文件或命令字符串。 -- `providers.tts-local-cli.args`:命令参数;支持 `{{Text}}`、`{{OutputPath}}`、`{{OutputDir}}` 和 `{{OutputBase}}` 占位符。 -- `providers.tts-local-cli.outputFormat`:预期的 CLI 输出格式(`mp3`、`opus` 或 `wav`;音频附件默认 `mp3`)。 -- `providers.tts-local-cli.timeoutMs`:命令超时时间(毫秒,默认 `120000`)。 -- `providers.tts-local-cli.cwd`:可选的命令工作目录。 -- `providers.tts-local-cli.env`:命令的可选字符串环境变量覆盖。 -- `providers.inworld.baseUrl`:覆盖 Inworld API base URL(默认 `https://api.inworld.ai`)。 -- `providers.inworld.voiceId`:Inworld 语音标识符(默认 `Sarah`)。 -- `providers.inworld.modelId`:Inworld TTS 模型(默认 `inworld-tts-1.5-max`;也支持 `inworld-tts-1.5-mini`、`inworld-tts-1-max`、`inworld-tts-1`)。 -- `providers.inworld.temperature`:采样温度 `0..2`(可选)。 -- `providers.google.model`:Gemini TTS 模型(默认 `gemini-3.1-flash-tts-preview`)。 -- `providers.google.voiceName`:Gemini 预设语音名称(默认 `Kore`;也接受 `voice`)。 -- `providers.google.audioProfile`:会前置到朗读文本之前的自然语言风格提示。 -- `providers.google.speakerName`:当你的 TTS 提示使用命名说话人时,会前置到朗读文本之前的可选说话人标签。 -- `providers.google.promptTemplate`:设为 `audio-profile-v1` 时,会将当前 persona 提示字段包装为确定性的 Gemini TTS 提示结构。 -- `providers.google.personaPrompt`:附加到模板 Director's Notes 中的 Google 专用额外 persona 提示文本。 -- `providers.google.baseUrl`:覆盖 Gemini API base URL。仅接受 `https://generativelanguage.googleapis.com`。 - - 如果省略 `messages.tts.providers.google.apiKey`,TTS 可以在环境变量回退前复用 `models.providers.google.apiKey`。 -- `providers.gradium.baseUrl`:覆盖 Gradium API base URL(默认 `https://api.gradium.ai`)。 -- `providers.gradium.voiceId`:Gradium 语音标识符(默认 Emma,`YTpq7expH9539ERJ`)。 -- `providers.volcengine.apiKey`:BytePlus Seed Speech API 密钥(环境变量:`VOLCENGINE_TTS_API_KEY` 或 `BYTEPLUS_SEED_SPEECH_API_KEY`)。 -- `providers.volcengine.resourceId`:BytePlus Seed Speech 资源 id(默认 `seed-tts-1.0`,环境变量:`VOLCENGINE_TTS_RESOURCE_ID`;当你的 BytePlus 项目具有 TTS 2.0 权限时,请使用 `seed-tts-2.0`)。 -- `providers.volcengine.appKey`:BytePlus Seed Speech app key header(默认 `aGjiRDfUWi`,环境变量:`VOLCENGINE_TTS_APP_KEY`)。 -- `providers.volcengine.baseUrl`:覆盖 Seed Speech TTS HTTP endpoint(环境变量:`VOLCENGINE_TTS_BASE_URL`)。 -- `providers.volcengine.appId`:旧版 Volcengine Speech Console application id(环境变量:`VOLCENGINE_TTS_APPID`)。 -- `providers.volcengine.token`:旧版 Volcengine Speech Console access token(环境变量:`VOLCENGINE_TTS_TOKEN`)。 -- `providers.volcengine.cluster`:旧版 Volcengine TTS cluster(默认 `volcano_tts`,环境变量:`VOLCENGINE_TTS_CLUSTER`)。 -- `providers.volcengine.voice`:语音类型(默认 `en_female_anna_mars_bigtts`,环境变量:`VOLCENGINE_TTS_VOICE`)。 -- `providers.volcengine.speedRatio`:提供商原生速度比率。 -- `providers.volcengine.emotion`:提供商原生情绪标签。 -- `providers.xai.apiKey`:xAI TTS API 密钥(环境变量:`XAI_API_KEY`)。 -- `providers.xai.baseUrl`:覆盖 xAI TTS base URL(默认 `https://api.x.ai/v1`,环境变量:`XAI_BASE_URL`)。 -- `providers.xai.voiceId`:xAI 语音 id(默认 `eve`;当前可用的实时语音:`ara`、`eve`、`leo`、`rex`、`sal`、`una`)。 -- `providers.xai.language`:BCP-47 语言代码或 `auto`(默认 `en`)。 -- `providers.xai.responseFormat`:`mp3`、`wav`、`pcm`、`mulaw` 或 `alaw`(默认 `mp3`)。 -- `providers.xai.speed`:提供商原生速度覆盖。 -- `providers.xiaomi.apiKey`:Xiaomi MiMo API 密钥(环境变量:`XIAOMI_API_KEY`)。 -- `providers.xiaomi.baseUrl`:覆盖 Xiaomi MiMo API base URL(默认 `https://api.xiaomimimo.com/v1`,环境变量:`XIAOMI_BASE_URL`)。 -- `providers.xiaomi.model`:TTS 模型(默认 `mimo-v2.5-tts`,环境变量:`XIAOMI_TTS_MODEL`;也支持 `mimo-v2-tts`)。 -- `providers.xiaomi.voice`:MiMo 语音 id(默认 `mimo_default`,环境变量:`XIAOMI_TTS_VOICE`)。 -- `providers.xiaomi.format`:`mp3` 或 `wav`(默认 `mp3`,环境变量:`XIAOMI_TTS_FORMAT`)。 -- `providers.xiaomi.style`:可选的自然语言风格指令,会作为用户消息发送;不会被读出来。 -- `providers.openrouter.apiKey`:OpenRouter API 密钥(环境变量:`OPENROUTER_API_KEY`;可复用 `models.providers.openrouter.apiKey`)。 -- `providers.openrouter.baseUrl`:覆盖 OpenRouter TTS base URL(默认 `https://openrouter.ai/api/v1`;旧版 `https://openrouter.ai/v1` 会被标准化)。 -- `providers.openrouter.model`:OpenRouter TTS 模型 id(默认 `hexgrad/kokoro-82m`;也接受 `modelId`)。 -- `providers.openrouter.voice`:提供商专用语音 id(默认 `af_alloy`;也接受 `voiceId`)。 -- `providers.openrouter.responseFormat`:`mp3` 或 `pcm`(默认 `mp3`)。 -- `providers.openrouter.speed`:提供商原生速度覆盖。 -- `providers.microsoft.enabled`:允许使用 Microsoft 语音(默认 `true`;无 API 密钥)。 -- `providers.microsoft.voice`:Microsoft 神经语音名称(例如 `en-US-MichelleNeural`)。 -- `providers.microsoft.lang`:语言代码(例如 `en-US`)。 -- `providers.microsoft.outputFormat`:Microsoft 输出格式(例如 `audio-24khz-48kbitrate-mono-mp3`)。 - - 有效值请参阅 Microsoft Speech 输出格式;并非所有格式都受内置的 Edge 后端传输支持。 -- `providers.microsoft.rate` / `providers.microsoft.pitch` / `providers.microsoft.volume`:百分比字符串(例如 `+10%`、`-5%`)。 -- `providers.microsoft.saveSubtitles`:在音频文件旁写入 JSON 字幕。 -- `providers.microsoft.proxy`:Microsoft 语音请求的代理 URL。 -- `providers.microsoft.timeoutMs`:请求超时覆盖(毫秒)。 -- `edge.*`:同一组 Microsoft 设置的旧版别名。运行 - `openclaw doctor --fix` 以将持久化配置重写为 `providers.microsoft`。 - -## 模型驱动覆盖(默认开启) - -默认情况下,模型**可以**为单条回复发出 TTS 指令。 -当 `messages.tts.auto` 为 `tagged` 时,必须使用这些指令才能触发音频。 - -启用后,模型可以发出 `[[tts:...]]` 指令,以覆盖单条回复的语音设置;还可以选择使用 `[[tts:text]]...[[/tts:text]]` 块提供富表现力标签(笑声、唱歌提示等),这些内容只应出现在音频中。 - -分块流式传输的块交付会在渠道看到文本之前,从可见文本中剥离这些指令,即使某条指令被拆分在相邻的多个块中也是如此。最终模式仍会解析累计的原始回复以进行 TTS 合成。 - -除非设置 `modelOverrides.allowProvider: true`,否则 `provider=...` 指令会被忽略。 -当回复声明 `provider=...` 时,该指令中的其他键只会由该提供商解析。不受支持的键会从可见文本中剥离,并作为 TTS 指令警告报告,而不会被路由到其他提供商。 - -示例回复载荷: - -``` +```text Here you go. [[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]] [[tts:text]](laughs) Read the song once more.[[/tts:text]] ``` -可用的指令键(启用时): +当 `messages.tts.auto` 为 `"tagged"` 时,**必须使用指令**才能触发音频。分块流式传输会在渠道看到文本之前,从可见文本中移除这些指令,即使它们被拆分在相邻的块中也是如此。 -- `provider`(已注册的语音提供商 id,例如 `openai`、`elevenlabs`、`google`、`gradium`、`minimax`、`microsoft`、`volcengine`、`vydra`、`xai` 或 `xiaomi`;需要 `allowProvider: true`) -- `voice`(OpenAI、Gradium、Volcengine 或 Xiaomi 语音)、`voiceName` / `voice_name` / `google_voice`(Google 语音),或 `voiceId`(ElevenLabs / Gradium / MiniMax / xAI) -- `model`(OpenAI TTS 模型、ElevenLabs 模型 id、MiniMax 模型或 Xiaomi MiMo TTS 模型)或 `google_model`(Google TTS 模型) +除非设置 `modelOverrides.allowProvider: true`,否则 `provider=...` 会被忽略。当某条回复声明了 `provider=...` 时,该指令中的其他键只会由该提供商解析;不受支持的键会被移除,并作为 TTS 指令警告报告。 + +**可用的指令键:** + +- `provider`(已注册的提供商 id;需要 `allowProvider: true`) +- `voice` / `voiceName` / `voice_name` / `google_voice` / `voiceId` +- `model` / `google_model` - `stability`、`similarityBoost`、`style`、`speed`、`useSpeakerBoost` -- `vol` / `volume`(MiniMax 音量,0-10) -- `pitch`(MiniMax 整数音高,-12 到 12;在发起 MiniMax 请求前,小数值会被截断) +- `vol` / `volume`(MiniMax 音量,0–10) +- `pitch`(MiniMax 整数音高,−12 到 12;小数值会被截断) - `emotion`(Volcengine 情绪标签) - `applyTextNormalization`(`auto|on|off`) - `languageCode`(ISO 639-1) - `seed` -禁用所有模型覆盖: +**完全禁用模型覆盖:** ```json5 -{ - messages: { - tts: { - modelOverrides: { - enabled: false, - }, - }, - }, -} +{ messages: { tts: { modelOverrides: { enabled: false } } } } ``` -可选 allowlist(启用提供商切换,同时保留其他旋钮可配置): +**允许切换提供商,同时保持其他参数可配置:** ```json5 -{ - messages: { - tts: { - modelOverrides: { - enabled: true, - allowProvider: true, - allowSeed: false, - }, - }, - }, -} +{ messages: { tts: { modelOverrides: { enabled: true, allowProvider: true, allowSeed: false } } } } ``` -## 每用户偏好设置 +## 斜杠命令 -斜杠命令会将本地覆盖写入 `prefsPath`(默认:`~/.openclaw/settings/tts.json`,可通过 `OPENCLAW_TTS_PREFS` 或 `messages.tts.prefsPath` 覆盖)。 +单一命令 `/tts`。在 Discord 上,OpenClaw 还会注册 `/voice`,因为 `/tts` 是 Discord 的内置命令——文本形式的 `/tts ...` 仍然可用。 -已存储字段: +```text +/tts off | on | status +/tts chat on | off | default +/tts latest +/tts provider +/tts persona | off +/tts limit +/tts summary off +/tts audio +``` -- `auto` -- `provider` -- `persona` -- `maxLength`(摘要阈值;默认 1500 个字符) -- `summarize`(默认 `true`) + +命令需要已获授权的发送者(适用 allowlist/owner 规则),并且必须启用 `commands.text` 或原生命令注册。 + -这些字段会覆盖该主机上来自 `messages.tts` 加上当前激活 `agents.list[].tts` 块的生效配置。 +行为说明: -## 输出格式(固定) +- `/tts on` 会将本地 TTS 偏好写为 `always`;`/tts off` 会写为 `off`。 +- `/tts chat on|off|default` 会为当前聊天写入会话范围的自动 TTS 覆盖设置。 +- `/tts persona ` 会写入本地 persona 偏好;`/tts persona off` 会清除它。 +- `/tts latest` 会从当前会话转录中读取最近一条助手回复,并将其作为音频发送一次。它只会在会话条目上存储该回复的哈希,以抑制重复发送语音。 +- `/tts audio` 会生成一次性的音频回复(**不会**开启 TTS)。 +- `limit` 和 `summary` 存储在**本地偏好**中,而不是主配置中。 +- `/tts status` 包含最近一次尝试的回退诊断——`Fallback: -> `、`Attempts: ...`,以及每次尝试的详细信息(`provider:outcome(reasonCode) latency`)。 +- 当启用 TTS 时,`/status` 会显示当前激活的 TTS 模式,以及已配置的提供商、模型、声音和已净化的自定义端点元数据。 -- **Feishu / Matrix / Telegram / WhatsApp**:语音笔记回复优先使用 Opus(ElevenLabs 的 `opus_48000_64`,OpenAI 的 `opus`)。 - - 48 kHz / 64 kbps 是语音消息中效果与体积的良好平衡。 -- **Feishu / WhatsApp**:当语音笔记回复生成为 MP3/WebM/WAV/M4A 或其他可能的音频文件时,渠道插件会在发送原生语音消息前,使用 `ffmpeg` 将其转码为 48 kHz Ogg/Opus。WhatsApp 会通过 Baileys 的 `audio` 载荷并设置 `ptt: true` 以及 `audio/ogg; codecs=opus` 来发送结果。如果转换失败,Feishu 会收到原始文件作为附件;WhatsApp 则会发送失败,而不是发布不兼容的 PTT 载荷。 -- **其他渠道**:MP3(ElevenLabs 的 `mp3_44100_128`,OpenAI 的 `mp3`)。 - - 44.1 kHz / 128 kbps 是语音清晰度的默认平衡。 -- **MiniMax**:普通音频附件使用 MP3(`speech-2.8-hd` 模型,32 kHz 采样率)。对于 Feishu、Telegram 和 WhatsApp 等语音笔记目标,OpenClaw 会在交付前使用 `ffmpeg` 将 MiniMax MP3 转码为 48 kHz Opus。 -- **Xiaomi MiMo**:默认使用 MP3,配置时也可使用 WAV。对于 Feishu、Telegram 和 WhatsApp 等语音笔记目标,OpenClaw 会在交付前使用 `ffmpeg` 将 Xiaomi 输出转码为 48 kHz Opus。 -- **Local CLI**:使用已配置的 `outputFormat`。语音笔记目标会被转换为 Ogg/Opus,电话输出会使用 `ffmpeg` 转换为原始 16 kHz 单声道 PCM。 -- **Google Gemini**:Gemini API TTS 返回原始 24 kHz PCM。OpenClaw 会将其封装为 WAV 用作音频附件,为语音笔记目标转码为 48 kHz Opus,并为 Talk/电话直接返回 PCM。 -- **Gradium**:音频附件使用 WAV,语音笔记目标使用 Opus,电话使用 8 kHz 的 `ulaw_8000`。 -- **Inworld**:普通音频附件使用 MP3,语音笔记目标使用原生 `OGG_OPUS`,Talk/电话使用 22050 Hz 的原始 `PCM`。 -- **xAI**:默认使用 MP3;`responseFormat` 可为 `mp3`、`wav`、`pcm`、`mulaw` 或 `alaw`。OpenClaw 使用 xAI 的批量 REST TTS endpoint,并返回完整音频附件;此提供商路径不使用 xAI 的流式 TTS WebSocket。此路径不支持原生 Opus 语音笔记格式。 -- **Microsoft**:使用 `microsoft.outputFormat`(默认 `audio-24khz-48kbitrate-mono-mp3`)。 - - 内置传输接受 `outputFormat`,但并非服务提供所有格式。 - - 输出格式值遵循 Microsoft Speech 输出格式(包括 Ogg/WebM Opus)。 - - Telegram `sendVoice` 接受 OGG/MP3/M4A;如果你需要有保障的 Opus 语音消息,请使用 OpenAI/ElevenLabs。 - - 如果已配置的 Microsoft 输出格式失败,OpenClaw 会重试 MP3。 +## 按用户划分的偏好设置 -OpenAI/ElevenLabs 输出格式按渠道固定(见上文)。 +斜杠命令会将本地覆盖项写入 `prefsPath`。默认路径是 `~/.openclaw/settings/tts.json`;可以通过 `OPENCLAW_TTS_PREFS` 环境变量或 `messages.tts.prefsPath` 进行覆盖。 + +| 存储字段 | 作用 | +| ------------ | -------------------------------------------- | +| `auto` | 本地自动 TTS 覆盖(`always`、`off` 等) | +| `provider` | 本地主提供商覆盖 | +| `persona` | 本地 persona 覆盖 | +| `maxLength` | 摘要阈值(默认 `1500` 个字符) | +| `summarize` | 摘要开关(默认 `true`) | + +这些设置会覆盖该主机上 `messages.tts` 加上当前 `agents.list[].tts` 配置块形成的生效配置。 ## 自动 TTS 行为 -启用后,OpenClaw 会: +当启用 `messages.tts.auto` 时,OpenClaw 会: - 如果回复已包含媒体或 `MEDIA:` 指令,则跳过 TTS。 -- 跳过过短的回复(少于 10 个字符)。 -- 如果启用,则使用 `agents.defaults.model.primary`(或 `summaryModel`)为长回复生成摘要。 +- 跳过很短的回复(少于 10 个字符)。 +- 如果启用了摘要,则使用 `summaryModel`(或 `agents.defaults.model.primary`)对长回复进行摘要。 - 将生成的音频附加到回复中。 -- 在 `mode: "final"` 中,对于流式最终回复,会在文本流完成后仍发送仅音频的 TTS;生成的媒体会经过与普通回复附件相同的渠道媒体标准化流程。 +- 在 `mode: "final"` 下,对于流式最终回复,在文本流完成后仍会发送仅音频的 TTS;生成的媒体会经过与普通回复附件相同的渠道媒体规范化流程。 如果回复超过 `maxLength` 且摘要已关闭(或摘要模型没有 API 密钥),则会跳过音频,并发送普通文本回复。 -## 流程图 - -``` +```text Reply -> TTS enabled? no -> send text yes -> has media / MEDIA: / short? @@ -824,72 +626,240 @@ Reply -> TTS enabled? no -> TTS -> attach audio yes -> summary enabled? no -> send text - yes -> summarize (summaryModel or agents.defaults.model.primary) - -> TTS -> attach audio + yes -> summarize -> TTS -> attach audio ``` -## 斜杠命令用法 +## 按渠道划分的输出格式 -只有一个命令:`/tts`。 -启用详情见 [Slash commands](/zh-CN/tools/slash-commands)。 +| 目标 | 格式 | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| 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`。 | -Discord 说明:`/tts` 是 Discord 的内置命令,因此 OpenClaw 会在该处注册 `/voice` 作为原生命令。文本 `/tts ...` 仍然可用。 +按提供商说明: -``` -/tts off -/tts on -/tts status -/tts chat on -/tts chat off -/tts chat default -/tts latest -/tts provider openai -/tts persona alfred -/tts limit 2000 -/tts summary off -/tts audio Hello from OpenClaw -``` + - **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 的输出格式按上表所列,针对不同渠道固定不变。 -- 命令需要已授权的发送者(allowlist/owner 规则仍然适用)。 -- 必须启用 `commands.text` 或原生命令注册。 -- 配置 `messages.tts.auto` 接受 `off|always|inbound|tagged`。 -- `/tts on` 会将本地 TTS 偏好写为 `always`;`/tts off` 会将其写为 `off`。 -- `/tts chat on|off|default` 会为当前聊天写入会话范围的自动 TTS 覆盖。 -- 当你希望默认使用 `inbound` 或 `tagged` 时,请使用配置。 -- `/tts persona ` 会写入本地 persona 偏好;`/tts persona off` 会清除它。 -- `limit` 和 `summary` 存储在本地 prefs 中,而不是主配置中。 -- `/tts audio` 会生成一次性音频回复(不会开启 TTS)。 -- `/tts latest` 会从当前会话 transcript 中读取最近一条 assistant 回复,并将其一次性作为音频发送。它只会在会话条目中存储该回复的哈希值,以抑制重复发送语音。 -- `/tts status` 包含最近一次尝试的回退可见性: - - 成功回退:`Fallback: -> ` 加 `Attempts: ...` - - 失败:`Error: ...` 加 `Attempts: ...` - - 详细诊断:`Attempt details: provider:outcome(reasonCode) latency` -- 当 TTS 已启用时,`/status` 会显示当前 TTS 模式以及已配置的提供商、模型、语音和已脱敏的自定义 endpoint 元数据。 -- OpenAI 和 ElevenLabs API 失败现在会包含已解析的提供商错误详情和请求 id(如果提供商返回),这些信息会显示在 TTS 错误/日志中。 + ## 字段参考 + + + + + 自动 TTS 模式。`inbound` 仅在收到入站语音消息后发送音频;`tagged` 仅在回复包含 `[[tts:...]]` 指令或 `[[tts:text]]` 块时发送音频。 + + + 旧版开关。`openclaw doctor --fix` 会将其迁移为 `auto`。 + + + `"all"` 除最终回复外,还包括工具/块回复。 + + + 语音提供商 id。未设置时,OpenClaw 会按注册表自动选择顺序使用第一个已配置的提供商。旧版 `provider: "edge"` 会被 `openclaw doctor --fix` 重写为 `"microsoft"`。 + + + 来自 `personas` 的当前激活 persona id。会规范化为小写。 + + + 稳定的语音身份。字段包括:`label`、`description`、`provider`、`fallbackPolicy`、`prompt`、`providers.`。参见[音色角色](#personas)。 + + + 用于自动摘要的低成本模型;默认为 `agents.defaults.model.primary`。接受 `provider/model` 或已配置的模型别名。 + + + 允许模型发出 TTS 指令。`enabled` 默认为 `true`;`allowProvider` 默认为 `false`。 + + + 以语音提供商 id 为键的提供商自有设置。旧版直接配置块(`messages.tts.openai`、`.elevenlabs`、`.microsoft`、`.edge`)会被 `openclaw doctor --fix` 重写;提交时只使用 `messages.tts.providers.`。 + + + TTS 输入字符数的硬上限。超过时,`/tts audio` 会失败。 + + + 请求超时时间(毫秒)。 + + + 覆盖本地偏好 JSON 路径(提供商/限制/摘要)。默认值为 `~/.openclaw/settings/tts.json`。 + + + + + 回退到 `OPENAI_API_KEY`。 + OpenAI TTS 模型 id(例如 `gpt-4o-mini-tts`)。 + 语音名称(例如 `alloy`、`cedar`)。 + 显式 OpenAI `instructions` 字段。设置后,persona 提示字段**不会**自动映射。 + + 覆盖 OpenAI TTS 端点。解析顺序:配置 → `OPENAI_TTS_BASE_URL` → `https://api.openai.com/v1`。非默认值会被视为 OpenAI 兼容的 TTS 端点,因此接受自定义模型和语音名称。 + + + + + 回退到 `ELEVENLABS_API_KEY` 或 `XI_API_KEY`。 + 模型 id(例如 `eleven_multilingual_v2`、`eleven_v3`)。 + ElevenLabs 语音 id。 + + `stability`、`similarityBoost`、`style`(每项均为 `0..1`)、`useSpeakerBoost`(`true|false`)、`speed`(`0.5..2.0`,`1.0` = 正常)。 + + 文本规范化模式。 + 2 字母 ISO 639-1(例如 `en`、`de`)。 + 整数 `0..4294967295`,用于尽力实现确定性。 + 覆盖 ElevenLabs API 基础 URL。 + + + + 回退到 `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`,即可将当前 persona 提示字段包装进确定性的 Gemini TTS 提示结构中。 + Google 特定的额外 persona 提示文本,会追加到模板的 Director's Notes 中。 + 仅接受 `https://generativelanguage.googleapis.com`。 + + + + 环境变量:`AZURE_SPEECH_KEY`、`AZURE_SPEECH_API_KEY` 或 `SPEECH_KEY`。 + Azure Speech 区域(例如 `eastus`)。环境变量:`AZURE_SPEECH_REGION` 或 `SPEECH_REGION`。 + 可选的 Azure Speech 端点覆盖(别名 `baseUrl`)。 + 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`。 + + + + 允许使用 Microsoft 语音。 + Microsoft 神经语音名称(例如 `en-US-MichelleNeural`)。 + 语言代码(例如 `en-US`)。 + Microsoft 输出格式。默认值为 `audio-24khz-48kbitrate-mono-mp3`。并非所有格式都受内置的 Edge 支持传输层支持。 + 百分比字符串(例如 `+10%`、`-5%`)。 + 将 JSON 字幕与音频文件一起写出。 + Microsoft 语音请求的代理 URL。 + 请求超时覆盖值(毫秒)。 + 旧版别名。运行 `openclaw doctor --fix`,将持久化配置重写为 `providers.microsoft`。 + + + + 回退到 `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`。 + `0.5..2.0`。默认值为 `1.0`。 + `(0, 10]`。默认值为 `1.0`。 + 整数 `-12..12`。默认值为 `0`。小数值会在请求前被截断。 + + + + 环境变量:`INWORLD_API_KEY`。 + 默认值为 `https://api.inworld.ai`。 + 默认值为 `inworld-tts-1.5-max`。另有:`inworld-tts-1.5-mini`、`inworld-tts-1-max`、`inworld-tts-1`。 + 默认值为 `Sarah`。 + 采样温度 `0..2`。 + + + + 环境变量:`XAI_API_KEY`。 + 默认值为 `https://api.x.ai/v1`。环境变量:`XAI_BASE_URL`。 + 默认值为 `eve`。可用实时语音:`ara`、`eve`、`leo`、`rex`、`sal`、`una`。 + BCP-47 语言代码或 `auto`。默认值为 `en`。 + 默认值为 `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`。 + 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`)。 + + + + 环境变量:`XIAOMI_API_KEY`。 + 默认值为 `https://api.xiaomimimo.com/v1`。环境变量:`XIAOMI_BASE_URL`。 + 默认值为 `mimo-v2.5-tts`。环境变量:`XIAOMI_TTS_MODEL`。也支持 `mimo-v2-tts`。 + 默认值为 `mimo_default`。环境变量:`XIAOMI_TTS_VOICE`。 + 默认值为 `mp3`。环境变量:`XIAOMI_TTS_FORMAT`。 + 可选的自然语言风格指令,作为用户消息发送;不会被读出来。 + + + + 环境变量:`OPENROUTER_API_KEY`。可复用 `models.providers.openrouter.apiKey`。 + 默认值为 `https://openrouter.ai/api/v1`。旧版 `https://openrouter.ai/v1` 会被规范化。 + 默认值为 `hexgrad/kokoro-82m`。别名:`modelId`。 + 默认值为 `af_alloy`。别名:`voiceId`。 + 默认值为 `mp3`。 + 提供商原生语速覆盖项。 + + + + 环境变量:`GRADIUM_API_KEY`。 + 默认值为 `https://api.gradium.ai`。 + 默认值为 Emma(`YTpq7expH9539ERJ`)。 + + + + 用于 CLI TTS 的本地可执行文件或命令字符串。 + 命令参数。支持 `{{Text}}`、`{{OutputPath}}`、`{{OutputDir}}`、`{{OutputBase}}` 占位符。 + 预期的 CLI 输出格式。用于音频附件时默认值为 `mp3`。 + 命令超时时间(毫秒)。默认值为 `120000`。 + 可选的命令工作目录。 + 命令的可选环境变量覆盖项。 + + ## 智能体工具 -`tts` 工具会将文本转换为语音,并返回一个用于回复投递的音频附件。当渠道为 Feishu、Matrix、Telegram 或 WhatsApp 时,音频会作为语音消息而不是文件附件投递。 -当 `ffmpeg` 可用时,Feishu 和 WhatsApp 可以在此路径中对非 Opus 的 TTS 输出进行转码。 -WhatsApp 通过 Baileys 以 PTT 语音笔记形式发送音频(带 `ptt: true` 的 `audio`),并将可见文本与 PTT 音频分开发送,因为客户端并不总能稳定显示语音笔记的字幕。 -它接受可选的 `channel` 和 `timeoutMs` 字段;`timeoutMs` 是以毫秒为单位的每次调用提供商请求超时时间。 +`tts` 工具会将文本转换为语音,并返回一个用于回复投递的音频附件。在 Feishu、Matrix、Telegram 和 WhatsApp 上,音频会作为语音消息而不是文件附件投递。当 `ffmpeg` 可用时,Feishu 和 WhatsApp 在此路径上可以对非 Opus 的 TTS 输出进行转码。 + +WhatsApp 通过 Baileys 将音频作为 PTT 语音便笺发送(`audio` 且设置 `ptt: true`),并且会将可见文本与 PTT 音频**分开**发送,因为客户端对语音便笺上的字幕渲染并不始终一致。 + +该工具接受可选的 `channel` 和 `timeoutMs` 字段;`timeoutMs` 是按调用设置的提供商请求超时时间,单位为毫秒。 ## Gateway 网关 RPC -Gateway 网关方法: +| 方法 | 用途 | +| ----------------- | ---------------------------------------- | +| `tts.status` | 读取当前 TTS 状态和最近一次尝试。 | +| `tts.enable` | 将本地自动偏好设置为 `always`。 | +| `tts.disable` | 将本地自动偏好设置为 `off`。 | +| `tts.convert` | 一次性文本 → 音频。 | +| `tts.setProvider` | 设置本地提供商偏好。 | +| `tts.setPersona` | 设置本地 persona 偏好。 | +| `tts.providers` | 列出已配置的提供商及其状态。 | -- `tts.status` -- `tts.enable` -- `tts.disable` -- `tts.convert` -- `tts.setProvider` -- `tts.setPersona` -- `tts.providers` +## 服务链接 -## 相关 +- [OpenAI 文本转语音指南](https://platform.openai.com/docs/guides/text-to-speech) +- [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 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) +- [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) -- [Media overview](/zh-CN/tools/media-overview) -- [Music generation](/zh-CN/tools/music-generation) -- [Video generation](/zh-CN/tools/video-generation) +## 相关内容 + +- [媒体概览](/zh-CN/tools/media-overview) +- [音乐生成](/zh-CN/tools/music-generation) +- [视频生成](/zh-CN/tools/video-generation) +- [斜杠命令](/zh-CN/tools/slash-commands) +- [语音通话插件](/zh-CN/plugins/voice-call)