Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions pecha_api/plans/audio/tts_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
from pecha_api.plans.audio.monlam_tts_service import generate_monlam_tts_audio
from pecha_api.plans.plans_enums import PlanAudioType

SUPPORTED_TTS_LANGUAGES = {"en", "bo"}


def _normalize_language(language: str) -> str:
return (language or "en").strip().lower()

Expand All @@ -22,10 +19,6 @@ def generate_tts_audio(
raise ValueError("Content cannot be empty")

normalized_language = _normalize_language(language)
if normalized_language not in SUPPORTED_TTS_LANGUAGES:
raise ValueError(
f"Unsupported language for TTS: {language}. Supported: {', '.join(sorted(SUPPORTED_TTS_LANGUAGES))}"
)

if normalized_language == "bo":
return generate_monlam_tts_audio(content, voice_name=voice_name)
Expand Down
22 changes: 15 additions & 7 deletions tests/plans/audio/test_tts_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,21 @@ def test_generate_tts_audio_rejects_empty_content():
generate_tts_audio(content=" ", audio_type=PlanAudioType.RECITATION)


def test_generate_tts_audio_rejects_unsupported_language():
with pytest.raises(ValueError, match="Unsupported language for TTS"):
generate_tts_audio(
content="Hello",
audio_type=PlanAudioType.RECITATION,
language="zh",
)
@patch("google.genai.Client")
@patch("pecha_api.plans.audio.tts_service.get", return_value="test-api-key")
def test_generate_tts_audio_routes_non_tibetan_languages_to_gemini(mock_get, mock_client_cls):
audio_data = b"\x00\x01\x02\x03"
_configure_gemini_client(mock_client_cls, _build_gemini_audio_response(audio_data=audio_data))

result = generate_tts_audio(
content="你好",
audio_type=PlanAudioType.RECITATION,
language="zh",
)

assert result[:4] == b"RIFF"
assert result.endswith(audio_data)
mock_client_cls.assert_called_once()


@patch("pecha_api.plans.audio.tts_service.generate_monlam_tts_audio")
Expand Down
18 changes: 15 additions & 3 deletions tests/plans/audio/test_tts_test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,25 @@ def test_preview_tts_returns_502_for_runtime_error(mock_generate):

@patch(
"pecha_api.plans.audio.tts_test_views.generate_tts_audio",
side_effect=ValueError("Unsupported language for TTS: zh"),
return_value=b"RIFF" + b"\x00" * 40,
)
def test_preview_tts_returns_wav_for_non_tibetan_language(mock_generate):
response = _post_tts_preview(language="zh", type="TEXT_READING")

assert response.status_code == 200
assert response.headers["content-type"] == "audio/wav"
mock_generate.assert_called_once()


@patch(
"pecha_api.plans.audio.tts_test_views.generate_tts_audio",
side_effect=ValueError("Content cannot be empty"),
)
def test_preview_tts_returns_400_for_validation_error(mock_generate):
response = _post_tts_preview(language="zh")
response = client.post("/preview", json={"text": " ", "language": "en"})

assert response.status_code == 400
assert "Unsupported language" in response.json()["detail"]
assert "Content cannot be empty" in response.json()["detail"]


@patch(
Expand Down
Loading