From 919544c0931d53bb81904b6212ff14f856549da3 Mon Sep 17 00:00:00 2001 From: historia Date: Mon, 24 Aug 2026 16:18:38 -0400 Subject: feat: option to unload models from audio.cpp per-run --- app/tests/test_hub.py | 26 +++++++++++++++++++------- app/tests/test_tts.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) (limited to 'app/tests') diff --git a/app/tests/test_hub.py b/app/tests/test_hub.py index 725f4f6..a0545cc 100644 --- a/app/tests/test_hub.py +++ b/app/tests/test_hub.py @@ -1083,7 +1083,8 @@ class SettingsTests(unittest.TestCase): original = {name: getattr(hub.config, name) for name in ("AUDIO_FORMAT", "AUDIO_BITRATE", "LANGUAGE", - "CHUNK_SIZE", "QWEN_API_URL", "CLONE_API_URL", + "CHUNK_SIZE", "AUDIOCPP_UNLOAD_MODELS", + "QWEN_API_URL", "CLONE_API_URL", "FASTER_API_URL", "AUDIOCPP_API_URL", "QWEN_REMOTE_URL", "CLONE_REMOTE_URL", "FASTER_REMOTE_URL", "AUDIOCPP_REMOTE_URL")} @@ -1091,6 +1092,7 @@ class SettingsTests(unittest.TestCase): for name, value in original.items()]) values = {"audio_format": "ogg", "audio_bitrate": " 192k ", "language": "en", "chunk_size": "300", + "unload_models": True, "qwen_custom_port": "7862", "qwen_clone_port": "7863", "faster_port": "8001", "audiocpp_port": "8081", "audiocpp_remote_url": "10.0.0.5:8080", @@ -1106,6 +1108,7 @@ class SettingsTests(unittest.TestCase): "AUDIO_BITRATE": "192k", "LANGUAGE": "English", "CHUNK_SIZE": 300, + "AUDIOCPP_UNLOAD_MODELS": True, "QWEN_API_URL": "http://127.0.0.1:7862", "CLONE_API_URL": "http://127.0.0.1:7863", "FASTER_API_URL": "http://127.0.0.1:8001", @@ -1122,6 +1125,7 @@ class SettingsTests(unittest.TestCase): self.assertEqual(hub.config.AUDIO_BITRATE, "192k") self.assertEqual(hub.config.LANGUAGE, "English") self.assertEqual(hub.config.CHUNK_SIZE, 300) + self.assertEqual(hub.config.AUDIOCPP_UNLOAD_MODELS, True) self.assertEqual(hub.config.QWEN_API_URL, "http://127.0.0.1:7862") self.assertEqual(hub.config.FASTER_API_URL, "http://127.0.0.1:8001") self.assertEqual(hub.config.AUDIOCPP_REMOTE_URL, @@ -1130,7 +1134,8 @@ class SettingsTests(unittest.TestCase): def test_apply_settings_rejects_bad_values(self): original = {name: getattr(hub.config, name) for name in ("AUDIO_FORMAT", "AUDIO_BITRATE", "LANGUAGE", - "CHUNK_SIZE", "QWEN_API_URL", "CLONE_API_URL", + "CHUNK_SIZE", "AUDIOCPP_UNLOAD_MODELS", + "QWEN_API_URL", "CLONE_API_URL", "FASTER_API_URL", "AUDIOCPP_API_URL", "QWEN_REMOTE_URL", "CLONE_REMOTE_URL", "FASTER_REMOTE_URL", "AUDIOCPP_REMOTE_URL")} @@ -1138,6 +1143,7 @@ class SettingsTests(unittest.TestCase): for name, value in original.items()]) base = {"audio_format": "m4b", "audio_bitrate": "128k", "language": "English", "chunk_size": "250", + "unload_models": True, "qwen_custom_port": "7860", "qwen_clone_port": "7861", "faster_port": "8000", "audiocpp_port": "8080"} with patch.object(hub, "_write_config") as mk_write: @@ -1175,6 +1181,7 @@ class SettingsTests(unittest.TestCase): captured["fields"] = fields return {"audio_format": "ogg", "audio_bitrate": "192k", "language": "English", "chunk_size": "300", + "unload_models": True, "qwen_custom_port": "7860", "qwen_clone_port": "7861", "faster_port": "8000", "audiocpp_port": "8080"} @@ -1192,14 +1199,16 @@ class SettingsTests(unittest.TestCase): hub._settings_menu(None) self.assertEqual([f["key"] for f in captured["fields"]], ["audio_format", "audio_bitrate", "language", - "chunk_size", "audiocpp_port", "faster_port", - "qwen_custom_port", "qwen_clone_port", - "audiocpp_remote_url", "faster_remote_url", - "qwen_custom_remote_url", "qwen_clone_remote_url"]) + "chunk_size", "unload_models", "audiocpp_port", + "faster_port", "qwen_custom_port", + "qwen_clone_port", "audiocpp_remote_url", + "faster_remote_url", "qwen_custom_remote_url", + "qwen_clone_remote_url"]) kinds = {f["key"]: f["kind"] for f in captured["fields"]} self.assertEqual(kinds["audio_format"], "choice") self.assertEqual(kinds["audio_bitrate"], "text") self.assertEqual(kinds["audiocpp_port"], "text") + self.assertEqual(kinds["unload_models"], "bool") self.assertEqual(kinds["audiocpp_remote_url"], "text") labels = {f["key"]: f["label"] for f in captured["fields"]} self.assertEqual(labels["qwen_clone_port"], "qwen-tts Base port") @@ -1217,6 +1226,7 @@ class SettingsTests(unittest.TestCase): "audio_bitrate": "192k", "language": "English", "chunk_size": "300", + "unload_models": True, "qwen_custom_port": "7860", "qwen_clone_port": "7861", "faster_port": "8000", @@ -1248,7 +1258,8 @@ class SettingsTests(unittest.TestCase): original = {name: getattr(hub.config, name) for name in ("AUDIO_FORMAT", "AUDIO_BITRATE", "LANGUAGE", - "CHUNK_SIZE", "QWEN_API_URL", "CLONE_API_URL", + "CHUNK_SIZE", "AUDIOCPP_UNLOAD_MODELS", + "QWEN_API_URL", "CLONE_API_URL", "FASTER_API_URL", "AUDIOCPP_API_URL", "QWEN_REMOTE_URL", "CLONE_REMOTE_URL", "FASTER_REMOTE_URL", "AUDIOCPP_REMOTE_URL")} @@ -1264,6 +1275,7 @@ class SettingsTests(unittest.TestCase): 'LANGUAGE = "English"\n' "\n" "CHUNK_SIZE = 250\n" + "AUDIOCPP_UNLOAD_MODELS = True\n" 'QWEN_API_URL = "http://127.0.0.1:7860"\n' 'CLONE_API_URL = "http://127.0.0.1:7861"\n' 'FASTER_API_URL = "http://127.0.0.1:8000"\n' diff --git a/app/tests/test_tts.py b/app/tests/test_tts.py index 0026702..77f0ee8 100644 --- a/app/tests/test_tts.py +++ b/app/tests/test_tts.py @@ -1394,6 +1394,36 @@ class AudioCppUnloadModelsTests(unittest.TestCase): client._connect() mock_unload.assert_called_once() + def test_connect_skips_unload_when_disabled(self): + client = AudioCppTTSClient.__new__(AudioCppTTSClient) + client.api_url = "http://127.0.0.1:8080" + client.model_id = config.AUDIOCPP_MODEL_ID + client.preset_mode = True + client.voice = "narrator" + client.language = "English" + client._seed = -1 + client.family = "qwen3_tts" + client.task = tts.AUDIOCPP_TASK_TTS + client.profile = tts.AUDIOCPP_FAMILY_PROFILES["qwen3_tts"] + client.design_mode = False + client.instruction_voice = False + client.instructions = "" + with patch.object(client, "_check_health"), \ + patch.object(client, "_list_models", + return_value=[{"id": client.model_id, + "family": "qwen3_tts", + "task": "tts"}]), \ + patch.object(client, "_auto_pick_model_id"), \ + patch.object(client, "_select_model"), \ + patch.object(client, "_require_model_id"), \ + patch.object(client, "_resolve_family"), \ + patch.object(client, "_resolve_task"), \ + patch.object(client, "_check_voice"), \ + patch.object(tts.config, "AUDIOCPP_UNLOAD_MODELS", False), \ + patch.object(client, "_unload_server_models") as mock_unload: + client._connect() + mock_unload.assert_not_called() + class BackendWiringTests(unittest.TestCase): """AudiobookConverter wiring for the --backend selector.""" -- cgit v1.2.3