* refactor(config): consolidate media model lists * refactor(config): unify memory configuration * refactor(config): consolidate TTS ownership * refactor(config): move typing policy to agents * refactor(config): retire product-level config surfaces * refactor(config): share scoped tool policy type * chore(config): refresh generated baselines * fix(config): honor agent typing overrides * fix(config): migrate sibling config consumers * refactor(infra): keep base64url decoder private * fix(config): strip invalid legacy TTS values * chore(config): refresh rebased baseline hash * fix(doctor): route legacy messages.tts.realtime voice to talk during tts move * refactor(config): polish final layout names * refactor(config): freeze retired tuning defaults * feat(config): add fast mode default symmetry * refactor(config): key agent entries by id * docs(config): update final layout reference * test(config): cover final layout migrations * chore(config): refresh final layout baselines * fix(config): align final layout runtime readers * fix(config): align remaining readers * fix(config): stabilize final layout migrations * fix(config): finalize config projection proof * fix(config): address final layout review * docs(release): preserve historical config names * fix(config): complete keyed agent migration * fix(config): close final migration gaps * fix(config): finish full-branch review * fix(config): complete runtime secret detection * fix(config): close final review findings * fix(config): finish canonical docs and heartbeat migration * fix(config): integrate latest main after rebase * refactor(env): isolate test-only controls * refactor(env): isolate build and development controls * refactor(env): collapse process identity indirection * refactor(env): remove duplicate config and temp aliases * docs(env): define the operator-facing allowlist * ci(env): ratchet production variable count * fix(env): remove stale provider helper import * fix(env): make ratchet sorting explicit * test(env): keep test seam in dead-code audit * test(env): cover ratchet growth and boundary; document surface budgets * docs(config): document tier-eval consolidations * docs(config): clarify speech preference ownership * test(memory): align retired tuning fixtures * refactor(memory): freeze engine heuristics * refactor(config): apply tier-eval tranche * refactor(tts): move persona shaping to providers * refactor(compaction): move prompt policy to providers * test(config): align hookified prompt fixtures * chore(deadcode): classify test-only exports * chore(github): remove unused spawn helper * chore(deadcode): classify queue diagnostics * chore(deadcode): remove unused lane snapshot export * chore(plugin-sdk): ratchet consolidated surface * fix(config): integrate latest main after rebase
4.8 KiB
summary, read_when, title
| summary | read_when | title | |||
|---|---|---|---|---|---|
| Use ElevenLabs speech, Scribe STT, and realtime transcription with OpenClaw |
|
ElevenLabs |
OpenClaw uses ElevenLabs for text-to-speech, batch speech-to-text with Scribe
v2, and streaming STT with Scribe v2 Realtime. The plugin is bundled and
enabled by default; no plugins install step is needed.
| Capability | OpenClaw surface | Default |
|---|---|---|
| Text-to-speech | tts / talk |
eleven_multilingual_v2 |
| Batch speech-to-text | tools.media.audio |
scribe_v2 |
| Streaming speech-to-text | Voice Call streaming or Google Meet realtime.transcriptionProvider |
scribe_v2_realtime |
Authentication
Set ELEVENLABS_API_KEY in the environment. XI_API_KEY is also accepted for
compatibility with existing ElevenLabs tooling.
export ELEVENLABS_API_KEY="..."
Text-to-speech
{
tts: {
providers: {
elevenlabs: {
apiKey: "${ELEVENLABS_API_KEY}",
voiceId: "pMsXgVXv3BLzUgSXRplE",
modelId: "eleven_multilingual_v2",
},
},
},
}
Set modelId to eleven_v3 to use ElevenLabs v3 TTS. OpenClaw keeps
eleven_multilingual_v2 as the default for existing installs.
Discord voice channels use ElevenLabs' streaming TTS endpoint when ElevenLabs
is the selected voice.tts/tts provider: playback starts from the
returned audio stream instead of waiting for OpenClaw to download the whole
audio file first. latencyTier maps to ElevenLabs' optimize_streaming_latency
query parameter for models that accept it; OpenClaw omits that parameter for
eleven_v3, which rejects it.
Speech-to-text
Use Scribe v2 for inbound audio attachments and short recorded voice segments:
{
tools: {
media: {
audio: {
enabled: true,
models: [{ provider: "elevenlabs", model: "scribe_v2" }],
},
},
},
}
OpenClaw sends multipart audio to ElevenLabs /v1/speech-to-text with
model_id: "scribe_v2". Language hints map to language_code when present.
Streaming STT
The bundled elevenlabs plugin registers Scribe v2 Realtime for Voice Call and
Google Meet agent-mode streaming transcription.
| Setting | Config path | Default |
|---|---|---|
| API key | plugins.entries.voice-call.config.streaming.providers.elevenlabs.apiKey |
Falls back to ELEVENLABS_API_KEY / XI_API_KEY |
| Model | ...elevenlabs.modelId |
scribe_v2_realtime |
| Audio format | ...elevenlabs.audioFormat |
ulaw_8000 |
| Sample rate | ...elevenlabs.sampleRate |
8000 |
| Commit strategy | ...elevenlabs.commitStrategy |
vad |
| Language | ...elevenlabs.languageCode |
(unset) |
{
plugins: {
entries: {
"voice-call": {
config: {
streaming: {
enabled: true,
provider: "elevenlabs",
providers: {
elevenlabs: {
apiKey: "${ELEVENLABS_API_KEY}",
audioFormat: "ulaw_8000",
commitStrategy: "vad",
languageCode: "en",
},
},
},
},
},
},
},
}
For Google Meet agent mode, set
plugins.entries.google-meet.config.realtime.transcriptionProvider to
"elevenlabs" and configure the same provider block under
plugins.entries.google-meet.config.realtime.providers.elevenlabs.