Fish Audio для прямого общения агента в Яндекс.Телемосте
Fish Audio для прямого общения агента в Яндекс.Телемосте
Короткий вывод
Для Telemost Recorder есть два разных продукта Fish Audio. Новый fishaudio/fish-agent-sdk-web + hosted Fish Agents потенциально закрывает WebRTC-разговор, STT, turn-taking, interruption handling, TTS и подключение собственного OpenAI-compatible LLM, но пока находится в private beta. Доступный для реализации без beta базовый путь — streaming STT/VAD → Hermes → Fish Audio WebSocket TTS. fish-speech следует рассматривать как self-hosted TTS-движок для специального сценария. источник
Главное ограничение: Fish Agents находится в private beta. Поэтому buildable MVP по умолчанию — текущий streaming STT + Hermes/OmniRoute + Fish Audio WebSocket TTS; Fish Agents нужно проверить параллельным gated spike и повысить до приоритетного варианта только после получения доступа и latency/quality теста. источник
Что именно дают проекты Fish Audio
| Проект | Роль в звонке | Пригодность для Telemost | Ограничение |
|---|---|---|---|
[fish-agent-sdk-web](https://github.com/fishaudio/fish-agent-sdk-web) | Готовая разговорная сессия по LiveKit WebRTC | Перспективный gated spike | Hosted/private beta; сам по себе не входит в комнату Телемоста |
[fish-audio-python](https://github.com/fishaudio/fish-audio-python) | API-клиент: ASR + streaming TTS | Хорош для собственного конвейера | Turn-taking, barge-in и audio bridge остаются на нашей стороне |
[fish-audio-typescript](https://github.com/fishaudio/fish-audio-typescript) | Node SDK: realtime TTS, ASR, voices | Естественен для текущего Node/Puppeteer стека | Молодой SDK; browser WS всё равно требует backend proxy |
[WebSocket TTS /v1/tts/live](https://github.com/fishaudio/docs/blob/main/api-reference/asyncapi.yml) | Принимает текст частями, возвращает аудиочанки | Хорош для минимизации time-to-first-audio | Только TTS, не полный агент |
[fish-speech](https://github.com/fishaudio/fish-speech) | Self-hosted S2/S2-Pro TTS | Только если нужны локальность и контроль | 24 GB VRAM; коммерческая лицензия отдельно; локальный API документирован как HTTP TTS |
realtime-vc-gui | Преобразование голоса | Не решает задачу агента | Нет STT/LLM/диалога |
Где находится реальная сложность
Fish Audio решает речевой интеллект, но не мост между двумя независимыми WebRTC-комнатами. У агента должны одновременно существовать:
1. входящий звук участников Телемоста; 2. входной аудиотрек Fish Agent или streaming STT; 3. исходящий звук Fish Agent/Fish TTS; 4. микрофонный трек бота, публикуемый обратно в Телемост; 5. подавление эха и правило прерывания, чтобы агент не слушал собственный голос.
Текущая ветка Telemost Recorder уже перехватывает remote MediaStreamTrack через monkey-patch RTCPeerConnection, пишет общий микс и per-track Opus/WebM. Но в ней нет подтвержденного обратного канала, который публикует синтезированный звук как микрофон в комнату. Поэтому первая инженерная задача — не замена TTS, а двунаправленный audio bridge. source
Рекомендуемая архитектура MVP
Официального realtime media API Телемоста в проверенной документации не найдено. Поэтому базовая транспортная архитектура — Chromium как обычный участник плюс раздельные виртуальные аудиоустройства: telemost_out.monitor для входящей речи и bot_mic для исходящего TTS.
Вариант A — Fish Agents sidecar, gated spike
| Этап | Реализация |
|---|---|
| Телемост → агент | Telemost WebRTC interceptor передает PCM 16 kHz mono в bridge; bridge публикует его как пользовательский audio track в LiveKit-сессию Fish Agent. |
| Разум агента | Fish Agents вызывает наш OpenAI-compatible streaming endpoint; за ним работает Hermes/OmniRoute и доступ к Baza. |
| Агент → Телемост | Bridge подписывается на удаленный audio track Fish Agent, ресемплирует и направляет его в virtual microphone, выбранный Chromium как микрофон бота. |
| Прерывание | На время речи агента сохраняется вход от людей, но из STT/VAD исключается собственный playout; при речи участника Fish Agents выполняет interruption handling. |
| Наблюдаемость | Сохранять live transcript, режимы listening/thinking/speaking, timestamps первого текста/первого аудио, disconnect reason. |
Почему sidecar, а не попытка вставить SDK прямо в страницу Телемоста: SDK управляет своей LiveKit-сессией и микрофоном; Телемост — другая WebRTC-система. Отдельный bridge делает маршрутизацию явной, тестируемой и не зависит от внутреннего DOM Телемоста больше необходимого.
Вариант B — собственный конвейер, buildable MVP
Telemost remote audio → WebRTC/Silero VAD → streaming STT → wake phrase/semantic routing → Hermes/LLM streaming → Fish WebSocket TTS → jitter buffer → virtual mic Телемоста.
Плюсы: доступен без Fish Agents beta, можно оставить существующий Deepgram STT и всю агентскую память у Hermes. Для оркестрации можно использовать Pipecat, где есть официальная интеграция FishAudioTTSService, либо реализовать компактный Node-sidecar рядом с Puppeteer. Fish WebSocket должен открываться server-side: browser WebSocket не умеет передавать требуемые auth/model headers. Минусы: самостоятельно реализуются endpointing, interruption, backpressure, отмена TTS, защита от self-echo и сбор метрик. Это расширение ранее описанного интерактивного голосового агента для встреч.
Вариант C — self-hosted fish-speech
Использовать лишь после отдельного GPU benchmark. Официальные требования указывают 24 GB VRAM для inference, а лицензия требует отдельного разрешения для коммерческого использования. Для первого Telemost MVP это тяжелее и рискованнее hosted API. источник
Решение
Рекомендуется двухконтурный spike:
1. Сначала сделать минимальный Telemost audio bridge: telemost_out.monitor → PCM capture и заранее подготовленная PCM-фраза → bot_mic; проверить слышимость без эха. 2. На этом мосте собрать доступный контур Deepgram streaming STT → Hermes → /v1/tts/live; использовать latency="balanced", FlushEvent на границах фраз и немедленную отмену playback/TTS/LLM при barge-in. 3. Параллельно проверить доступ к Fish Agents и отдельно измерить fish-agent-sdk-web с custom LLM endpoint. 4. Переключить MVP на hosted Fish Agents только если beta-доступ, русский язык, сквозная задержка, приватность и стоимость проходят критерии.
Критерии приемки прототипа
| Критерий | Цель MVP |
|---|---|
| Time-to-first-audio после конца реплики | ≤ 1.5 с, измерять p50/p95 |
| Прерывание агентской речи человеком | ≤ 300 мс от VAD-события до остановки playout |
| Самопрослушивание | 0 ложных ответов на собственный голос в 20 тестовых диалогах |
| Стабильность | 30 минут звонка без разрыва bridge |
| Русская речь | субъективный MOS-тест + WER/ошибки имен на фиксированном наборе |
| Recovery | автоматическое восстановление после краткого сетевого разрыва либо явное завершение с причиной |
Цифры выше — целевые инженерные критерии, а не опубликованные гарантии Fish Audio.
Риски
- Доступ: Fish Agents private beta и может возвращать
403. - Двойной WebRTC: Fish LiveKit и Телемост не соединяются автоматически.
- Лицензия:
fish-speechне permissive для коммерции. - Стоимость: hosted Agents тарифицируется поминутно; цену нужно перепроверять перед эксплуатацией.
- Приватность: звук встречи и транскрипт уходят во внешний Fish Audio сервис в hosted-варианте; требуется согласование обработки данных.
- Браузерные изменения: monkey-patch и DOM-автоматизация Телемоста требуют регрессионных тестов.
- Эхо/feedback: без раздельной маршрутизации входа и выхода агент начнет транскрибировать себя.