mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-06-24 21:38:09 +02:00
Merge remote-tracking branch 'upstream/dev' into feat/unified-model-connections
This commit is contained in:
commit
ab5423d2d2
45 changed files with 775 additions and 272 deletions
|
|
@ -38,7 +38,10 @@ def make_spec():
|
|||
if speakers is None:
|
||||
speakers = [
|
||||
SpeakerSpec(
|
||||
slot=0, name="Host", role=SpeakerRole.HOST, voice_id="kokoro:am_adam"
|
||||
slot=0,
|
||||
name="Host",
|
||||
role=SpeakerRole.HOST,
|
||||
voice_id="kokoro:am_adam",
|
||||
),
|
||||
SpeakerSpec(
|
||||
slot=1,
|
||||
|
|
|
|||
|
|
@ -71,7 +71,9 @@ def _spec(voice_id: str) -> PodcastSpec:
|
|||
|
||||
|
||||
async def test_render_rejects_a_turn_for_an_unknown_speaker(tmp_path):
|
||||
renderer = PodcastRenderer(tts=_UnusedTTS(), catalog=_catalog_with("kokoro:am_adam"))
|
||||
renderer = PodcastRenderer(
|
||||
tts=_UnusedTTS(), catalog=_catalog_with("kokoro:am_adam")
|
||||
)
|
||||
transcript = Transcript(turns=[TranscriptTurn(speaker=5, text="Who am I?")])
|
||||
|
||||
with pytest.raises(RenderError):
|
||||
|
|
@ -81,7 +83,9 @@ async def test_render_rejects_a_turn_for_an_unknown_speaker(tmp_path):
|
|||
|
||||
|
||||
async def test_render_rejects_a_speaker_whose_voice_is_not_in_the_catalog(tmp_path):
|
||||
renderer = PodcastRenderer(tts=_UnusedTTS(), catalog=_catalog_with("kokoro:am_adam"))
|
||||
renderer = PodcastRenderer(
|
||||
tts=_UnusedTTS(), catalog=_catalog_with("kokoro:am_adam")
|
||||
)
|
||||
transcript = Transcript(turns=[TranscriptTurn(speaker=0, text="Hello.")])
|
||||
|
||||
with pytest.raises(RenderError):
|
||||
|
|
|
|||
|
|
@ -64,7 +64,9 @@ def test_a_preferred_voice_invalid_for_the_language_is_replaced():
|
|||
speaker_count=1,
|
||||
preferred=["kokoro:does-not-exist"],
|
||||
)
|
||||
assert voices[0].voice_id in {v.voice_id for v in catalog.for_provider(TtsProvider.KOKORO)}
|
||||
assert voices[0].voice_id in {
|
||||
v.voice_id for v in catalog.for_provider(TtsProvider.KOKORO)
|
||||
}
|
||||
|
||||
|
||||
def test_resolution_fails_when_no_voice_speaks_the_language():
|
||||
|
|
|
|||
|
|
@ -52,7 +52,9 @@ def test_for_provider_returns_only_that_providers_voices():
|
|||
def test_for_language_matches_on_the_primary_subtag():
|
||||
"""A request for 'en' should match an 'en-US' voice (region-insensitive)."""
|
||||
catalog = VoiceCatalog([_voice("k1", language="en-US")])
|
||||
assert [v.voice_id for v in catalog.for_language(TtsProvider.KOKORO, "en")] == ["k1"]
|
||||
assert [v.voice_id for v in catalog.for_language(TtsProvider.KOKORO, "en")] == [
|
||||
"k1"
|
||||
]
|
||||
|
||||
|
||||
def test_for_language_excludes_other_languages():
|
||||
|
|
@ -73,6 +75,59 @@ def test_supports_language_reports_availability():
|
|||
assert not catalog.supports_language(TtsProvider.KOKORO, "de")
|
||||
|
||||
|
||||
def test_offerable_languages_for_a_concrete_roster_are_its_tags_only():
|
||||
"""A provider whose voices are language-bound offers exactly those tags."""
|
||||
catalog = VoiceCatalog(
|
||||
[
|
||||
_voice("k1", language="en-US"),
|
||||
_voice("k2", language="fr"),
|
||||
_voice("k3", language="fr"),
|
||||
]
|
||||
)
|
||||
|
||||
offering = catalog.offerable_languages(TtsProvider.KOKORO)
|
||||
|
||||
assert offering.languages == ["en-US", "fr"]
|
||||
assert offering.allows_custom is False
|
||||
|
||||
|
||||
def test_a_wildcard_roster_offers_the_curated_languages_and_custom_entry():
|
||||
"""Voices that speak anything can't enumerate languages themselves, so the
|
||||
catalog offers the curated common list and invites free entry."""
|
||||
catalog = VoiceCatalog(
|
||||
[_voice("o1", provider=TtsProvider.OPENAI, language=ANY_LANGUAGE)]
|
||||
)
|
||||
|
||||
offering = catalog.offerable_languages(TtsProvider.OPENAI)
|
||||
|
||||
assert {"en", "fr", "sw", "hi", "zh"} <= set(offering.languages)
|
||||
assert offering.allows_custom is True
|
||||
|
||||
|
||||
def test_a_mixed_roster_offers_the_union_of_concrete_and_curated():
|
||||
catalog = VoiceCatalog(
|
||||
[
|
||||
_voice("v1", provider=TtsProvider.VERTEX_AI, language="en-GB"),
|
||||
_voice("v2", provider=TtsProvider.VERTEX_AI, language=ANY_LANGUAGE),
|
||||
]
|
||||
)
|
||||
|
||||
offering = catalog.offerable_languages(TtsProvider.VERTEX_AI)
|
||||
|
||||
assert "en-GB" in offering.languages
|
||||
assert "fr" in offering.languages
|
||||
assert offering.allows_custom is True
|
||||
|
||||
|
||||
def test_a_provider_with_no_voices_offers_nothing():
|
||||
catalog = VoiceCatalog([_voice("k1")])
|
||||
|
||||
offering = catalog.offerable_languages(TtsProvider.OPENAI)
|
||||
|
||||
assert offering.languages == []
|
||||
assert offering.allows_custom is False
|
||||
|
||||
|
||||
def test_get_raises_for_an_unknown_voice():
|
||||
catalog = VoiceCatalog([_voice("k1")])
|
||||
with pytest.raises(KeyError):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue