Обзор проекта Voice TTS
Цель
Построить локальный GPU-пайплайн преобразования текста в речь (TTS) с интонацией, управляемый через WebSocket API. Система предназначена для озвучки ИИ-агента: текст поступает от LLM кусками в процессе генерации, а аудио отдаётся клиенту в реальном времени.
Ключевые требования
- Локальная работа на GPU: весь инференс выполняется на видеокарте пользователя (RTX 3090 сейчас, RTX 3060 в перспективе).
- Стриминг текста: фразы от LLM приходят частями, сервер не ждёт полного текста.
- Стриминг аудио: синтезированные фрагменты отправляются клиенту сразу после готовности.
- Клонирование голоса: один спикер, задаваемый референсным аудио.
- Эмоции: возможность переключать эмоцию агента по сигналу от ИИ.
- Прерывание: агент может немедленно остановить текущее вещание, если его перебили.
- Мультиязычность: приоритет — русский; поддерживаются также английский, украинский, испанский, немецкий, французский.
- Клиент: Python-агент, сам управляющий дальнейшей маршрутизацией аудиопотока.
Решения, принятые на этапе планирования
Стек
| Компонент |
Выбор |
| Язык |
Python |
| WebSocket сервер |
FastAPI + uvicorn[standard] |
| TTS |
F5-TTS (основной), с возможным fallback на MeloTTS |
| Аудио |
torchaudio, numpy |
| Конфиг |
pydantic-settings |
| Логи |
loguru |
Почему F5-TTS
- Высокое качество и естественная интонация.
- Быстрый инференс, подходит для реалтайма.
- Поддержка клонирования голоса по референсу (zero-shot).
- Мультиязычность из коробки (en, ru, zh), с потенциалом для европейских языков.
- Помещается в VRAM RTX 3060 (12 GB).
Формат аудио
- PCM 16-bit mono, 24 kHz, упакованный в base64.
- Низкая задержка, простая декодировка на клиенте.
- Opus-энкодинг можно добавить позже как опцию.
Архитектура (верхний уровень)
[Python AI Agent]
|
| text chunks over WebSocket
v
[FastAPI WebSocket Server]
|
| buffered text
v
[Text Segmenter]
|
| TTS-ready segments
v
[TTS Queue]
|
v
[GPU TTS Worker] <-- F5-TTS
|
| audio ndarray
v
[Audio Output Queue]
|
| base64 PCM chunks
v
[Python AI Agent -> audio player / sink]
Состояние репозитория
- Реализован серверный каркас с WebSocket API, сегментатором, сессией и управлением прерыванием.
- Подключён F5-TTS как основной бэкенд: модель скачивается в
models/, загружается на GPU и готова к инференсу.
- Dummy TTS остаётся для тестов (
TTS_BACKEND=dummy).
- Следующий этап — подготовка референсных аудио, тёплый старт и замеры реальной латентности.