fix(pocket-tts): honour the language option when loading the model (#12766)

Pocket TTS ships one model per language, but LoadModel called
TTSModel.load_model() with no arguments, so the library always fell back
to its English model whatever the model config said. Read a `language`
option and pass it to load_model, keeping the library default when it is
not set. Document the option and add unit tests that mock the loader.

Fixes #12759

Assisted-by: Claude:claude-opus-5-5
This commit is contained in:
Younes Beriane authored and GitHub committed 2026-10-19 13:12:42 +02:00
1 parent 5ec7c05ad6
commit e517470554
4 files changed
+57 -2

No files matched your search

+10 -2
View File
@@ -102,9 +102,17 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
self.default_voice_url = self.options.get("default_voice", None)
self._voice_cache = {}
# Pocket TTS ships a separate model per language (english, french,
# german, ...) and load_model() falls back to English when no language
# is given, so the option has to reach the loader to pick another one.
load_kwargs = {}
language = self.options.get("language")
if language:
load_kwargs["language"] = str(language)
try:
print("Loading Pocket TTS model", file=sys.stderr)
self.tts_model = TTSModel.load_model()
print(f"Loading Pocket TTS model (language: {load_kwargs.get('language', 'default')})", file=sys.stderr)
self.tts_model = TTSModel.load_model(**load_kwargs)
print(f"Model loaded successfully. Sample rate: {self.tts_model.sample_rate}", file=sys.stderr)
# Pre-load default voice if specified
+31
View File
@@ -6,6 +6,7 @@ import subprocess
import time
import os
import tempfile
from unittest import mock
import backend_pb2
import backend_pb2_grpc
@@ -139,3 +140,33 @@ class TestBackendServicer(unittest.TestCase):
self.fail("TTS service with default voice failed")
finally:
self.tearDown()
class TestLanguageOption(unittest.TestCase):
"""
Checks that the language option reaches TTSModel.load_model without
downloading any weights.
"""
def _load_model(self, options):
import backend
fake_model = mock.MagicMock()
fake_model.sample_rate = 24000
with mock.patch.object(backend.TTSModel, "load_model", return_value=fake_model) as load_model:
response = backend.BackendServicer().LoadModel(
backend_pb2.ModelOptions(Options=options), None
)
self.assertTrue(response.success, response.message)
return load_model
def test_language_option_selects_model(self):
load_model = self._load_model(["language:french"])
load_model.assert_called_once_with(language="french")
def test_versioned_language_option(self):
load_model = self._load_model(["language:english_2026-04"])
load_model.assert_called_once_with(language="english_2026-04")
def test_no_language_keeps_library_default(self):
load_model = self._load_model(["default_voice:azelma"])
load_model.assert_called_once_with()