Голосовой доступ выглядит как приятная опция, пока не начинаешь разбираться, зачем он нужен. А нужен он там, где у человека заняты руки или нет привычки печатать: цех, склад, выезд, автомобиль. Мастеру проще спросить вслух, чем набирать запрос на телефоне в перчатках.
Контур собран из двух сервисов: okb-stt на базе faster-whisper (модель large-v3-turbo) распознаёт речь, openedai-speech с движком XTTS её синтезирует. Оба крутятся в контейнерах на том же сервере и той же карте, что и языковая модель.
Как всё это помещается на одну карту
Вопрос закономерный: языковая модель уже занимает большую часть видеопамяти. Ответ в том, что нагрузка разнесена во времени. Распознавание работает, пока человек говорит; генерация ответа — после того, как реплика закончилась; синтез — когда ответ готов. Три сервиса делят карту последовательно, а не одновременно.
Пока пользователь один или их несколько, этого достаточно — на текущем стенде так и работает. Когда одновременных голосовых сессий становится много, последовательность превращается в очередь, и её длину уже видно на глаз. Это ровно та граница, за которой в тарифной сетке начинается Tier 2 (AI Power) с 24–32 ГБ видеопамяти — не ради красоты цифры, а чтобы модели не выгружались из памяти по кругу. Подробности про распределение памяти — в разборе про видеопамять.
Почему это веб-приложение, а не приложение из магазина
Доступ с телефона сделан через PWA — веб-приложение, которое открывается в браузере и ставится на домашний экран. Причины прагматичные:
- Ничего не нужно публиковать в магазинах приложений — а публикация означала бы внешнюю зависимость там, где мы её старательно выпиливаем.
- Обновление приложения — это обновление на сервере заказчика. Ни один телефон не ходит наружу за версией.
- Работает и на Android, и на iOS, и с ноутбука, без отдельной сборки под каждую платформу.
Замочек, из-за которого всё упирается
Дальше начинается самое интересное. Браузер даёт доступ к микрофону только в защищённом контексте — то есть по HTTPS с сертификатом, которому телефон доверяет. Иначе кнопка микрофона просто ничего не делает: разрешение не запрашивается, ошибок не видно, всё «работает», но не работает.
Обычный сайт берёт сертификат у публичного центра сертификации. Наш контур по построению не выходит в интернет, поэтому HTTPS выдаёт Caddy с локальным удостоверяющим центром. Плюс очевиден: нечему протухнуть в неудачный момент, продление не зависит от внешнего сервиса. Минус тоже: корневой сертификат этого центра нужно один раз установить на каждое устройство, с которого будут пользоваться голосом.
Процедура установки на телефоне — не то чтобы сложная, но занудная и различается между Android и iOS. Именно на ней голосовой контур сейчас и стоит.
Приёмка голоса на телефоне у нас не пройдена финально: сертификат, замочек, кнопка микрофона. Распознавание и синтез работают, контур собран, но галочку «принято» мы пока не ставим. Пока не поставим — на демонстрациях голос показываем как есть, с оговоркой, и в договор он не попадает.
Чего голосовой контур не делает
Отдельно проговорим, чтобы не было разочарования на третьей встрече. Транскрипции совещаний с разделением спикеров нет. okb-stt распознаёт отдельные реплики: человек нажал, сказал, получил ответ. Разобрать часовую запись переговоров на реплики с подписями «кто говорит» — это диаризация, отдельная задача, и она в бэклоге.
Также нет непрерывного прослушивания и ключевого слова активации. Микрофон включается по нажатию — не потому, что мы не умеем иначе, а потому, что постоянно включённый микрофон в кабинете руководителя плохо сочетается с тем, что мы продаём.
Коротко
Голос в локальном контуре — это не «подключить облачное распознавание», а собранная на месте цепочка: микрофон в браузере, HTTPS с локальным центром сертификации, faster-whisper, языковая модель, XTTS и обратно в динамик. Сложность живёт не в моделях, а в границах между ними — и текущая незакрытая граница у нас именно там, в приёмке на телефоне.