OpenClaw 白皮书
文本转语音(TTS)
OpenClaw 可以使用 ElevenLabs、OpenAI 或 Edge TTS 将出站回复转换为音频。它可以在任何 OpenClaw 能发送音频的地方工作;Telegram 会显示圆形语音消息气泡。
支持的服务
- ✦ElevenLabs(主要或备用提供商)
- ✦OpenAI(主要或备用提供商;也用于摘要)
- ✦Edge TTS(主要或备用提供商;使用
node-edge-tts,无 API 密钥时为默认)
Edge TTS 注意事项
Edge TTS 通过
node-edge-tts 库使用 Microsoft Edge 的在线神经网络 TTS 服务。它是托管服务(非本地),使用 Microsoft 的端点,不需要 API 密钥。node-edge-tts 公开了语音配置选项和输出格式,但并非所有选项都被 Edge 服务支持。citeturn2search0由于 Edge TTS 是一个没有公布 SLA 或配额的公共 Web 服务,请将其视为尽力而为。如果你需要有保证的限制和支持,请使用 OpenAI 或 ElevenLabs。Microsoft 的语音 REST API 记录了每个请求 10 分钟的音频限制;Edge TTS 没有公布限制,所以假设类似或更低的限制。citeturn0search3
可选密钥
如果你想使用 OpenAI 或 ElevenLabs:
- ✦
ELEVENLABS_API_KEY(或XI_API_KEY) - ✦
OPENAI_API_KEY
Edge TTS 不需要 API 密钥。如果没有找到 API 密钥,OpenClaw 默认使用 Edge TTS(除非通过
messages.tts.edge.enabled=false 禁用)。如果配置了多个提供商,首先使用选定的提供商,其他作为备用选项。自动摘要使用配置的
summaryModel(或 agents.defaults.model.primary),所以如果你启用摘要,该提供商也必须经过认证。服务链接
默认启用吗?
不是。自动 TTS 默认关闭。在配置中使用
messages.tts.auto 或在每个会话中使用 /tts always(别名:/tts on)启用它。一旦 TTS 开启,Edge TTS 是默认启用的,并在没有 OpenAI 或 ElevenLabs API 密钥时自动使用。
配置
最小配置(启用 + 提供商)
json5{ messages: { tts: { auto: "always", provider: "elevenlabs", }, }, }
OpenAI 主要,ElevenLabs 备用
json5{ messages: { tts: { auto: "always", provider: "openai", summaryModel: "openai/gpt-4.1-mini", modelOverrides: { enabled: true, }, openai: { apiKey: "openai_api_key", 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, }, }, }, }, }
Edge TTS 主要(无 API 密钥)
json5{ messages: { tts: { auto: "always", provider: "edge", edge: { enabled: true, voice: "en-US-MichelleNeural", lang: "en-US", outputFormat: "audio-24khz-48kbitrate-mono-mp3", rate: "+10%", pitch: "-5%", }, }, }, }
禁用 Edge TTS
json5{ messages: { tts: { edge: { enabled: false, }, }, }, }
自定义限制 + 偏好路径
json5{ messages: { tts: { auto: "always", maxTextLength: 4000, timeoutMs: 30000, prefsPath: "~/.openclaw/settings/tts.json", }, }, }
仅在收到语音消息后用音频回复
json5{ messages: { tts: { auto: "inbound", }, }, }
禁用长回复的自动摘要
json5{ messages: { tts: { auto: "always", }, }, }
然后运行:
SH/tts summary off
字段说明
- ✦
auto:自动 TTS 模式(off、always、inbound、tagged)。- ✦
inbound仅在收到语音消息后发送音频。 - ✦
tagged仅在回复包含[[tts]]标签时发送音频。
- ✦
- ✦
enabled:旧版开关(doctor 将其迁移到auto)。 - ✦
mode:"final"(默认)或"all"(包括工具/分块回复)。 - ✦
provider:"elevenlabs"、"openai"或"edge"(自动备用)。 - ✦如果
provider未设置,OpenClaw 优先选择openai(如果有密钥),然后是elevenlabs(如果有密钥),否则是edge。 - ✦
summaryModel:用于自动摘要的可选廉价模型;默认为agents.defaults.model.primary。- ✦接受
provider/model或配置的模型别名。
- ✦接受
- ✦
modelOverrides:允许模型发出 TTS 指令(默认开启)。 - ✦
maxTextLength:TTS 输入的硬性上限(字符)。超出时/tts audio会失败。 - ✦
timeoutMs:请求超时(毫秒)。 - ✦
prefsPath:覆盖本地偏好 JSON 路径(提供商/限制/摘要)。 - ✦
apiKey值回退到环境变量(ELEVENLABS_API_KEY/XI_API_KEY、OPENAI_API_KEY)。 - ✦
elevenlabs.baseUrl:覆盖 ElevenLabs API 基础 URL。 - ✦
elevenlabs.voiceSettings:- ✦
stability、similarityBoost、style:0..1 - ✦
useSpeakerBoost:true|false - ✦
speed:0.5..2.0(1.0 = 正常)
- ✦
- ✦
elevenlabs.applyTextNormalization:auto|on|off - ✦
elevenlabs.languageCode:2 字母 ISO 639-1(例如en、de) - ✦
elevenlabs.seed:整数0..4294967295(尽力确定性) - ✦
edge.enabled:允许 Edge TTS 使用(默认true;无 API 密钥)。 - ✦
edge.voice:Edge 神经网络语音名称(例如en-US-MichelleNeural)。 - ✦
edge.lang:语言代码(例如en-US)。 - ✦
edge.outputFormat:Edge 输出格式(例如audio-24khz-48kbitrate-mono-mp3)。- ✦有效值参见 Microsoft 语音输出格式;并非所有格式都被 Edge 支持。
- ✦
edge.rate/edge.pitch/edge.volume:百分比字符串(例如+10%、-5%)。 - ✦
edge.saveSubtitles:在音频文件旁边写入 JSON 字幕。 - ✦
edge.proxy:Edge TTS 请求的代理 URL。 - ✦
edge.timeoutMs:请求超时覆盖(毫秒)。
模型驱动覆盖(默认开启)
默认情况下,模型可以为单个回复发出 TTS 指令。当
messages.tts.auto 为 tagged 时,需要这些指令来触发音频。启用后,模型可以发出
[[tts:...]] 指令来覆盖单个回复的语音,加上可选的 [[tts:text]]...[[/tts:text]] 块来提供表达性标签(笑声、唱歌提示等),这些仅应出现在音频中。示例回复负载:
SHHere you go. [[tts:provider=elevenlabs voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]] [[tts:text]](laughs) Read the song once more.[[/tts:text]]
可用指令键(启用时):
- ✦
provider(openai|elevenlabs|edge) - ✦
voice(OpenAI 语音)或voiceId(ElevenLabs) - ✦
model(OpenAI TTS 模型或 ElevenLabs 模型 ID) - ✦
stability、similarityBoost、style、speed、useSpeakerBoost - ✦
applyTextNormalization(auto|on|off) - ✦
languageCode(ISO 639-1) - ✦
seed
禁用所有模型覆盖:
json5{ messages: { tts: { modelOverrides: { enabled: false, }, }, }, }
可选白名单(禁用特定覆盖同时保持标签启用):
json5{ messages: { tts: { modelOverrides: { enabled: true, allowProvider: false, allowSeed: false, }, }, }, }
单用户偏好
斜杠命令将本地覆盖写入
prefsPath(默认:~/.openclaw/settings/tts.json,可通过 OPENCLAW_TTS_PREFS 或 messages.tts.prefsPath 覆盖)。存储的字段:
- ✦
enabled - ✦
provider - ✦
maxLength(摘要阈值;默认 1500 字符) - ✦
summarize(默认true)
这些为该主机覆盖
messages.tts.*。输出格式(固定)
- ✦Telegram:Opus 语音消息(ElevenLabs 的
opus_48000_64,OpenAI 的opus)。- ✦48kHz / 64kbps 是语音消息的良好权衡,圆形气泡所必需。
- ✦其他渠道:MP3(ElevenLabs 的
mp3_44100_128,OpenAI 的mp3)。- ✦44.1kHz / 128kbps 是语音清晰度的默认平衡。
- ✦Edge TTS:使用
edge.outputFormat(默认audio-24khz-48kbitrate-mono-mp3)。- ✦
node-edge-tts接受outputFormat,但并非所有格式都可从 Edge 服务获得。citeturn2search0 - ✦输出格式值遵循 Microsoft 语音输出格式(包括 Ogg/WebM Opus)。citeturn1search0
- ✦Telegram
sendVoice接受 OGG/MP3/M4A;如果你需要有保证的 Opus 语音消息,请使用 OpenAI/ElevenLabs。citeturn1search1 - ✦如果配置的 Edge 输出格式失败,OpenClaw 会使用 MP3 重试。
- ✦
OpenAI/ElevenLabs 格式是固定的;Telegram 期望 Opus 以获得语音消息用户体验。
自动 TTS 行为
启用后,OpenClaw:
- ✦如果回复已包含媒体或
MEDIA:指令,则跳过 TTS。 - ✦跳过非常短的回复(< 10 字符)。
- ✦启用时使用
agents.defaults.model.primary(或summaryModel)对长回复进行摘要。 - ✦将生成的音频附加到回复中。
如果回复超过
maxLength 且摘要关闭(或没有摘要模型的 API 密钥),则跳过音频并发送正常的文本回复。流程图
SH回复 -> TTS 启用? 否 -> 发送文本 是 -> 有媒体 / MEDIA: / 太短? 是 -> 发送文本 否 -> 长度 > 限制? 否 -> TTS -> 附加音频 是 -> 摘要启用? 否 -> 发送文本 是 -> 摘要(summaryModel 或 agents.defaults.model.primary) -> TTS -> 附加音频
斜杠命令用法
只有一个命令:
/tts。参见斜杠命令了解启用详情。Discord 注意:
/tts 是 Discord 的内置命令,所以 OpenClaw 在那里注册 /voice 作为原生命令。文本 /tts ... 仍然有效。SH/tts off /tts always /tts inbound /tts tagged /tts status /tts provider openai /tts limit 2000 /tts summary off /tts audio Hello from OpenClaw
注意事项:
- ✦命令需要授权发送者(白名单/所有者规则仍然适用)。
- ✦必须启用
commands.text或原生命令注册。 - ✦
off|always|inbound|tagged是单会话开关(/tts on是/tts always的别名)。 - ✦
limit和summary存储在本地偏好中,不在主配置中。 - ✦
/tts audio生成一次性音频回复(不会开启 TTS)。
智能体工具
tts 工具将文本转换为语音并返回 MEDIA: 路径。当结果与 Telegram 兼容时,工具包含 [[audio_as_voice]],以便 Telegram 发送语音气泡。Gateway 网关 RPC
Gateway 网关方法:
- ✦
tts.status - ✦
tts.enable - ✦
tts.disable - ✦
tts.convert - ✦
tts.setProvider - ✦
tts.providers