"""Настройки TTS из .env — единая точка выбора провайдера и скорости речи. Параметры .env (все опциональны): TTS_PROVIDER=edge | piper (по умолчанию edge — лучше качество) TTS_VOICE=ru-RU-SvetlanaNeural (голос edge; мужской: ru-RU-DmitryNeural) TTS_RATE=+15 (скорость речи, %; +быстрее, −медленнее) PIPER_MODEL=models/piper/ru_RU-dmitri-medium.onnx Про скорость: −15 был «для пожилых медленно» по исходному ТЗ; живой тест показал, что хочется быстрее (~+30% к этому темпу) → TTS_RATE=+15. """ from __future__ import annotations from ..brain.config import get_secret from .base import TtsProvider from .provider_edge import EdgeTtsProvider from .provider_piper import PiperTtsProvider def make_tts(provider: str | None = None, **overrides) -> TtsProvider: """Создать TTS-провайдера по .env (+ переопределения в коде для тестов).""" name = (provider or get_secret("TTS_PROVIDER") or "edge").lower() rate = int(get_secret("TTS_RATE") or -15) if name == "edge": kwargs = { "voice": get_secret("TTS_VOICE") or "ru-RU-SvetlanaNeural", "rate": rate, } kwargs.update(overrides) return EdgeTtsProvider(**kwargs) if name == "piper": # Piper: rate % → length_scale (1.15 ≈ −15%, 0.77 ≈ +30%) length_scale = round(100.0 / (100.0 + rate), 3) kwargs = { "model_path": get_secret("PIPER_MODEL") or "models/piper/ru_RU-dmitri-medium.onnx", "length_scale": length_scale, } kwargs.update(overrides) return PiperTtsProvider(**kwargs) raise ValueError(f"Неизвестный TTS_PROVIDER: {name!r} (доступны: edge, piper)")