* 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.1 KiB
summary, read_when, title
| summary | read_when | title | ||
|---|---|---|---|---|
| Use Gradium text-to-speech in OpenClaw |
|
Gradium |
Gradium is a text-to-speech provider for OpenClaw. It renders standard audio replies (WAV), voice-note-compatible Opus output, and 8 kHz u-law audio for telephony surfaces.
| Property | Value |
|---|---|
| Provider id | gradium |
| Auth | GRADIUM_API_KEY or config apiKey |
| Base URL | https://api.gradium.ai (default) |
| Default voice | Emma (YTpq7expH9539ERJ) |
Install plugin
Gradium is an official external plugin. Install it, then restart Gateway:
openclaw plugins install @openclaw/gradium-speech
openclaw gateway restart
Setup
Create a Gradium API key, then expose it with an env var or the config key. Config takes precedence over the env var.
```bash export GRADIUM_API_KEY="gsk_..." ``` ```json5 { tts: { auto: "always", provider: "gradium", providers: { gradium: { apiKey: "${GRADIUM_API_KEY}", }, }, }, } ```Config
{
tts: {
auto: "always",
provider: "gradium",
providers: {
gradium: {
speakerVoiceId: "YTpq7expH9539ERJ",
// apiKey: "${GRADIUM_API_KEY}",
// baseUrl: "https://api.gradium.ai",
},
},
},
}
| Key | Type | Description |
|---|---|---|
tts.providers.gradium.apiKey |
string | Resolved API key. Supports ${ENV} and secret refs. |
tts.providers.gradium.baseUrl |
string | HTTPS Gradium API URL on api.gradium.ai. Trailing slashes stripped. Default https://api.gradium.ai. |
tts.providers.gradium.speakerVoiceId |
string | Default voice id used when no directive override is present. |
Output format is chosen automatically by target surface (see Output) and is not configurable in openclaw.json.
Voices
| Name | Voice ID |
|---|---|
| Arthur | 3jUdJyOi9pgbxBTK |
| Christina | 2H4HY2CBNyJHBCrP |
| Emma (default) | YTpq7expH9539ERJ |
| John | KWJiFWu2O9nMPYcR |
| Kent | LFZvm12tW_z0xfGo |
| Sydney | jtEKaLYNn6iif5PR |
| Tiffany | Eu9iL_CYe8N-Gkx_ |
Per-message voice override
When the active speech policy allows voice overrides, switch voices inline with a directive token (any of these are equivalent, all take a provider-native voice id):
/voice:LFZvm12tW_z0xfGo
/voice_id:LFZvm12tW_z0xfGo
/voiceid:LFZvm12tW_z0xfGo
/gradium_voice:LFZvm12tW_z0xfGo
/gradiumvoice:LFZvm12tW_z0xfGo
If the speech policy disables voice overrides, the directive is consumed but ignored.
Output
Output format is selected by target surface; the provider does not synthesize other formats.
| Target | Format | File ext | Sample rate | Voice-compatible flag |
|---|---|---|---|---|
| Standard audio | wav |
.wav |
provider | no |
| Voice note | opus |
.opus |
provider | yes |
| Telephony | ulaw_8000 |
n/a | 8 kHz | n/a |
Auto-select order
Among configured TTS providers, Gradium's auto-select order is 30. See Text-to-Speech for how OpenClaw picks the active provider when tts.provider is not pinned.