生成模型 :Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗 :输入 ~98k tokens,输出 ~8k tokens(本节)
文本转语音(Text-to-Speech,TTS)让 Agent 的回复可以变成语音消息发送给用户——这在移动端聊天场景中尤其实用。OpenClaw 的 TTS 模块(src/tts/tts.ts,约 1580 行)支持三个 Provider、四种自动模式、Agent 内联指令覆盖,以及超长文本的自动摘要。
26.4.1 TTS 引擎(src/tts/)
OpenClaw 支持三个 TTS Provider,按可用性自动降级:
Provider
类型
默认模型/声音
API Key 来源
eleven_multilingual_v2 / 预设声音
ELEVENLABS_API_KEY 或 XI_API_KEY
衍生解释 — Edge TTS
Edge TTS 是微软 Edge 浏览器内置的语音合成服务的非官方 Node.js 封装(node-edge-tts 库)。它利用微软认知服务的在线接口,支持数百种语言和声音,无需 API Key,完全免费。由于不需要任何配置,OpenClaw 将其作为默认的 TTS Provider。
Provider 选择的优先级逻辑:
Copy // src/tts/tts.ts
export function getTtsProvider ( config , prefsPath ) : TtsProvider {
// 1. 用户偏好(持久化到 JSON 文件)
const prefs = readPrefs ( prefsPath ) ;
if ( prefs . tts ?. provider ) return prefs . tts . provider ;
// 2. 配置文件显式指定
if ( config . providerSource === " config " ) return config . provider ;
// 3. 自动探测(有 Key 的优先)
if ( resolveTtsApiKey ( config , " openai " )) return " openai " ;
if ( resolveTtsApiKey ( config , " elevenlabs " )) return " elevenlabs " ;
return " edge " ; // 兜底
} TTS 的触发时机通过 TtsAutoMode 控制:
仅当 Agent 输出中包含 [[tts]] 指令标签时生成
自动模式的优先级链为:会话级覆盖 > 用户偏好文件 > 配置文件 。
resolveTtsConfig 将原始 YAML 配置展开为完整的 ResolvedTtsConfig 结构,所有可选字段都填充了默认值:
TTS 偏好(开关、Provider、最大长度、是否摘要)通过 JSON 文件持久化,默认路径为 ~/.config/openclaw/settings/tts.json。偏好文件的读写使用原子写入(先写临时文件再 rename),避免并发写入导致文件损坏:
26.4.2 三个 Provider 的实现
调用 OpenAI 的 /v1/audio/speech 端点:
支持通过 OPENAI_TTS_BASE_URL 环境变量指向自定义 TTS 端点(如本地部署的 Kokoro、LocalAI),此时模型和声音的白名单校验自动放宽。
可用声音 :alloy、ash、coral、echo、fable、onyx、nova、sage、shimmer(9 种)。
ElevenLabs 提供高质量的人声克隆和多语言合成,API 参数最为丰富:
Edge TTS 是最简单的 Provider,通过 node-edge-tts 库直接生成音频文件:
Edge TTS 支持通过输出格式自动推断文件扩展名——如果格式字符串包含 ogg、opus、webm、wav 等关键词,会生成对应扩展名的文件。当自定义格式失败时,自动回退到默认的 MP3 格式。
不同聊天平台对音频格式有不同偏好。TTS 输出格式根据目标通道动态调整:
通道
OpenAI 格式
ElevenLabs 格式
扩展名
语音兼容
Telegram 渠道使用 Opus 编码,因为 Telegram 的语音消息气泡只支持 OGG Opus 格式。
26.4.3 Agent 内联指令
Agent 可以在输出文本中嵌入 [[tts:...]] 指令来控制语音合成的各项参数:
参数指令 :[[tts:key=value key2=value2]]
文本块指令 :[[tts:text]]...[[/tts:text]]
openai / elevenlabs / edge
管理员可以通过 modelOverrides 配置精细控制 Agent 被允许覆盖哪些参数:
当 Agent 的回复超过最大长度限制(默认 1500 字符)时,TTS 模块有两种处理策略:
1. 摘要模式(默认开启) :调用 LLM(默认使用 Agent 的主模型)生成一段不超过 maxLength 字符的摘要,再将摘要转为语音:
2. 截断模式(摘要关闭时) :简单地截断文本到 maxLength - 3 字符并追加 ...。
maybeApplyTtsToPayload 是 TTS 与消息系统的集成入口,流程如下:
textToSpeech 按优先级链尝试所有 Provider。当前 Provider 失败(API Key 缺失、超时、错误)时,自动尝试下一个:
TTS 生成的音频文件保存在系统临时目录(/tmp/tts-xxx/),通过 scheduleCleanup 注册一个 5 分钟后的定时器自动删除:
当 TTS 启用时,buildTtsSystemPromptHint 会向 Agent 的系统提示词中注入 TTS 相关提示:
这让 Agent 知道自己正在语音模式下工作,从而生成更适合朗读的文本。
三 Provider 架构 :OpenAI(高质量)、ElevenLabs(声音克隆)、Edge TTS(免费兜底),按优先级链自动降级。
四种自动模式 :off/always/inbound/tagged,通过会话 > 偏好文件 > 配置三层优先级控制。
通道自适应 :Telegram 使用 Opus 格式(语音气泡),其他平台使用 MP3(文件附件),电话使用 PCM 原始音频。
Agent 内联指令 :通过 [[tts:...]] 标签控制 Provider、声音、语速等参数,由管理员配置的覆盖策略决定哪些参数可被覆盖。
超长文本摘要 :超过限制的文本通过 LLM 摘要或截断处理后再转语音。
临时文件管理 :音频文件保存到 /tmp/,5 分钟后自动清理,定时器设置 unref() 不阻止进程退出。