Голосовой канал LocalAI: речь в микрофон, ответ голосом

Речь в микрофон уходит в LocalAI, ответ модели возвращается голосом в динамики — простой канал «сказал → услышал».

Стек LocalAI, Python, STT, TTS, WebSocket

Наладил двусторонний голосовой канал на Windows: пользователь говорит в микрофон, речь уходит в LocalAI (STT), текст — в LLM через прокси, ответ возвращается TTS в динамики. Дуплекс, barge-in и смена моделей в эту сдачу не входили — нужен был простой канал «сказал → услышал».

Разобрал обрыв realtime: WebSocket-сессия жила, а в динамики была тишина. Слой cloud-proxy звал gRPC PredictStream в режиме passthrough, который стрим не умеет — аудиобайты до клиента не доходили. Прямой HTTP TTS при этом уже отдавал WAV и русский голос.

Поправил пайплайн: унарный TTS, совместимый вызов LLM, прокси на границе (OpenAI-совместимый /v1/chat/completions, SSE). Собрал лабораторный стенд без GPU заказчика: сломанный путь воспроизводится, исправленный играет фразу в колонки. Для его ПК — пакет патча (yaml, Python-прокси, PowerShell), отчёт и короткая проверка Talk.

Поднял таймауты и очередь на прокси, чтобы длинный STT+LLM не рвался по 90 секундам шлюза. Стек: Python, LocalAI Realtime, WebSocket, TTS/STT, PowerShell. NDA: контур заказчика не публикуется.