mirror of
https://github.com/mudler/LocalAI.git
synced 2026-10-28 09:08:54 -04:00
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:
1 parent
5ec7c05ad6
commit
e517470554
4 files changed
+57
-2
No files matched your search
@@ -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
|
||||
|
||||
@@ -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()
|
||||
Reference in new issue
Block a user