43 lines
2.0 KiB
Python
43 lines
2.0 KiB
Python
"""Настройки 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)") |