Problem
The voice assistant currently uses a hardcoded list of ElevenLabs pre-made voices with no way to select between them in the UI. Users who:
- Have an ElevenLabs paid plan and have created instant voice clones cannot use those clones with Hapi
- Want a different pre-made voice cannot change it without editing config manually
Proposed solution
Add a voice picker to Settings → Voice Assistant that:
- Fetches the user's available voices dynamically from ElevenLabs (
GET /v1/voices) via a hub proxy route, so cloned voices appear alongside pre-made voices
- Shows a ▶ preview button per voice using the ElevenLabs
preview_url (CDN-hosted, no auth needed to play)
- Labels cloned voices distinctly so users can identify them
- Persists the selection to
localStorage and passes it as an override when starting a voice session (ElevenLabs already supports platform_settings.overrides.conversation_config_override.tts.voice_id)
- Degrades gracefully — if no API key is configured, shows a static fallback list
Notes
- ElevenLabs voice override is already supported via
overrides.tts.voiceId in startSession
- The hub proxy approach keeps the API key server-side (consistent with the existing token endpoint pattern)
- This lays the groundwork for a future phase where the voice provider can be abstracted (local TTS, Gemini voice, etc.)
Problem
The voice assistant currently uses a hardcoded list of ElevenLabs pre-made voices with no way to select between them in the UI. Users who:
Proposed solution
Add a voice picker to Settings → Voice Assistant that:
GET /v1/voices) via a hub proxy route, so cloned voices appear alongside pre-made voicespreview_url(CDN-hosted, no auth needed to play)localStorageand passes it as an override when starting a voice session (ElevenLabs already supportsplatform_settings.overrides.conversation_config_override.tts.voice_id)Notes
overrides.tts.voiceIdinstartSession