Files
2026-09-11 19:47:15 +03:00

43 lines
2.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Настройки 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)")