Skip to content

文字转语音(TTS)

OpenClaw 可以使用 ElevenLabs、Microsoft 或 OpenAI 将出站回复转换为音频,在任何 OpenClaw 能发送音频的地方都能工作。

支持的服务

  • ElevenLabs(主提供商或备用提供商)
  • Microsoft(主提供商或备用提供商;当前捆绑实现使用 node-edge-tts
  • OpenAI(主提供商或备用提供商;也用于摘要)

Microsoft 语音说明

捆绑的 Microsoft 语音提供商目前通过 node-edge-tts 库使用 Microsoft Edge 的在线神经 TTS 服务。这是一个托管服务(非本地),使用 Microsoft 端点,不需要 API Keynode-edge-tts 提供语音配置选项和输出格式,但并非所有选项都受服务支持。使用 edge 的旧版配置和指令输入仍然有效,并被规范化为 microsoft

由于此路径是没有公开 SLA 或配额的公共 Web 服务,请将其视为尽力而为。若需要有保证的限制和支持,请使用 OpenAI 或 ElevenLabs。

可选密钥

若要使用 OpenAI 或 ElevenLabs:

  • ELEVENLABS_API_KEY(或 XI_API_KEY
  • OPENAI_API_KEY

Microsoft 语音不需要 API Key。

若配置了多个提供商,优先使用所选提供商,其他作为备用。自动摘要使用已配置的 summaryModel(或 agents.defaults.model.primary),因此若启用摘要,该提供商也必须已认证。

服务链接

默认是否启用?

不启用。Auto-TTS 默认关闭。通过配置中的 messages.tts.auto 启用,或通过会话命令 /tts always(别名:/tts on)启用。

若未设置 messages.tts.provider,OpenClaw 按注册表自动选择顺序选取第一个已配置的语音提供商。

配置

TTS 配置位于 openclaw.jsonmessages.tts 下。完整 schema 见网关配置

最小配置(启用 + 提供商)

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,
      },
      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,
          },
        },
      },
    },
  },
}

Microsoft 主提供商(无 API Key)

json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "microsoft",
      providers: {
        microsoft: {
          enabled: true,
          voice: "en-US-MichelleNeural",
          lang: "en-US",
          outputFormat: "audio-24khz-48kbitrate-mono-mp3",
          rate: "+10%",
          pitch: "-5%",
        },
      },
    },
  },
}

禁用 Microsoft 语音

json5
{
  messages: {
    tts: {
      providers: {
        microsoft: {
          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",
    },
  },
}

然后运行:

/tts summary off

字段说明

  • auto:Auto-TTS 模式(offalwaysinboundtagged)。
    • inbound 仅在收到入站语音消息后发送音频。
    • tagged 仅在回复包含 [[tts]] 标签时发送音频。
  • enabled:旧版开关(doctor 会将其迁移到 auto)。
  • mode"final"(默认)或 "all"(包含工具/块回复)。
  • provider:语音提供商 ID,如 "elevenlabs""microsoft""openai"(备用自动)。
  • provider 未设置,OpenClaw 按注册表自动选择顺序使用第一个已配置的语音提供商。
  • 旧版 provider: "edge" 仍有效,规范化为 microsoft
  • summaryModel:Auto-摘要的可选低廉模型;默认为 agents.defaults.model.primary。接受 provider/model 或已配置的模型别名。
  • modelOverrides:允许模型发出 TTS 指令(默认开启)。allowProvider 默认为 false(提供商切换为可选项)。
  • providers.<id>:按语音提供商 ID 键控的提供商自有设置。
  • maxTextLength:TTS 输入的硬性字符上限。/tts audio 超出时失败。
  • timeoutMs:请求超时(毫秒)。
  • prefsPath:覆盖本地偏好 JSON 路径(提供商/限制/摘要)。
  • apiKey 值回退到环境变量(ELEVENLABS_API_KEY/XI_API_KEYOPENAI_API_KEY)。
  • providers.elevenlabs.baseUrl:覆盖 ElevenLabs API 基础 URL。
  • providers.openai.baseUrl:覆盖 OpenAI TTS 端点。解析顺序:messages.tts.providers.openai.baseUrlOPENAI_TTS_BASE_URLhttps://api.openai.com/v1。非默认值视为 OpenAI 兼容 TTS 端点,接受自定义模型和语音名称。
  • providers.elevenlabs.voiceSettingsstabilitysimilarityBooststyle0..1useSpeakerBoosttrue|falsespeed0.5..2.0(1.0 = 正常)。
  • providers.elevenlabs.applyTextNormalizationauto|on|off
  • providers.elevenlabs.languageCode:2 字母 ISO 639-1(如 ende)。
  • providers.elevenlabs.seed:整数 0..4294967295(尽力确定性)。
  • providers.microsoft.enabled:允许使用 Microsoft 语音(默认 true;无 API Key)。
  • providers.microsoft.voice:Microsoft 神经语音名称(如 en-US-MichelleNeural)。
  • providers.microsoft.lang:语言代码(如 en-US)。
  • providers.microsoft.outputFormat:Microsoft 输出格式(如 audio-24khz-48kbitrate-mono-mp3)。
  • 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 设置的旧版别名。

模型驱动覆盖(默认开启)

默认情况下,模型可以针对单次回复发出 TTS 指令。当 messages.tts.autotagged 时,这些指令是触发音频所必需的。

启用时,模型可以发出 [[tts:...]] 指令覆盖单次回复的语音,以及可选的 [[tts:text]]...[[/tts:text]] 块提供仅出现在音频中的表达性标签(笑声、演唱提示等)。

除非 modelOverrides.allowProvider: true,否则 provider=... 指令会被忽略。

示例回复载荷:

Here you go.

[[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]]
[[tts:text]](laughs) Read the song once more.[[/tts:text]]

启用时的可用指令键:

  • provider(注册的语音提供商 ID,如 openaielevenlabsmicrosoft;需要 allowProvider: true
  • voice(OpenAI 语音)或 voiceId(ElevenLabs)
  • model(OpenAI TTS 模型或 ElevenLabs 模型 ID)
  • stabilitysimilarityBooststylespeeduseSpeakerBoost
  • applyTextNormalizationauto|on|off
  • languageCode(ISO 639-1)
  • seed

禁用所有模型覆盖:

json5
{
  messages: {
    tts: {
      modelOverrides: {
        enabled: false,
      },
    },
  },
}

可选白名单(启用提供商切换同时保持其他旋钮可配置):

json5
{
  messages: {
    tts: {
      modelOverrides: {
        enabled: true,
        allowProvider: true,
        allowSeed: false,
      },
    },
  },
}

每用户偏好

Slash 命令将本地覆盖写入 prefsPath(默认:~/.openclaw/settings/tts.json,通过 OPENCLAW_TTS_PREFSmessages.tts.prefsPath 覆盖)。

存储字段:

  • enabled
  • provider
  • maxLength(摘要阈值;默认 1500 字符)
  • summarize(默认 true

这些设置覆盖该主机的 messages.tts.*

输出格式(固定)

  • Feishu / Matrix / Telegram / WhatsApp:Opus 语音消息(ElevenLabs 的 opus_48000_64,OpenAI 的 opus)。48kHz / 64kbps 是语音消息的良好权衡。
  • 其他频道:MP3(ElevenLabs 的 mp3_44100_128,OpenAI 的 mp3)。44.1kHz / 128kbps 是语音清晰度的默认平衡。
  • Microsoft:使用 microsoft.outputFormat(默认 audio-24khz-48kbitrate-mono-mp3)。捆绑传输接受 outputFormat,但并非所有格式都可从服务获取。若配置的 Microsoft 输出格式失败,OpenClaw 以 MP3 重试。

Auto-TTS 行为

启用时,OpenClaw:

  • 若回复已包含媒体或 MEDIA: 指令,跳过 TTS。
  • 跳过非常短的回复(< 10 字符)。
  • 启用时使用 agents.defaults.model.primary(或 summaryModel)对长回复进行摘要。
  • 将生成的音频附加到回复中。

若回复超过 maxLength 且摘要关闭(或摘要模型无 API Key),则跳过音频,发送普通文本回复。

流程图

回复 -> TTS 已启用?
  否  -> 发送文本
  是  -> 包含媒体 / MEDIA: / 太短?
          是 -> 发送文本
          否  -> 长度 > 限制?
                   否  -> TTS -> 附加音频
                   是  -> 摘要已启用?
                            否  -> 发送文本
                            是  -> 摘要(summaryModel 或 agents.defaults.model.primary)
                                      -> TTS -> 附加音频

Slash 命令用法

单一命令:/tts。启用细节见Slash 命令

Discord 注意:/tts 是 Discord 内置命令,因此 OpenClaw 在那里注册 /voice 作为原生命令。文本 /tts ... 仍有效。

/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 的别名)。
  • limitsummary 存储在本地偏好中,而非主配置。
  • /tts audio 生成一次性音频回复(不切换 TTS 开启状态)。

代理工具

tts 工具将文本转换为语音,并返回用于回复投递的音频附件。当频道为 Feishu、Matrix、Telegram 或 WhatsApp 时,音频以语音消息而非文件附件的形式投递。

网关 RPC

网关方法:

  • tts.status
  • tts.enable
  • tts.disable
  • tts.convert
  • tts.setProvider
  • tts.providers