diff --git a/abogen/constants.py b/abogen/constants.py index 87bc87b..f8c325d 100644 --- a/abogen/constants.py +++ b/abogen/constants.py @@ -63,64 +63,6 @@ SUPPORTED_INPUT_FORMATS = [ # 384 if self.lang_code in 'ab': SUPPORTED_LANGUAGES_FOR_SUBTITLE_GENERATION = list(LANGUAGE_DESCRIPTIONS.keys()) -# Voice and sample text constants -VOICES_INTERNAL = [ - "af_alloy", - "af_aoede", - "af_bella", - "af_heart", - "af_jessica", - "af_kore", - "af_nicole", - "af_nova", - "af_river", - "af_sarah", - "af_sky", - "am_adam", - "am_echo", - "am_eric", - "am_fenrir", - "am_liam", - "am_michael", - "am_onyx", - "am_puck", - "am_santa", - "bf_alice", - "bf_emma", - "bf_isabella", - "bf_lily", - "bm_daniel", - "bm_fable", - "bm_george", - "bm_lewis", - "ef_dora", - "em_alex", - "em_santa", - "ff_siwis", - "hf_alpha", - "hf_beta", - "hm_omega", - "hm_psi", - "if_sara", - "im_nicola", - "jf_alpha", - "jf_gongitsune", - "jf_nezumi", - "jf_tebukuro", - "jm_kumo", - "pf_dora", - "pm_alex", - "pm_santa", - "zf_xiaobei", - "zf_xiaoni", - "zf_xiaoxiao", - "zf_xiaoyi", - "zm_yunjian", - "zm_yunxi", - "zm_yunxia", - "zm_yunyang", -] - # Voice and sample text mapping SAMPLE_VOICE_TEXTS = { "a": "This is a sample of the selected voice.", diff --git a/abogen/tts_backends/kokoro.py b/abogen/tts_backends/kokoro.py index 1bab1a4..9a4d7e9 100644 --- a/abogen/tts_backends/kokoro.py +++ b/abogen/tts_backends/kokoro.py @@ -10,14 +10,72 @@ from typing import Any, Dict, Iterator, List, Optional import numpy as np -from abogen.constants import VOICES_INTERNAL from abogen.tts_backend import TTSBackendMetadata +# Internal voice list — source of truth for Kokoro voices. +# The rest of the project accesses voices via get_metadata("kokoro").voices. +_VOICES_INTERNAL = [ + "af_alloy", + "af_aoede", + "af_bella", + "af_heart", + "af_jessica", + "af_kore", + "af_nicole", + "af_nova", + "af_river", + "af_sarah", + "af_sky", + "am_adam", + "am_echo", + "am_eric", + "am_fenrir", + "am_liam", + "am_michael", + "am_onyx", + "am_puck", + "am_santa", + "bf_alice", + "bf_emma", + "bf_isabella", + "bf_lily", + "bm_daniel", + "bm_fable", + "bm_george", + "bm_lewis", + "ef_dora", + "em_alex", + "em_santa", + "ff_siwis", + "hf_alpha", + "hf_beta", + "hm_omega", + "hm_psi", + "if_sara", + "im_nicola", + "jf_alpha", + "jf_gongitsune", + "jf_nezumi", + "jf_tebukuro", + "jm_kumo", + "pf_dora", + "pm_alex", + "pm_santa", + "zf_xiaobei", + "zf_xiaoni", + "zf_xiaoxiao", + "zf_xiaoyi", + "zm_yunjian", + "zm_yunxi", + "zm_yunxia", + "zm_yunyang", +] + _KOKORO_METADATA = TTSBackendMetadata( id="kokoro", name="Kokoro", description="Kokoro TTS engine", - voices=tuple(VOICES_INTERNAL), + voices=tuple(_VOICES_INTERNAL), ) diff --git a/tests/test_conversion_voice_resolution.py b/tests/test_conversion_voice_resolution.py index e791306..75f09b6 100644 --- a/tests/test_conversion_voice_resolution.py +++ b/tests/test_conversion_voice_resolution.py @@ -1,7 +1,7 @@ from types import SimpleNamespace from typing import cast -from abogen.constants import VOICES_INTERNAL +from abogen.tts_backend_registry import get_metadata from abogen.webui.conversion_runner import ( _chapter_voice_spec, _chunk_voice_spec, @@ -49,4 +49,4 @@ def test_voice_collection_includes_formula_components(): voices = _collect_required_voice_ids(job) assert {"af_nova", "am_liam"}.issubset(voices) - assert voices.issuperset(VOICES_INTERNAL) + assert voices.issuperset(get_metadata("kokoro").voices) diff --git a/tests/test_voice_cache.py b/tests/test_voice_cache.py index c428b3a..e5ce9a1 100644 --- a/tests/test_voice_cache.py +++ b/tests/test_voice_cache.py @@ -3,7 +3,7 @@ from typing import cast import pytest -from abogen.constants import VOICES_INTERNAL +from abogen.tts_backend_registry import get_metadata from abogen.voice_cache import ( LocalEntryNotFoundError, _CACHED_VOICES, @@ -66,4 +66,4 @@ def test_collect_required_voice_ids_includes_all(): voices = _collect_required_voice_ids(cast(Job, job)) assert {"af_nova", "am_liam", "am_michael"}.issubset(voices) - assert voices.issuperset(VOICES_INTERNAL) + assert voices.issuperset(get_metadata("kokoro").voices)