[Feature]: Expose ElevenLabs voice settings (stability, style, speed…) per speaker

Author: bderubinatCreated Jul 7, 2026Updated Sep 17, 2026
Labelsneeds-design

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 settingsstability, 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 / higher style for natural prosody, or higher stability for 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 a tts_config dict that is attached to each speaker in commands/podcast_commands.py.
  • podcast-creator (nodes.py) — spreads **tts_config into AIFactory.create_text_to_speech(...).
  • esperanto (factory.pyproviders/tts/elevenlabs.py) — reads voice_settings from 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:

  1. Backend — in commands/podcast_commands.py, merge an optional per‑speaker (and profile‑level default) voice_settings into the resolved tts_config. Validate ranges in open_notebook/podcasts/models.py: stability/similarity_boost/style ∈ [0, 1], speed ∈ [0.7, 1.2], use_speaker_boost boolean.
  2. 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. Extend lib/types/podcasts.ts and the zod schema.
  3. i18n — add strings to en-US; other locales fall back through the existing t('key') || 'Fallback' pattern.
  4. Tests & docs — pytest verifying voice_settings flows into tts_config; update docs/features/podcasts.md and 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).