Реалізація голосового помічника у мобільному додатку
Голосовий помічник у мобільному додатку — це не просто кнопка з мікрофоном. Це конвеєр з кількох компонентів: VAD (виявлення голосової активності), STT, NLU/розпізнавання намірів, обробка бізнес-логіки, TTS. Кожен компонент додає затримку. Мета — сумарна затримка від кінця мовлення користувача до початку відповіді ≤1.5 секунди. Це технічне обмеження, а не маркетингова мета.
Архітектура конвеєру
Мікрофон → VAD → STT → NLU → Логіка → TTS → Динамік
↕ ↕
Потокова База інтентів
VAD — виявлення голосової активності запобігає передаванню тиші до STT. WebRTCVAD (нативна бібліотека) або SileroVAD (ONNX/TFLite, ~1 МБ). VAD зменшує хибні спрацювання та економить виклики API.
STT — перетворення мови у текст. Варіанти: нативний SFSpeechRecognizer / Android STT для простих випадків; OpenAI Whisper API або Яндекс SpeechKit для російської мови з високою точністю.
NLU — вилучення інтенту та сутностей з тексту. Приклад: «додай молоко до списку покупок» → intent: ADD_TO_LIST, entity: {item: молоко, list: покупки}. Рішення:
- Rasa NLU — відкритий код, self-hosted, навчається на ваших даних. Підходить для складних домен з багатьма інтентами.
- Dialogflow ES/CX — NLU хмари Google, швидкий старт, хороша підтримка російської мови. Платна при великому обсязі.
-
LLM-базована класифікація — ChatGPT / Claude API з структурованим виводом (
function calling). Гнучка, не потребує анотації навчальних даних, дорожче при високому трафіку. - On-device BERT — MobileBERT TFLite, ~50 МБ, класифікує інтенти з фіксованого набору. Працює офлайн.
Розпізнавання інтентів: що насправді працює
Для додатків з обмеженою доменою (розумний дім, інтернет-банк, навігація) — Rasa NLU або Dialogflow з явними інтентами. 50–200 прикладів навчання на інтент достатньо.
Для відкритої домени — LLM із системним промптом, що описує доступні дії. LLM повертає JSON через function calling:
{
"intent": "navigate_to",
"destination": "ресторан Пушкіна",
"time": null
}
Затримка LLM-запиту: 400–800 мс для gpt-4o-mini, 200–400 мс для Claude Haiku. Додаємо до STT (800–1500 мс хмара) та TTS (~300 мс). Всього: 1.3–2.8 секунди. На межі комфортного.
Оптимізація: запускати LLM-запит паралельно під час останніх 200 мс STT (перед остаточним результатом), кешувати часті інтенти локально.
Контекст діалогу
Голосовий помічник без пам'яті контексту ламається на другому запитанні: «Хто директор Газпрому?» — відповідь. «А його дружина?» — без контексту незрозуміло, чия дружина. Контекст — масив останніх N повідомлень, передається кожному LLM-запиту або сесії Dialogflow.
Керування контекстом на мобілі: ConversationStore — singleton із списком @Published повідомлень. Максимум 10–15 останніх повідомлень (~2000 токенів контексту достатньо для більшості діалогів).
Слово пробудження (опціонально)
«Привіт, [AppName]» без натиснення кнопки — працює через PorcupineManager від Picovoice. На пристрої, користувацьке слово пробудження, ~500 КБ моделі. Споживання батареї — ~1.5% на годину на сучасних пристроях. На iOS потребує фонову аудіо-сесію, яку Apple перевіряє під час огляду.
Приклад
Корпоративний помічник для польових співробітників: голосове створення завдань та запитів у CRM без розблокування телефону. Стек: SileroVAD на пристрої → Яндекс SpeechKit потокова передача → Rasa NLU (self-hosted, 23 інтента) → API REST CRM → Яндекс SpeechKit TTS. Затримка від кінця мовлення до початку відповіді: медіана 1.1 секунди, p95 2.3 секунди. Rasa NLU на власному сервері забезпечив повний контроль над даними.
Терміни
Конвеєр STT + NLU з фіксованим набором інтентів + TTS — 2–3 тижні. Зі словом пробудження, контекстом діалогу та інтеграцією з бізнес-логікою — 4–6 тижнів. Вартість розраховується індивідуально.







