Fix Silero multilingual support with proper model loading

- Fixed Silero model caching to track language+speaker combination
- Updated Russian voices to use ru_v3 model (was v4_ru)
- Updated Spanish voices to use v3_es model (was v1_es)
- All model loading now properly switches between languages

Status:
 English (v3_en) - 119 voices working
 German (v3_de) - 6 voices working
 French (v3_fr) - 7 voices working
⚠️  Russian (ru_v3) - Model loading issue (investigating speaker format)
⚠️  Spanish (v3_es) - Model loading issue (investigating speaker format)

🦝 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Russell Ballestrini 2025-11-09 13:29:52 -05:00
parent a8865564ae
commit 20241632ea
2 changed files with 19 additions and 15 deletions

View file

@ -477,10 +477,14 @@ async def generate_speech(request: GenerateSpeechRequest):
speaker_id = voice_map.get('speaker', 'en_0')
silero_speaker_key = voice_map.get('silero_speaker', 'v4_en')
# Load Silero model if not already loaded
if silero_model is None or silero_speakers.get(language) != silero_speaker_key:
# Create a unique key for this language+speaker combination
model_key = f"{language}_{silero_speaker_key}"
# Load Silero model if not already loaded or if language/speaker changed
if silero_model is None or silero_speakers.get('current') != model_key:
logger.info(f"Loading/switching Silero model to {language}/{silero_speaker_key}")
silero_model = silero_wrapper(language=language, speaker=silero_speaker_key, device='cpu')
silero_speakers[language] = silero_speaker_key
silero_speakers['current'] = model_key
# Generate audio
audio_data = silero_model.tts(input_text, speaker_id=speaker_id)

View file

@ -709,31 +709,31 @@ tts-1-silero:
language: en
speaker: random
silero_speaker: v3_en
# Russian voices (v4_ru model)
# Russian voices (v3_ru/ru_v3 model) - use ru_v3 for better compatibility
ru_aidar:
language: ru
speaker: aidar
silero_speaker: v4_ru
silero_speaker: ru_v3
ru_baya:
language: ru
speaker: baya
silero_speaker: v4_ru
silero_speaker: ru_v3
ru_kseniya:
language: ru
speaker: kseniya
silero_speaker: v4_ru
silero_speaker: ru_v3
ru_xenia:
language: ru
speaker: xenia
silero_speaker: v4_ru
silero_speaker: ru_v3
ru_eugene:
language: ru
speaker: eugene
silero_speaker: v4_ru
silero_speaker: ru_v3
ru_random:
language: ru
speaker: random
silero_speaker: v4_ru
silero_speaker: ru_v3
# German voices (v3_de model)
de_bernd_ungerer:
language: de
@ -759,23 +759,23 @@ tts-1-silero:
language: de
speaker: random
silero_speaker: v3_de
# Spanish voices (v1_es model)
# Spanish voices (v3_es model)
es_0:
language: es
speaker: es_0
silero_speaker: v1_es
silero_speaker: v3_es
es_1:
language: es
speaker: es_1
silero_speaker: v1_es
silero_speaker: v3_es
es_2:
language: es
speaker: es_2
silero_speaker: v1_es
silero_speaker: v3_es
es_random:
language: es
speaker: random
silero_speaker: v1_es
silero_speaker: v3_es
# French voices (v3_fr model)
fr_0:
language: fr