From 20241632ea905da3bfca98e52af2fdbfd98c21c6 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Sun, 9 Nov 2025 13:29:52 -0500 Subject: [PATCH] Fix Silero multilingual support with proper model loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- speech.py | 10 +++++++--- voice_to_speaker.default.yaml | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/speech.py b/speech.py index 9e26b74..9d0245e 100755 --- a/speech.py +++ b/speech.py @@ -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) diff --git a/voice_to_speaker.default.yaml b/voice_to_speaker.default.yaml index cfbbc3d..089c95f 100644 --- a/voice_to_speaker.default.yaml +++ b/voice_to_speaker.default.yaml @@ -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