from types import SimpleNamespace import wave import numpy as np from app.services.melo_engine import MeloEngine class FakeMeloModel: def __init__(self) -> None: self.hps = SimpleNamespace( data=SimpleNamespace( spk2id={ "EN-Default": 0, "EN-US": 1, "EN-BR": 2, "EN_INDIA": 3, "EN-AU": 4, } ) ) def tts_to_file( self, text: str, speaker_id: int, output_path: str, speed: float = 1.0 ) -> None: assert text assert speaker_id >= 0 assert speed > 0 pcm = (np.zeros(2400, dtype=np.float32) * 32767.0).astype(np.int16) with wave.open(output_path, "wb") as wav_file: wav_file.setnchannels(1) wav_file.setsampwidth(2) wav_file.setframerate(24000) wav_file.writeframes(pcm.tobytes()) def test_melo_voice_bindings_expose_en_aliases() -> None: engine = MeloEngine(tts_factory=FakeMeloModel) aliases = {row["alias"] for row in engine.list_voice_bindings()} assert aliases >= {"default", "us", "india"} def test_melo_supports_expected_voices() -> None: engine = MeloEngine(tts_factory=FakeMeloModel) assert engine.supports_voice("us") is True assert engine.supports_voice("unknown") is False def test_melo_synthesize_returns_waveform() -> None: engine = MeloEngine(tts_factory=FakeMeloModel) result = engine.synthesize( text="hello", voice="us", speed=1.0, quality="balanced", model_name="melo-en", lang="en", ) assert result.sample_rate == 24000 assert result.waveform.ndim == 1