跳转至

文本转语音配置

配置

TTS 配置位于 ~/.openclaw/openclaw.json 中的 tts 下。选择一个 预设并调整 provider 块。下面显示的 speakerVoice/speakerVoiceId 字段是规范字段;每个 provider 自身的 voice/voiceId/ voiceName 字段名仍可作为旧版别名使用。

OpenRouter 和 DeepInfra 会按顺序使用 speakerVoice、 speakerVoiceId、voice 和 voiceId 中第一个非空值,然后才使用 provider 默认值。 Talk 对其 provider 块应用相同顺序;当这四个字段都不存在 或为空时,它会保留基础 TTS 语音。

{
  tts: {
    auto: "always",
    provider: "azure-speech",
    providers: {
      "azure-speech": {
        apiKey: "${AZURE_SPEECH_KEY}",
        region: "eastus",
        speakerVoice: "en-US-JennyNeural",
        lang: "en-US",
        outputFormat: "audio-24khz-48kbitrate-mono-mp3",
        voiceNoteOutputFormat: "ogg-24khz-16bit-mono-opus",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "elevenlabs",
    providers: {
      elevenlabs: {
        apiKey: "${ELEVENLABS_API_KEY}",
        modelId: "eleven_multilingual_v2",
        speakerVoiceId: "EXAVITQu4vr4xnSDxMaL",
      },
    },
  },
}
{
  tts: {
    auto: "tagged",
    provider: "fish-audio",
    providers: {
      "fish-audio": {
        apiKey: "${FISH_API_KEY}",
        model: "s2.1-pro",
        speakerVoiceId: "802e3bc2b27e49c2995d23ef70e6ac89",
        latency: "balanced",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "google",
    providers: {
      google: {
        apiKey: "${GEMINI_API_KEY}",
        model: "gemini-3.8-flash-tts",
        speakerVoice: "Kore",
        // Optional natural-language style prompts:
        // audioProfile: "Speak in a calm, podcast-host tone.",
        // speakerName: "Alex",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "gradium",
    providers: {
      gradium: {
        apiKey: "${GRADIUM_API_KEY}",
        speakerVoiceId: "YTpq7expH9539ERJ",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "inworld",
    providers: {
      inworld: {
        apiKey: "${INWORLD_API_KEY}",
        modelId: "inworld-tts-1.5-max",
        speakerVoiceId: "Sarah",
        temperature: 0.7,
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "tts-local-cli",
    providers: {
      "tts-local-cli": {
        command: "say",
        args: ["-o", "{{OutputPath}}", "{{Text}}"],
        outputFormat: "wav",
        timeoutMs: 120000,
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "microsoft",
    providers: {
      microsoft: {
        enabled: true,
        speakerVoice: "en-US-MichelleNeural",
        lang: "en-US",
        outputFormat: "audio-24khz-48kbitrate-mono-mp3",
        rate: "+0%",
        pitch: "+0%",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "minimax",
    providers: {
      minimax: {
        apiKey: "${MINIMAX_API_KEY}",
        model: "speech-2.8-hd",
        speakerVoiceId: "English_expressive_narrator",
        speed: 1.0,
        vol: 1.0,
        pitch: 0,
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "openai",
    summaryModel: "openai/gpt-4.1-mini",
    modelOverrides: { enabled: true },
    providers: {
      openai: {
        apiKey: "${OPENAI_API_KEY}",
        model: "gpt-4o-mini-tts",
        speakerVoice: "alloy",
      },
      elevenlabs: {
        apiKey: "${ELEVENLABS_API_KEY}",
        modelId: "eleven_multilingual_v2",
        speakerVoiceId: "EXAVITQu4vr4xnSDxMaL",
        voiceSettings: { stability: 0.5, similarityBoost: 0.75, style: 0.0, useSpeakerBoost: true, speed: 1.0 },
        applyTextNormalization: "auto",
        languageCode: "en",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "openrouter",
    providers: {
      openrouter: {
        apiKey: "${OPENROUTER_API_KEY}",
        model: "hexgrad/kokoro-82m",
        speakerVoice: "af_alloy",
        responseFormat: "mp3",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "volcengine",
    providers: {
      volcengine: {
        apiKey: "${VOLCENGINE_TTS_API_KEY}",
        resourceId: "seed-tts-1.0",
        speakerVoice: "en_female_anna_mars_bigtts",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "xai",
    providers: {
      xai: {
        apiKey: "${XAI_API_KEY}",
        speakerVoiceId: "eve",
        language: "en",
        responseFormat: "mp3",
      },
    },
  },
}
{
  tts: {
    auto: "always",
    provider: "xiaomi",
    providers: {
      xiaomi: {
        apiKey: "${XIAOMI_API_KEY}",
        model: "mimo-v2.5-tts",
        speakerVoice: "mimo_default",
        format: "mp3",
      },
    },
  },
}

对于 Xiaomi mimo-v2.5-tts-voicedesign,省略 speakerVoice,并将 style 设置为 语音设计提示词。OpenClaw 会将该提示词作为 TTS user 消息发送,并且不会为 voicedesign 模型发送 audio.voice。

本地 Speech Swift 和 speech-core

Speech Swift 和 speech-core 在 macOS、Linux 和 Windows 上提供本地语音推理。当 Speech Swift 和 OpenClaw 运行在同一台 Mac 上时,请使用 OpenAI 兼容的 HTTP 提供商。在任意受支持的主机上,使用 Local CLI 进行可执行文件的直接集成。

当某个通道需要 OpenClaw 将 WAV 输出转换为 Opus 或原始 PCM 时,请安装 ffmpeg。

Warning

此 HTTP 设置需要 Speech Swift v0.0.23 或更高版本。如果 Homebrew 已经 安装了旧版本,请先运行 brew update && brew upgrade speech。

启动 Speech Swift 的本地服务器:

brew install speech
speech-server --port 8080

将 OpenAI 语音提供商指向其回环端点。由于本地端点不会输出压缩音频,responseFormat 必须为 wav:

{
  tts: {
    auto: "always",
    provider: "openai",
    providers: {
      openai: {
        apiKey: "local",
        baseUrl: "http://127.0.0.1:8080/v1",
        model: "tts-1",
        speakerVoice: "alloy",
        responseFormat: "wav",
      },
    },
  },
}

tts-1 选择 Kokoro。Speech Swift 注册表别名(例如 qwen3-tts、 cosyvoice 和 voxcpm2)可选择其他本地引擎。占位符 API 密钥是 OpenClaw 提供商配置所必需的,但回环服务器不会对其进行验证。

Homebrew 的 speech 可执行文件可以直接写入 OpenClaw 的每次调用输出路径:

{
  tts: {
    auto: "always",
    provider: "tts-local-cli",
    providers: {
      "tts-local-cli": {
        command: "speech",
        args: ["speak", "{{Text}}", "--output", "{{OutputPath}}"],
        outputFormat: "wav",
        timeoutMs: 120000,
      },
    },
  },
}

安装 speech-core Linux 发布包,一次性下载 ONNX 模型集,并在启动 OpenClaw 之前验证合成:

speech download-models
speech speak "Hello from OpenClaw" hello.wav

然后配置打包的 Kokoro 命令:

{
  tts: {
    auto: "always",
    provider: "tts-local-cli",
    providers: {
      "tts-local-cli": {
        command: "speech",
        args: ["speak", "{{Text}}", "{{OutputPath}}"],
        outputFormat: "wav",
        timeoutMs: 120000,
      },
    },
  },
}

有关发布包和模型目录设置,请参阅 speech-core Linux CLI 参考。

下载 speech-core Windows 发布版,解压它,并一次性安装 ONNX 模型:

$Version = "0.0.11"
$Url = "https://github.com/soniqo/speech-core/releases/download/v$Version/speech-$Version-windows-x64.zip"
Invoke-WebRequest $Url -OutFile speech.zip
Expand-Archive speech.zip
Set-Location "speech\speech-$Version-windows-x64\bin"
Set-ExecutionPolicy -Scope Process Bypass
.\speech_download_models.ps1

Set-ExecutionPolicy -Scope Process Bypass 仅允许未签名的 speech_download_models.ps1 在此 shell 中运行。-Scope Process 不会 更改机器或用户执行策略,并且放宽会在 shell 退出时结束。

然后将 Local CLI 指向打包的 Kokoro 可执行文件。将 C:\path\to 替换为你的解压目录,并将 0.0.11 替换为你下载的 $Version:

{
  tts: {
    auto: "always",
    provider: "tts-local-cli",
    providers: {
      "tts-local-cli": {
        command: "C:\\path\\to\\speech-0.0.11-windows-x64\\bin\\speech_synthesize.exe",
        args: ["{{OutputPath}}", "{{Text}}", "en"],
        outputFormat: "wav",
        timeoutMs: 120000,
      },
    },
  },
}

有关打包服务器、模型缓存和独立命令语法,请参阅 speech-core Windows CLI 参考。

按代理的语音覆盖

当某个代理需要使用不同的提供商、语音、模型、角色或自动 TTS 模式进行语音输出时,请使用 agents.entries.*.tts。代理块会深度合并到 tts 之上,因此提供商凭据可以保留在全局提供商配置中:

{
  tts: {
    auto: "always",
    provider: "elevenlabs",
    providers: {
      elevenlabs: { apiKey: "${ELEVENLABS_API_KEY}", modelId: "eleven_multilingual_v2" },
    },
  },
  agents: {
    entries: {
      reader: {
        default: true,
        tts: {
          providers: {
            elevenlabs: { speakerVoiceId: "EXAVITQu4vr4xnSDxMaL" },
          },
        },
      },
    },
  },
}

要固定某个代理的角色,请在提供商配置旁设置 agents.entries.*.tts.persona —— 它仅对该代理覆盖全局 tts.persona。

自动回复、/tts audio、/tts status 以及 tts 代理工具的优先级顺序。后面的层优先:每一层都会深度合并到其上方的层之上,因此最后设置某个字段的层决定其值。

  1. tts
  2. 活动的 agents.entries.*.tts
  3. 通道覆盖,当通道支持 channels.<channel>.tts 时
  4. 账户覆盖,当通道传递 channels.<channel>.accounts.<id>.tts 时
  5. 此主机的本地 /tts 偏好设置
  6. 当启用 模型覆盖 时,内联 [[tts:...]] 指令

通道和账户覆盖使用与 tts 相同的结构,并深度合并到前面的层之上,因此共享的提供商凭据可以保留在 tts 中,而通道或机器人账户只需更改说话人语音、模型、角色 或自动模式:

{
  tts: {
    provider: "openai",
    providers: {
      openai: { apiKey: "${OPENAI_API_KEY}", model: "gpt-4o-mini-tts" },
    },
  },
  channels: {
    feishu: {
      accounts: {
        english: {
          tts: {
            providers: {
              openai: { speakerVoice: "shimmer" },
            },
          },
        },
      },
    },
  },
}

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw