8.3 KiB
TTS Voice Selection Debugging Guide
Overview
Comprehensive debugging has been added to track the entire TTS voice selection flow from settings to playback.
Debug Logging System
1. Settings Panel (SettingsPanel.tsx)
On Mount:
⚙️ SettingsPanel mounted
📥 Current ttsVoice from store: browser:Google US English
💾 LocalStorage contents: {"state":{"ttsVoice":"browser:Google US English",...},...}
🔊 Loaded 23 browser voices
On Voice Change:
🎛️ Settings: Voice selection changed to: browser:Microsoft David
🎙️ Settings Store: Saving TTS voice: browser:Microsoft David
💾 LocalStorage after change: {"state":{"ttsVoice":"browser:Microsoft David",...},...}
2. TTS Controls (TTSControls.tsx)
On Component Load:
🔊 TTSControls: Current TTS voice from store: browser:Google US English
On Play Button Click:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎬 TTSControls: Starting TTS playback
📥 Raw voice from store: browser:Google US English
🔑 ElevenLabs API Key present: false
🎤 Processed voice ID: browser:Google US English
📝 Text to speak: This is a test message...
✅ TTS playback started successfully
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3. TTS Manager (tts.ts)
speak() Method:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎵 TTS Manager: speak() called
📥 Input options: {voiceId: "browser:Google US English", provider: "browser", volume: 1}
✅ Detected browser voice: Google US English
🎯 Final provider: browser
🎯 Final voice ID: Google US English
➡️ Routing to Browser TTS
Browser TTS Setup:
🔧 Browser TTS: Setting up utterance
📊 Utterance settings: {rate: 1, pitch: 1, volume: 1}
🔍 Browser TTS: Searching for voice: Google US English
📋 Browser TTS: 23 voices available:
1. Google US English | URI: Google US English | Lang: en-US
2. Microsoft David | URI: Microsoft David | Lang: en-US
3. Microsoft Zira | URI: Microsoft Zira | Lang: en-US
... [more voices]
🎯 Searching for match with: Google US English
✅ MATCH FOUND: Google US English (Google US English)
🎤 Setting utterance voice to: Google US English
✅ Voice successfully assigned to utterance
🎙️ Final utterance voice: Google US English
▶️ Starting speech synthesis...
✅ Browser TTS: Playback ended
How to Use Debug Logs
Step 1: Open Browser Console
- Open EVE app
- Press F12 to open DevTools
- Go to Console tab
Step 2: Test Voice Selection
- Open Settings (⚙️ icon)
- Enable TTS
- Select a voice from dropdown
- Watch console for:
🎛️ Settings: Voice selection changed🎙️ Settings Store: Saving TTS voice💾 LocalStorage after change
Step 3: Test Playback
- Send a message to EVE
- Click 🔊 speaker icon
- Watch console for full flow:
- TTSControls logs
- TTS Manager logs
- Browser TTS logs
Common Issues & Solutions
Issue 1: Voice Not Saving
Symptoms:
🎛️ Settings: Voice selection changed to: browser:Microsoft David
🎙️ Settings Store: Saving TTS voice: browser:Microsoft David
💾 LocalStorage after change: {"state":{"ttsVoice":"default",...},...}
Problem: LocalStorage shows "default" instead of selected voice
Solutions:
- Check browser permissions for localStorage
- Try incognito/private mode
- Clear localStorage and try again:
localStorage.clear()
Issue 2: Voice Not Loading from Store
Symptoms:
⚙️ SettingsPanel mounted
📥 Current ttsVoice from store: default
💾 LocalStorage contents: null
Problem: Store not loading from localStorage
Solutions:
- Check Zustand persist middleware is working
- Verify localStorage permissions
- Check browser console for errors
Issue 3: Wrong Voice Used
Symptoms:
🔍 Browser TTS: Searching for voice: Google US English
📋 Browser TTS: 23 voices available:
... [list of voices]
❌ Voice not found in available voices: Google US English
⚠️ Will use system default voice instead
Problem: Voice ID doesn't match available voices
Solutions:
- Check exact voice URI in available voices list
- Some voices may not be available on all systems
- Try a different voice
- Check voice name vs voiceURI mismatch
Issue 4: Prefix Not Stripped
Symptoms:
🎵 TTS Manager: speak() called
📥 Input options: {voiceId: "browser:Google US English", ...}
⚠️ No prefix detected, using as-is: browser:Google US English
Problem: Prefix detection not working
Check:
- Voice ID should start with "browser:" or "elevenlabs:"
- If not, check SettingsPanel dropdown values
Issue 5: Default Voice Always Used
Symptoms:
🎬 TTSControls: Starting TTS playback
📥 Raw voice from store: default
Problem: Store contains "default" value
Solutions:
- Check if voice was actually selected in settings
- Verify dropdown onChange is firing
- Check localStorage was updated
- Try selecting voice again
Manual Debugging Commands
Check Current Settings
// In browser console
JSON.parse(localStorage.getItem('eve-settings'))
Force Set Voice
// In browser console
const settings = JSON.parse(localStorage.getItem('eve-settings'))
settings.state.ttsVoice = "browser:Google US English"
localStorage.setItem('eve-settings', JSON.stringify(settings))
location.reload()
List Available Voices
// In browser console
window.speechSynthesis.getVoices().forEach((v, i) => {
console.log(`${i + 1}. ${v.name} | ${v.voiceURI} | ${v.lang}`)
})
Test Voice Directly
// In browser console
const utterance = new SpeechSynthesisUtterance("Testing voice")
const voices = window.speechSynthesis.getVoices()
utterance.voice = voices[0] // Try different indices
window.speechSynthesis.speak(utterance)
Log Analysis Guide
Healthy Flow
✅ Complete successful flow:
1. 🎛️ Settings: Voice selection changed
2. 🎙️ Settings Store: Saving TTS voice
3. 💾 LocalStorage shows correct voice
4. 🔊 TTSControls: Current TTS voice matches
5. 🎵 TTS Manager receives correct voice
6. ✅ Detected browser voice (prefix stripped)
7. 📋 Voice found in available list
8. ✅ MATCH FOUND
9. ✅ Voice successfully assigned
10. ▶️ Starting speech synthesis
11. ✅ Playback ended
Broken Flow Examples
❌ Voice not saving:
1. 🎛️ Settings: Voice selection changed to X
2. 🎙️ Settings Store: Saving TTS voice: X
3. 💾 LocalStorage still shows "default" ❌
❌ Voice not found:
1. 🔍 Browser TTS: Searching for voice: X
2. 📋 Browser TTS: [list of voices]
3. ❌ Voice not found in available voices ❌
4. ⚠️ Will use system default voice instead
❌ Wrong voice passed:
1. 📥 Raw voice from store: default ❌
2. Should be: browser:SomeVoice
Platform-Specific Notes
Linux
- May have fewer voices available
- eSpeak voices common
- Check:
apt list --installed | grep speech
macOS
- Many high-quality voices
- "Alex" is common default
- Check: System Preferences > Accessibility > Speech
Windows
- Microsoft voices (David, Zira, etc.)
- Check: Settings > Time & Language > Speech
Expected Log Volume
Normal operation:
- Settings change: ~5-10 log lines
- Play button click: ~20-40 log lines
- Component mount: ~5 log lines
Total per test: ~30-55 log lines
Disabling Debug Logs
To remove debug logs in production:
-
Search for
console.login:src/components/SettingsPanel.tsxsrc/components/TTSControls.tsxsrc/lib/tts.tssrc/stores/settingsStore.ts
-
Comment out or remove debug statements
-
Or wrap in development check:
if (import.meta.env.DEV) { console.log('Debug message') }
Getting Help
If voice selection still doesn't work after checking logs:
- Copy full console output
- Check localStorage contents
- List available voices
- Note operating system & browser
- Report issue with all above information
Status: Debug logging active
Version: v0.2.0-rc
Date: October 5, 2025