Speech Recognition (ASR) — технология автоматического распознавания речи, преобразующая аудиосигнал в текстовую последовательность. Современные системы используют deep learning: энкодер (Conformer, Whisper, BiLSTM + CTC) преобразует спектрограмму аудио в последовательность скрытых состояний, декодер (CTC greedy decoding, Beam Search, Transformer decoder) формирует текст. В мобильных приложениях Speech Recognition применяется для голосового ввода, голосовых ассистентов, автоматической транскрибации звонков и 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) → acoustic model (нейросеть: CTC / RNNT / Transducer) → language model (LM) → декодирование (текст). Современные энд-ту-энд модели (Whisper, Google USM, Conformer CTC) объединяют acoustic + language model в один 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 (поисковые запросы). Result через 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. Для максимальной приватности — set 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 для людей с ограничениями моторики — Speech Recognition позволяет управлять приложением голосом: открыть контакты, отправить сообщение, набрать номер. 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 для специфичной терминологии. Minimum: 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также