Реалізація розпізнавання мови (Speech-to-Text) у мобільному додатку
Розпізнавання мови на мобільних пристроях поділяється на два сценарії: онлайн на базі хмари (краща точність, потребує інтернету) та на пристрої (працює офлайн, достатньо для більшості виробничих завдань). Цей вибір визначає не лише архітектуру, але й вартість експлуатації.
Нативні API: SFSpeechRecognizer та Android STT
iOS SFSpeechRecognizer — вбудований в iOS API, доступний з iOS 10. З iOS 13+ підтримує режим на пристрої (requiresOnDeviceRecognition = true) для 11 мов. Для російської мови доступний лише режим хмари (запити йдуть на сервери Apple). Обмеження: 1 хвилина на запит, приблизно 1000 запитів на день на пристрій без платної угоди.
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru-RU"))
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = false // для російської мови — хмара
request.shouldReportPartialResults = true
Встановлення shouldReportPartialResults = true критично для UX: користувачі бачать текст у міру говоріння, а не чекають завершення запису.
Android SpeechRecognizer — використовує Google Speech Services. Режим офлайн доступний через RecognizerIntent.EXTRA_PREFER_OFFLINE = true, але мовні пакети необхідно завантажити окремо, і вони займають 80–200 МБ. Російський пакет офлайн доступний, але у користувачів він може не бути встановлений — потрібна перевірка та запасний варіант.
Хмарні альтернативи
Коли нативних API недостатньо (користувацькі словники, спеціалізована термінологія, висока точність):
- OpenAI Whisper — найкраща точність серед доступних варіантів, багатомовний. API простий: POST з аудіофайлом. Затримка на боці сервера 1–3 секунди. Доступна мобільна версія Whisper.cpp, компілюється через CMake — працює на пристрої, ~50–200 МБ залежно від розміру моделі.
-
Google Cloud Speech-to-Text v2 — підтримує потокову передачу через gRPC WebSocket, адаптацію під користувацькі словники через
AdaptationAPI. - Яндекс SpeechKit — оптимізований для російської мови, потокова передача через WebSocket.
Потокова передача проти пакетної обробки
Пакетна обробка (запис → стоп → розпізнавання) простіша в реалізації, але гірша для UX. Потокова передача відображає текст у міру говоріння.
Потокова передача на iOS через SFSpeechAudioBufferRecognitionRequest з append(buffer:) із AVAudioEngine:
inputNode.installTap(onBus: 0, bufferSize: 1024, format: format) { buffer, _ in
request.append(buffer)
}
Для потокової передачі Яндекс SpeechKit — WebSocket з розділеним на чанки аудіо в PCM 16 кГц 16-біт. Чанки по 200–400 мс збалансують затримку та накладні витрати.
Приклад: додаток для голосового заповнення форм на складі (оператор диктує дані без рук). Нативний Android STT з офлайн-пакетом російської мови. Проблема: специфічні коди SKU ('артикул 7788-АБВ') розпізнавалися погано. Рішення: Яндекс SpeechKit із користувацьким словником через PhraseSuggestions — додали 3000 артикулів. Точність розпізнавання кодів товарів підвищилася з 61% до 89%.
Дозволи та UX
На iOS NSMicrophoneUsageDescription та NSSpeechRecognitionUsageDescription обов'язкові в Info.plist. Запит дозволів перед першим використанням — через AVAudioSession.requestRecordPermission та SFSpeechRecognizer.requestAuthorization. Без успішної авторизації startRecording() завершиться невдачею без інформативного повідомлення про помилку.
Завжди включайте індикатор запису в UI. Анімована хвиля або імпульсуючий індикатор дає користувачам зрозуміти, що їх слухають.
Терміни
Нативний STT (iOS/Android) з UI — 3–5 днів. Потокова передача з хмарним API та користувацьким словником — 1–2 тижні. Вартість розраховується індивідуально.







