| 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 |
|
|