Реализация голосового помощника в мобильном приложении
Голосовой помощник в мобильном приложении — это не кнопка с микрофоном. Это пайплайн из нескольких компонентов: VAD (Voice Activity Detection), STT, NLU/Intent Recognition, обработка бизнес-логики, TTS. Каждый компонент добавляет latency. Цель — суммарная latency от конца фразы пользователя до начала ответа ≤1.5 секунды. Это техническое ограничение, не маркетинговая цель.
Архитектура пайплайна
Микрофон → VAD → STT → NLU → Logic → TTS → Динамик
↕ ↕
Streaming Intent DB
VAD — обнаружение голосовой активности, чтобы не передавать тишину в STT. WebRTCVAD (нативная библиотека) или SileroVAD (ONNX/TFLite, ~1 MB). VAD снижает ложные срабатывания и экономит API-вызовы.
STT — преобразование речи в текст. Выбор: нативный SFSpeechRecognizer / Android STT для простых случаев; OpenAI Whisper API или Яндекс SpeechKit для русского с высокой точностью.
NLU — извлечение интента и сущностей из текста. Например: «добавь молоко в список покупок» → intent: ADD_TO_LIST, entity: {item: молоко, list: покупки}. Решения:
- Rasa NLU — open source, self-hosted, обучается на своих данных. Подходит для сложных доменов с множеством интентов.
- Dialogflow ES/CX — Google cloud NLU, быстро стартовать, хорошая русскоязычная поддержка. Платно при большом объёме.
-
LLM-based classification — ChatGPT / Claude API с structured output (
function calling). Гибкий, не требует разметки обучающих данных, дороже при высоком трафике. - On-device BERT — MobileBERT TFLite, ~50 MB, классификация интентов из фиксированного набора. Работает офлайн.
Intent Recognition: что реально работает
Для приложений с ограниченным доменом (умный дом, интернет-банк, навигация) — Rasa NLU или Dialogflow с явно прописанными интентами. 50–200 обучающих примеров на интент достаточно.
Для открытого домена — LLM с system prompt, описывающим доступные действия. LLM возвращает JSON через function calling:
{
"intent": "navigate_to",
"destination": "ресторан Пушкин",
"time": null
}
Latency LLM-запроса: 400–800 ms для gpt-4o-mini, 200–400 ms для Claude Haiku. Добавляем к STT (800–1500 ms облако) и TTS (~300 ms). Суммарно: 1.3–2.8 секунды. На грани комфортного.
Оптимизация: запускать LLM-запрос параллельно с последними 200 ms STT (до финального результата), кэшировать частые интенты локально.
Контекст диалога
Голосовой помощник без памяти контекста ломается на втором вопросе: «Как зовут директора Газпрома?» — ответ. «А его жену?» — без контекста непонятно, чьей жены. Контекст — массив последних N сообщений, передаётся в каждый LLM-запрос или Dialogflow-сессию.
Управление контекстом на мобиле: ConversationStore — singleton с @Published списком Message. Максимум 10–15 последних сообщений (по токенам — ~2000 токенов контекста достаточно для большинства диалогов).
Wake Word (опционально)
«Привет, [AppName]» без нажатия кнопки — работает через PorcupineManager от Picovoice. On-device, кастомное wake word, ~500 KB модели. Потребление батареи — ~1.5% в час на современных устройствах. На iOS требует фоновую аудио-сессию, что Apple проверяет при ревью.
Кейс
Корпоративный ассистент для полевых сотрудников: голосовое создание задач и запросов в CRM без разблокировки телефона. Стек: SileroVAD on-device → Яндекс SpeechKit streaming → Rasa NLU (self-hosted, 23 интента) → CRM REST API → Яндекс SpeechKit TTS. Latency от конца фразы до начала ответа: медиана 1.1 секунды, p95 2.3 секунды. Rasa NLU — собственный сервер, что дало полный контроль над данными.
Сроки
Пайплайн STT + NLU с фиксированным набором интентов + TTS — 2–3 недели. С wake word, контекстом диалога и интеграцией с бизнес-логикой — 4–6 недель. Стоимость рассчитывается индивидуально.







