first commit
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
"""Настройки 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)")
|
||||
Reference in New Issue
Block a user