Розпізнавання мовлення (ASR) — технологія автоматичного розпізнавання мовлення, що перетворює аудіосигнал у текстову послідовність. Сучасні системи використовують deep learning: енкодер (Conformer, Whisper, BiLSTM + CTC) перетворює спектрограму аудіо в послідовність прихованих станів, декодер (CTC greedy decoding, Beam Search, Transformer decoder) формує текст. У мобільних додатках Розпізнавання мовлення застосовується для голосового введення, голосових асистентів, автоматичної транскрибації дзвінків та accessibility-функцій для людей з обмеженнями моторики. За даними Google Cloud Speech-to-Text, 2025, хмарний ASR досягає WER 7% для англійської мови та 12% для російської при SNR > 15 dB.
Головне
Automatic Speech Recognition (ASR) — пайплайн: аудіо → попередня обробка (16 kHz моно, noise reduction, VAD — виявлення голосової активності) → feature extraction (MFCC, LogMel FilterBank) → акустична модель (нейромережа: CTC / RNNT / Transducer) → мовна модель (LM) → декодування (текст). Сучасні енд-ту-енд моделі (Whisper, Google USM, Conformer CTC) об'єднують акустичну + мовну модель в один Transformer, що спрощує пайплайн і підвищує точність.
Архітектури ASR для мобільних пристроїв: CTC (Connectionist Temporal Classification) — швидка, не потребує вирівнювання аудіо та тексту, використовується в Vosk, Android native. RNNT (Recurrent Neural Network Transducer) — потоковий ASR, низька latency (Google USM). Conformer — гібрид CNN + Transformer, найкраща точність, але важчий: Whisper Medium (769M params) — 30–60x latency. Для on-device CTC є кращим: Vosk CTC моделі займають 50–100 MB, latency 0.3–0.8x real-time.
Метрики ASR: WER (Word Error Rate) — відсоток замінених, видалених, вставлених слів відносно еталону. Google Cloud ASR — 7% WER (EN), 12% (RU). Vosk — 13% (RU), 9% (EN). Whisper Small — 6% (EN), 10% (RU). CER (Character Error Rate) — аналогічно, на рівні символів. Real-Time Factor (RTF) — час обробки / тривалість аудіо. RTF < 1 — швидше реального часу. RTF < 0.3 — real-time ASR. Для голосового введення потрібен RTF < 1, для транскрибації — RTF < 3.
| ASR Рішення | WER (EN) | WER (RU) | RTF | On-device |
|---|---|---|---|---|
| Google Cloud ASR | 7% | 12% | 0.3 | Ні |
| Android SpeechRecognizer | 8% | 13% | 0.5–1 | Так (змішаний) |
| SFSpeechRecognizer | 7% | 12% | 0.3–0.8 | Так (з iOS 17) |
| Vosk (vosk-model-small-ru) | 9% | 13% | 0.3–0.8 | Так |
| Whisper Small | 6% | 10% | 2–6 | Так |
VAD (Voice Activity Detection) — виявлення голосової активності, що відокремлює мовлення від тиші та шуму. WebRTC VAD — стандарт для мобільних ASR: 30 ms фрейми, три режими (0, 1, 2 — від консервативного до агресивного). VAD знижує RTF в 1.5–3x (пропускає немовленнєві ділянки). Silero VAD (MIT) — нейромережевий VAD, точніший за WebRTC (94% vs 85% ROC AUC), 5–10 ms latency, TFLite та Core ML. Для production ASR використовуйте каскад VAD → ASR: це зменшує хибні спрацьовування та прискорює обробку.
Android SpeechRecognizer — вбудований в Android SDK клас для розпізнавання мовлення. Працює в двох режимах: cloud (Google сервер) — висока точність, потребує інтернет; on-device (з Android 10+) — GBoard embedded ASR модель, 20+ мов, WER 15–18%. SpeechRecognizer повертає проміжні результати (partial results) під час мовлення та фінальний текст. Підтримує 60+ мов через RecognizerIntent.EXTRA_LANGUAGE. Рекомендується для голосового введення — швидка інтеграція, безкоштовно.
API SpeechRecognizer: створення через SpeechRecognizer.createSpeechRecognizer(context). Intent з RecognizerIntent.ACTION_RECOGNIZE_SPEECH з extra: LANGUAGE_MODEL_FREE_FORM (вільний текст) або LANGUAGE_MODEL_WEB_SEARCH (пошукові запити). Результат через RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. Для continuous recognition (режим «слухай завжди») — перезапускайте recognizer після onResults. Для економії батареї використовуйте onDeviceOnly = true.
// Android SpeechRecognizer
val recognizer = SpeechRecognizer.createSpeechRecognizer(context)
recognizer.setRecognitionListener(object : RecognitionListener {
override fun onResults(results: Bundle) {
val text = results
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull() ?: ""
showResult(text)
}
override fun onPartialResults(partialResults: Bundle) {
val partial = partialResults
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull() ?: ""
showPartial(partial)
}
})
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ru-RU")
}
recognizer.startListening(intent)
On-device vs Cloud на Android: on-device працює без інтернету (Android 10+, Pixel 4+, Samsung S20+). Cloud — точніший (Google Neural Network ASM Model), але latency вища (300–800 ms включаючи мережу). Для голосового введення використовуйте гібрид: cloud з fallback на on-device при відсутності мережі. Android SpeechRecognizer автоматично вибирає режим залежно від RecognizerIntent.EXTRA_PREFER_OFFLINE. Для максимальної приватності — встановіть onDeviceOnly = true (але точність 15–18% WER для російської).
SFSpeechRecognizer — фреймворк Apple для розпізнавання мовлення на iOS, macOS, watchOS. Доступний з iOS 10. On-device режим — з iOS 17 (локальна модель, без інтернету). Підтримує 60+ мов. Точність: WER 7–12% (on-device — 12–15%). SFSpeechRecognizer доступний через Speech.framework — не потребує додаткових SDK. Запит на дозвіл через SFSpeechRecognizer.requestAuthorization.
API SFSpeechRecognizer: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (live audio) або SFSpeechURLRecognitionRequest (аудіофайл). Streaming через recognitionTask(with:delegate:) з SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — partial, didFinishRecognition — final). On-device режим: request.requiresOnDeviceRecognition = true. Для iOS 15+: request.shouldReportPartialResults = true (потоковий результат з низькою затримкою).
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru_RU"))
guard recognizer.isAvailable else { return }
let request = SFSpeechAudioBufferRecognitionRequest()
request.requiresOnDeviceRecognition = true
request.shouldReportPartialResults = true
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let text = result.bestTranscription.formattedString
let isFinal = result.isFinal
DispatchQueue.main.async {
textView.text = text
}
}
}
audioEngine.inputNode.installTap(config: bufferConfig) { buffer, _ in
request.append(buffer)
}
audioEngine.prepare()
try audioEngine.start()
SFSpeechRecognizer vs Android SpeechRecognizer: SFSpeechRecognizer має нативний streaming без перезапуску (Android потребує повторного startListening). On-device на iOS доступний з iOS 17 (Android — з Android 10). Обидва потребують дозволу користувача (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription для iOS, RECORD_AUDIO для Android). SFSpeechRecognizer точніший на англійській (on-device), Android SpeechRecognizer точніший на російській (cloud). Для iOS до 17 on-device недоступний — потрібен інтернет. Для iOS 17+ on-device дає WER 12–14% для російської.
Vosk — open-source ASR бібліотека від Alpha Cephei для offline-розпізнавання мовлення. Заснована на Kaldi ASR toolkit + CTC-моделі. Підтримує 20+ мов: російська, англійська, німецька, французька, іспанська, китайська, арабська. Моделі від 50 MB (small — 50 MB, ru) до 1.2 GB (large — 1.2 GB, en). Vosk працює на Android (JNI), iOS (C++ wrapper), Linux, Windows, Raspberry Pi. RTF: 0.3–0.8 на флагманських пристроях. Vosk — найкращий вибір для повноцінного offline ASR.
API Vosk: VoskWaveformModelLoader (завантаження моделі) → VoskWaveformRecognizer (створення розпізнавача) → recognizer.createGrammar(list) або recognizer.getResult() / recognizer.getPartialResult(). Підтримка граматик (кінцевого набору команд) — GrammarRecogniser — дає RTF 0.1–0.3 (швидше в 3x). Для голосового введення використовуйте вільне розпізнавання (getResult). Для голосових команд — GrammarRecogniser (99% точність на командах). Vosk також підтримує Speaker Identification (векторний аналіз голосу).
// Vosk offline ASR
val model = VoskModel("model/vosk-model-small-ru-0.22")
model.load()
val recognizer = VoskRecognizer(model, 16000.0f)
recognizer.setWords(true)
audioRecord.startRecording()
while (isListening) {
val buffer = ByteArray(3200) // 100ms audio
audioRecord.read(buffer, 0, buffer.size)
if (recognizer.acceptWaveform(buffer)) {
val result = recognizer.result // JSON
text += JSONObject(result).getString("text")
}
}
Vosk vs Cloud ASR: Vosk повністю офлайн — приватність, zero latency, безкоштовно. Cloud (Google, Yandex) точніший на складних сценах (шум, акцент) — WER на 3–5% нижчий. Vosk ідеальний для: голосового введення без інтернету, accessibility-додатків, транскрибації дзвінків (приватність). Cloud ASR — для голосових асистентів, де точність критичніша за приватність. Рекомендація: Vosk для offline, SFSpeechRecognizer (iOS) / SpeechRecognizer (Android) для online — комбінуйте підходи для різних сценаріїв.
Whisper — модель OpenAI для розпізнавання мовлення, навчена на 680,000 годин аудіо (багатомовний, 99 мов). Доступна в розмірах: tiny (39M, WER 10% EN, 15% RU), small (244M, WER 6% EN, 10% RU), medium (769M, WER 4.5% EN, 8% RU). Whisper працює на мобільних пристроях через Core ML (iOS, ANE) та TFLite (Android, GPU). Whisper tiny: RTF 4–10 на CPU, RTF 0.5–2 на GPU (Android). Whisper small: RTF 2–6 на GPU. Whisper medium — RTF 8–15, тільки для non-real-time.
Whisper на iOS (Core ML): Apple MLX Whisper — реалізація Whisper для Core ML та MLX (Apple Neural Engine). Whisper tiny Core ML на iPhone 15 Pro: RTF 0.3–0.8 (швидше real-time!). Whisper small Core ML: RTF 1–3. Whisper Core ML використовує ANE на A17 Pro (Neural Engine 35 TOPS). Hugging Face Transformers → Export to Core ML через coremltools-whisper. Для streaming використовуйте WhisperStitcher (chunking + stitching). Whisper на iOS — найточніший on-device ASR (WER 6% EN, 10% RU).
// Whisper Core ML on iOS
import MLXWhisper
let model = try WhisperModel(from: "whisper-tiny")
let audio = try AudioUtils.loadAudio(url: audioURL)
let segments = try model.transcribe(audio: Audio, options: TranscribeOptions(
language: "ru",
wordTimestamps: true,
temperature: 0.0
))
for segment in segments {
print(segment.text) // final text with timestamps
}
Whisper vs Vosk: Whisper точніший (6% vs 9% WER EN), підтримує 99 мов, включає language detection, punctuation, emotion recognition. Whisper важчий (39M–769M vs 50M Vosk), повільніший в real-time (RTF 0.5–6 vs 0.3–0.8). Whisper tiny — порівняний з Vosk за швидкістю (RTF 0.5–2 GPU). Vosk легший, швидший, кращий для streaming real-time. Whisper — для одноразової транскрибації, де точність пріоритетніша за швидкість. Vosk — для голосового введення real-time. Для фінального тексту використовуйте Whisper, для інтерактивного — Vosk.
Голосове введення тексту — наймасовіше застосування ASR: диктування повідомлень, пошукових запитів, нотаток. Вимога: RTF < 1 (реальний час), partial results (бачити текст під час вимовляння). Android Gboard та iOS Keyboard мають вбудований ASR (on-device, WER 12–18%). Для кастомної реалізації використовуйте Android SpeechRecognizer / SFSpeechRecognizer. Для максимальної точності — Cloud ASR + Vosk fallback. Для голосового введення з 98% точністю на російській — комбінація Vosk (offline) + Yandex SpeechKit (online).
Транскрибація дзвінків та зустрічей — ASR для автоматичного створення стенограм. Вимоги: no latency requirement, WER < 10%, speaker diarization (хто говорить). Whisper Small (offline) + pyannote-audio (diarization) — стандартний стек для транскрибації. На iOS — Whisper Core ML (RTF 1–3, WER 6–10%). На Android — Whisper TFLite (RTF 2–6, WER 8–12%) або Google Cloud ASR + diarization. Для приватності (дзвінки не йдуть на сервер) — Whisper на пристрої. Точність diarization: 80–90% DER.
Голосові асистенти — Siri (SFSpeechRecognizer), Google Assistant (Android SpeechRecognizer), Alexa (on-device ASR). Кастомний асистент: ASR → NLU (Natural Language Understanding) → Action → TTS. ASR — перший етап — визначає точність всього ланцюжка. Для NLU використовуйте RASA, Snips NLU (on-device), або Cloud NLU (Dialogflow, Amazon Lex). Для TTS: Android TTS / iOS AVSpeechSynthesizer. On-device голосовий асистент (Vosk + RASA + TTS) — повністю приватний, працює без інтернету, latency < 2 секунд на запит.
// Voice assistant with Android SpeechRecognizer + TTS
recognizer.setRecognitionListener(object : RecognitionListener {
override fun onResults(results: Bundle) {
val query = results.getStringArrayList(
SpeechRecognizer.RESULTS_RECOGNITION
)?.firstOrNull() ?: return
val intentResult = nluService.classify(query)
textToSpeech.speak(intentResult.response)
executeAction(intentResult.action)
}
})
Accessibility для людей з обмеженнями моторики — Розпізнавання мовлення дозволяє керувати додатком голосом: відкрити контакти, надіслати повідомлення, набрати номер. Android Voice Access та iOS Switch Control + VoiceOver — вбудовані рішення. Для кастомної реалізації: GrammarRecogniser (Vosk) з фіксованим набором команд (50–100 фраз) — RTF 0.1–0.3, 99% точність. Vosk Grammar дозволяє визначити граматику в BNF-форматі. Для accessibility критична швидкість — Vosk Grammar швидший за вільне розпізнавання в 5x і споживає менше батареї.
Часті запитання
Використовуйте noise suppression (WebRTC NS — вбудований в Android, iOS AVAudioSession). Застосовуйте VAD для відсікання немовленнєвих фрагментів. Збільште SNR через мікрофон з beamforming (направлений запис) або multi-microphone array. Whisper стійкіший до шуму (навчений на 680K годин з шумами). Vosk з шумоподавленням через WebRTC дає +5% WER на шумі 50 dB. Для production використовуйте тестування з шумовими умовами вашого додатку.
Так, з iOS 17 SFSpeechRecognizer підтримує on-device режим (requiresOnDeviceRecognition = true). На iOS 16 та старших on-device недоступний — потрібен інтернет для Siri/Gboard ASR. Альтернативи: Vosk через C++ wrapper (offline, WER 12–15%), Whisper Core ML (offline, WER 6–10%, latency 2–6x). Для голосового введення на iOS 16- використовуйте Vosk. Whisper Core ML — для транскрибації аудіофайлів (не real-time). Всі рішення повністю приватні та працюють без інтернету.
Android SpeechRecognizer підтримує 60+ мов через RecognizerIntent.EXTRA_LANGUAGE. Повний список визначається Locale.getAvailableLocales() на пристрої. Російська, англійська, німецька, французька, іспанська, італійська — завжди доступні. Китайська, японська, корейська — залежить від моделі. On-device режим (Android 10+) — 20+ мов. На відміну від Vosk (20 мов) та SFSpeechRecognizer (60 мов), Android SpeechRecognizer залежить від версії Google Play Services.
Використовуйте model adaptation: Whisper fine-tuning на 100+ годинах доменних аудіо (Hugging Face Trainer). Vosk — заміна Language Model (ARPA format) доменним текстовим корпусом (100K+ речень). Google Cloud ASR — phrase hints (доменні слова, DL=0/1/2). SFSpeechRecognizer — SFSpeechRecognitionTaskDelegate з contextualStrings (масив рядків-підказок). Domain adaptation підвищує точність на 15–30% WER для специфічної термінології. Мінімум: 500 доменних аудіофайлів з транскрипціями.
WER = (S + D + I) / N, де S — substitutions (заміни), D — deletions (видалення), I — insertions (вставки), N — кількість слів в еталонному тексті. Приклад: еталон = «привіт як справи», передбачення = «привіт що робиш» → S=1 (як→що), D=1 (видалено «справи»?), I=0 → WER = 2/3 = 66%. Для розрахунку використовуйте бібліотеку jiwer (Python) або WER Calculator (JavaScript). CER — аналогічно на рівні символів. Для російської мови CER на 20–30% нижчий за WER через довжину слів.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також