[Feature]: Expose ElevenLabs voice settings (stability, style, speed…) per speaker
Feature Description
Podcast speaker profiles currently let you pick an ElevenLabs voice (voice_model + voice_id), but there is no way to control ElevenLabs' fine-grained voice settings — stability, similarity_boost, style, use_speaker_boost, and speed. These are the core sliders of the ElevenLabs product; without them, Open Notebook always falls back to Esperanto's hardcoded defaults (stability=0.5, similarity_boost=0.75, style=0.0, use_speaker_boost=true).
I'd like to add an optional, per‑speaker "Advanced voice settings" section (with a profile‑level default) that maps directly to ElevenLabs' voice_settings, shown only when the selected voice model is an ElevenLabs provider.
Why would this be helpful?
- ElevenLabs output quality is highly sensitive to these parameters; the fixed defaults (notably
style=0.0) sound flat for expressive podcasts and can be inconsistent across long, multi‑speaker episodes. - Non‑English podcasts (e.g. French) frequently need lower
stability/ higherstylefor natural prosody, or higherstabilityfor consistency — impossible today. - It's the main lever missing versus the ElevenLabs web app / API for anyone doing serious audio, and there is currently no workaround in the UI.
Proposed Solution
The good news: the config passthrough already exists end‑to‑end — only the entry point and the UI are missing. Verified across the three repos:
- open-notebook —
_resolve_model_config()builds atts_configdict that is attached to each speaker incommands/podcast_commands.py. - podcast-creator (
nodes.py) — spreads**tts_configintoAIFactory.create_text_to_speech(...). - esperanto (
factory.py→providers/tts/elevenlabs.py) — readsvoice_settingsfrom kwargs ({**DEFAULT_VOICE_SETTINGS, **kwargs["voice_settings"]}) and injects it into the ElevenLabs API payload.
So any voice_settings placed into tts_config already reaches the ElevenLabs call. The change is just to expose and validate it:
- Backend — in
commands/podcast_commands.py, merge an optional per‑speaker (and profile‑level default)voice_settingsinto the resolvedtts_config. Validate ranges inopen_notebook/podcasts/models.py:stability/similarity_boost/style∈ [0, 1],speed∈ [0.7, 1.2],use_speaker_boostboolean. - Frontend — add an optional collapsible "Advanced voice settings" block per speaker in
SpeakerProfileFormDialog.tsx(numeric inputs + a checkbox), rendered only when the voice model provider is ElevenLabs. Extendlib/types/podcasts.tsand the zod schema. - i18n — add strings to
en-US; other locales fall back through the existingt('key') || 'Fallback'pattern. - Tests & docs — pytest verifying
voice_settingsflows intotts_config; updatedocs/features/podcasts.mdand the changelog.
Backward compatible: profiles without voice_settings keep the current Esperanto defaults. speakers is schemaless in SurrealDB, so no DB migration is required. Scope is intentionally limited to ElevenLabs (OpenAI/Google TTS don't use these keys).
Additional Context
Parameters to expose, matching the ElevenLabs voice_settings object: stability, similarity_boost, style, use_speaker_boost, speed. I'm happy to open the PR as a single focused change (backend + UI + tests + docs) once the approach is approved and the issue is assigned.
Contribution
- I am a developer and would like to work on implementing this feature (pending maintainer approval).
Source: lfnovo/open-notebook