src/voice_tts/api/)server.py — FastAPI-приложение, endpoint /ws, управление сессией.protocol.py — Pydantic-модели всех входящих и исходящих сообщений.Отвечает за:
src/voice_tts/session/)state.py — SessionState и VoiceProfile.Хранит:
stop_event).src/voice_tts/tts/segmenter.py)Segmenter превращает накопленный текст в сегменты для синтеза.
Правила:
., 。, !, ?, ;, : и newline).max_length, разрез по запятой/тире/скобкам.min_length) не применяется при принудительном flush.src/voice_tts/tts/)engine.py — абстрактный базовый класс TTSEngine и DummyTTSEngine для тестов.f5_backend.py — реализация на F5-TTS, включая кэширование транскрибированных референсов.Интерфейс:
async def synthesize(
self,
text: str,
ref_audio_path: Path | None,
language: str,
speed: float,
emotion: str,
) -> np.ndarray:
...
src/voice_tts/audio/)formats.py — преобразование float32 -> PCM16 -> base64, генерация WAV-заголовка.src/voice_tts/config.py)pydantic-settings, загружает переменные из .env.
WebSocket receiver (async)
|
v
SessionManager
|
+---> Text buffer / Segmenter
| |
| v
| _synthesize_segment (async task per segment)
| |
| v
| TTS Engine (GPU-bound, выполняется в отдельной задаче)
| |
| v
| audio_queue.put((segment_seq, pcm))
|
+---> _audio_sender (async worker)
|
+---> WebSocket send(audio base64)
|
+---> WebSocket send(status: segment_finished)
Важно: все обращения к CUDA-инференсу сериализованы через один TTS worker, чтобы избежать contention и OOM.
Каждая сессия содержит asyncio.Event stop_event.
При получении сообщения stop:
stop_event.status: stopped.Новый текст после stop автоматически сбрасывает stop_event и начинает новую фразу.