TTS config lives under tts in ~/.openclaw/openclaw.json. Pick a
preset and adapt the provider block. The speakerVoice/speakerVoiceId
fields shown below are the current names; each provider's own voice/voiceId/
voiceName field names still work as legacy aliases.
OpenRouter and DeepInfra use the first nonblank value from speakerVoice,
speakerVoiceId, voice, and voiceId, in that order, before the provider default.
Talk applies the same order to its provider block; when all four fields are absent
or blank, it keeps the base TTS voice.
For Xiaomi mimo-v2.5-tts-voicedesign, omit speakerVoice and set style to
the voice-design prompt. OpenClaw sends that prompt as the TTS user message
and does not send audio.voice for the voicedesign model.
Local Speech Swift and speech-core
Speech Swift and
speech-core provide local speech
inference across macOS, Linux, and Windows. Use the OpenAI-compatible HTTP
provider when Speech Swift and OpenClaw run on the same Mac. Use Local CLI for
direct executable integration on any supported host.
Install ffmpeg when a channel needs OpenClaw to convert WAV output to Opus or
raw PCM.
macOS HTTP
Start Speech Swift's local server:
bash
brew install speechspeech-server --port 8080
Point the OpenAI speech provider at its loopback endpoint. responseFormat
must be wav because the local endpoint does not emit compressed audio:
tts-1 selects Kokoro. Speech Swift registry aliases such as qwen3-tts,
cosyvoice, and voxcpm2 select other local engines. The placeholder API key
is required by OpenClaw's provider configuration but is not validated by the
loopback server.
macOS CLI
The Homebrew speech executable can write directly to OpenClaw's
per-invocation output path:
Set-ExecutionPolicy -Scope Process Bypass lets the unsigned
speech_download_models.ps1 run in this shell only. -Scope Process does not
change the machine or user execution policy, and the relaxation ends when the
shell exits.
Then point Local CLI at the packaged Kokoro executable. Replace C:\path\to
with your extraction directory, and 0.0.11 with the $Version you downloaded:
Use agents.entries.*.tts when one agent should speak with a different provider,
voice, model, persona, or auto-TTS mode. The agent block deep-merges over
tts, so provider credentials can stay in the global provider config:
To pin a per-agent persona, set agents.entries.*.tts.persona alongside provider
config — it overrides the global tts.persona for that agent only.
Precedence order for automatic replies, /tts audio, /tts status, and the
tts agent tool. Later layers win: each layer deep-merges over the ones above
it, so the last layer that sets a field decides its value.
tts
active agents.entries.*.tts
channel override, when the channel supports channels.<channel>.tts
account override, when the channel passes channels.<channel>.accounts.<id>.tts
local /tts preferences for this host
inline [[tts:...]] directives when model overrides are enabled
Channel and account overrides use the same shape as tts and
deep-merge over the earlier layers, so shared provider credentials can stay in
tts while a channel or bot account changes only speaker voice, model, persona,
or auto mode: