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