diff --git a/CHANGELOG.md b/CHANGELOG.md index 84c5bd96f38..e18e9fdd81a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Docs: https://docs.openclaw.ai - Control UI: refine the agent Tool Access panel with compact live-tool chips, collapsible tool groups, direct per-tool toggles, and clearer runtime/source provenance. (#71405) Thanks @BunsDev. - Memory-core/hybrid search: expose raw `vectorScore` and `textScore` alongside the combined `score` on hybrid memory search results, so callers can inspect vector-versus-text retrieval contribution before temporal decay or MMR reordering. Fixes #68166. (#68286) Thanks @ajfonthemove. - Providers/Xiaomi: add MiMo TTS as a bundled speech provider with MP3/WAV output and voice-note Opus transcoding. Fixes #52376. (#55614) Thanks @zoujiejun. +- Providers/ElevenLabs: include `eleven_v3` in the bundled TTS model catalog so model selection surfaces can offer ElevenLabs v3. (#68321) Thanks @itsuzef. ### Fixes diff --git a/docs/providers/elevenlabs.md b/docs/providers/elevenlabs.md index 29e6a8a132e..14a2d29b60f 100644 --- a/docs/providers/elevenlabs.md +++ b/docs/providers/elevenlabs.md @@ -43,6 +43,9 @@ export ELEVENLABS_API_KEY="..." } ``` +Set `modelId` to `eleven_v3` to use ElevenLabs v3 TTS. OpenClaw keeps +`eleven_multilingual_v2` as the default for existing installs. + ## Speech-to-text Use Scribe v2 for inbound audio attachments and short recorded voice segments: diff --git a/extensions/elevenlabs/elevenlabs.live.test.ts b/extensions/elevenlabs/elevenlabs.live.test.ts index f27d6bd6612..49267bfbe66 100644 --- a/extensions/elevenlabs/elevenlabs.live.test.ts +++ b/extensions/elevenlabs/elevenlabs.live.test.ts @@ -25,14 +25,14 @@ const registerElevenLabsPlugin = () => }); describeLive("elevenlabs plugin live", () => { - it("synthesizes speech through the registered provider", async () => { + it("synthesizes speech through the registered provider with eleven_v3", async () => { const { speechProviders } = await registerElevenLabsPlugin(); const provider = requireRegisteredProvider(speechProviders, "elevenlabs"); const audioFile = await provider.synthesize({ - text: "OpenClaw ElevenLabs text to speech integration test OK.", + text: "OpenClaw ElevenLabs eleven v three text to speech integration test OK.", cfg: { plugins: { enabled: true } } as never, - providerConfig: { apiKey: ELEVENLABS_KEY }, + providerConfig: { apiKey: ELEVENLABS_KEY, modelId: "eleven_v3" }, target: "audio-file", timeoutMs: 45_000, }); diff --git a/extensions/elevenlabs/speech-provider.test.ts b/extensions/elevenlabs/speech-provider.test.ts index cfce550ccd3..ee0da229eec 100644 --- a/extensions/elevenlabs/speech-provider.test.ts +++ b/extensions/elevenlabs/speech-provider.test.ts @@ -1,7 +1,15 @@ import { describe, expect, it } from "vitest"; -import { isValidVoiceId } from "./speech-provider.js"; +import { buildElevenLabsSpeechProvider, isValidVoiceId } from "./speech-provider.js"; describe("elevenlabs speech provider", () => { + it("exposes the current ElevenLabs TTS model catalog", () => { + const provider = buildElevenLabsSpeechProvider(); + + expect(provider.models).toEqual( + expect.arrayContaining(["eleven_v3", "eleven_multilingual_v2"]), + ); + }); + it("validates ElevenLabs voice ID length and character rules", () => { const cases = [ { value: "pMsXgVXv3BLzUgSXRplE", expected: true },