Speech Recognition (ASR) — technologia automatycznego rozpoznawania mowy, przekształcająca sygnał audio w sekwencję tekstową. Nowoczesne systemy wykorzystują deep learning: enkoder (Conformer, Whisper, BiLSTM + CTC) przekształca spektrogram audio w sekwencję stanów ukrytych, dekoder (CTC greedy decoding, Beam Search, Transformer decoder) tworzy tekst. W aplikacjach mobilnych Speech Recognition jest używane do wprowadzania głosowego, asystentów głosowych, automatycznej transkrypcji rozmów i funkcji accessibility dla osób z ograniczeniami motorycznymi. Według danych Google Cloud Speech-to-Text, 2025, chmurowy ASR osiąga WER 7% dla języka angielskiego i 12% dla rosyjskiego przy SNR > 15 dB.
Najważniejsze
Automatic Speech Recognition (ASR) — pipeline: audio → preprocess (16 kHz mono, noise reduction, VAD — aktywność głosowa) → feature extraction (MFCC, LogMel FilterBank) → model akustyczny (sieć neuronowa: CTC / RNNT / Transducer) → model językowy (LM) → dekodowanie (tekst). Nowoczesne modele end-to-end (Whisper, Google USM, Conformer CTC) łączą model akustyczny i językowy w jeden Transformer, co upraszcza pipeline i zwiększa dokładność.
Architektury ASR dla urządzeń mobilnych: CTC (Connectionist Temporal Classification) — szybka, nie wymaga wyrównania audio i tekstu, używana w Vosk, Android native. RNNT (Recurrent Neural Network Transducer) — strumieniowy ASR, niskie opóźnienie (Google USM). Conformer — hybryda CNN + Transformer, najlepsza dokładność, ale cięższa: Whisper Medium (769M parametrów) — 30–60x latency. Dla on-device CTC jest preferowany: modele CTC Vosk zajmują 50–100 MB, latency 0.3–0.8x czasu rzeczywistego.
Metryki ASR: WER (Word Error Rate) — procent słów zastąpionych, usuniętych, wstawionych względem wzorca. Google Cloud ASR — 7% WER (EN), 12% (RU). Vosk — 13% (RU), 9% (EN). Whisper Small — 6% (EN), 10% (RU). CER (Character Error Rate) — analogicznie, na poziomie znaków. Real-Time Factor (RTF) — czas przetwarzania / czas trwania audio. RTF < 1 — szybciej niż w czasie rzeczywistym. RTF < 0.3 — ASR czasu rzeczywistego. Do wprowadzania głosowego potrzebny RTF < 1, do transkrypcji — RTF < 3.
| Rozwiązanie ASR | WER (EN) | WER (RU) | RTF | On-device |
|---|---|---|---|---|
| Google Cloud ASR | 7% | 12% | 0.3 | Nie |
| Android SpeechRecognizer | 8% | 13% | 0.5–1 | Tak (mieszany) |
| SFSpeechRecognizer | 7% | 12% | 0.3–0.8 | Tak (od iOS 17) |
| Vosk (vosk-model-small-ru) | 9% | 13% | 0.3–0.8 | Tak |
| Whisper Small | 6% | 10% | 2–6 | Tak |
VAD (Voice Activity Detection) — detekcja aktywności głosowej, oddzielająca mowę od ciszy i szumu. WebRTC VAD — standard dla mobilnych ASR: ramki 30 ms, trzy tryby (0, 1, 2 — od konserwatywnego do agresywnego). VAD zmniejsza RTF 1.5–3x (pomija fragmenty niemowe). Silero VAD (MIT) — VAD oparty na sieci neuronowej, dokładniejszy od WebRTC (94% vs 85% ROC AUC), latency 5–10 ms, TFLite i Core ML. Do produkcyjnego ASR używaj kaskady VAD → ASR: zmniejsza to fałszywe wykrycia i przyspiesza przetwarzanie.
Android SpeechRecognizer — wbudowana w Android SDK klasa do rozpoznawania mowy. Działa w dwóch trybach: chmurowy (serwer Google) — wysoka dokładność, wymaga internetu; on-device (od Android 10+) — wbudowany model ASR GBoard, 20+ języków, WER 15–18%. SpeechRecognizer zwraca wyniki częściowe (partial results) podczas mówienia i końcowy tekst. Obsługuje 60+ języków przez RecognizerIntent.EXTRA_LANGUAGE. Zalecany do wprowadzania głosowego — szybka integracja, bezpłatny.
API SpeechRecognizer: tworzenie przez SpeechRecognizer.createSpeechRecognizer(context). Intent z RecognizerIntent.ACTION_RECOGNIZE_SPEECH z extra: LANGUAGE_MODEL_FREE_FORM (dowolny tekst) lub LANGUAGE_MODEL_WEB_SEARCH (zapytania wyszukiwania). Wynik przez RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. Do ciągłego rozpoznawania (tryb „słuchaj zawsze“) — restartuj recognizer po onResults. Aby oszczędzać baterię, używaj onDeviceOnly = true.
// Rozpoznawanie mowy 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 w Android: on-device działa bez internetu (Android 10+, Pixel 4+, Samsung S20+). Chmura — dokładniejsza (model Google Neural Network ASM), ale większe opóźnienie (300–800 ms z siecią). Do wprowadzania głosowego używaj hybrydy: chmura z fallbackiem na on-device przy braku sieci. Android SpeechRecognizer automatycznie wybiera tryb w zależności od RecognizerIntent.EXTRA_PREFER_OFFLINE. Dla maksymalnej prywatności — ustaw onDeviceOnly = true (ale dokładność 15–18% WER dla rosyjskiego).
SFSpeechRecognizer — framework Apple do rozpoznawania mowy na iOS, macOS, watchOS. Dostępny od iOS 10. Tryb on-device — od iOS 17 (model lokalny, bez internetu). Obsługuje 60+ języków. Dokładność: WER 7–12% (on-device — 12–15%). SFSpeechRecognizer jest dostępny przez Speech.framework — nie wymaga dodatkowych SDK. Zapytanie o uprawnienia przez SFSpeechRecognizer.requestAuthorization.
API SFSpeechRecognizer: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (audio na żywo) lub SFSpeechURLRecognitionRequest (plik audio). Streaming przez recognitionTask(with:delegate:) z SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — częściowy, didFinishRecognition — końcowy). Tryb on-device: request.requiresOnDeviceRecognition = true. Dla iOS 15+: request.shouldReportPartialResults = true (wynik strumieniowy z niskim opóźnieniem).
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 ma natywny streaming bez restartu (Android wymaga ponownego startListening). On-device na iOS dostępny od iOS 17 (Android — od Android 10). Oba wymagają zgody użytkownika (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription dla iOS, RECORD_AUDIO dla Android). SFSpeechRecognizer jest dokładniejszy dla angielskiego (on-device), Android SpeechRecognizer dokładniejszy dla rosyjskiego (chmura). Dla iOS przed 17 on-device jest niedostępny — wymagany internet. Dla iOS 17+ on-device daje WER 12–14% dla rosyjskiego.
Vosk — biblioteka ASR open-source od Alpha Cephei do offline’owego rozpoznawania mowy. Oparta na Kaldi ASR toolkit + modele CTC. Obsługuje 20+ języków: rosyjski, angielski, niemiecki, francuski, hiszpański, chiński, arabski. Modele od 50 MB (small — 50 MB, ru) do 1.2 GB (large — 1.2 GB, en). Vosk działa na Android (JNI), iOS (C++ wrapper), Linux, Windows, Raspberry Pi. RTF: 0.3–0.8 na flagowych urządzeniach. Vosk — najlepszy wybór do pełnego offline ASR.
API Vosk: VoskWaveformModelLoader (ładowanie modelu) → VoskWaveformRecognizer (tworzenie rozpoznawacza) → recognizer.createGrammar(list) lub recognizer.getResult() / recognizer.getPartialResult(). Obsługa gramatyk (skończonego zestawu poleceń) — GrammarRecogniser — daje RTF 0.1–0.3 (3x szybciej). Do wprowadzania głosowego używaj swobodnego rozpoznawania (getResult). Do poleceń głosowych — GrammarRecogniser (99% dokładność dla poleceń). Vosk obsługuje również identyfikację mówcy (analiza wektorowa głosu).
// 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) // 100 ms 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 jest całkowicie offline — prywatność, zero opóźnienia, bezpłatny. Chmura (Google, Yandex) jest dokładniejsza w trudnych scenariuszach (szum, akcent) — WER o 3–5% niższy. Vosk jest idealny do: wprowadzania głosowego bez internetu, aplikacji accessibility, transkrypcji rozmów (prywatność). Cloud ASR — dla asystentów głosowych, gdzie dokładność jest ważniejsza niż prywatność. Zalecenie: Vosk do offline, SFSpeechRecognizer (iOS) / SpeechRecognizer (Android) do online — łącz podejścia dla różnych scenariuszy.
Whisper — model OpenAI do rozpoznawania mowy, wytrenowany na 680 000 godzin audio (wielojęzyczny, 99 języków). Dostępny w rozmiarach: tiny (39M, WER 10% EN, 15% RU), small (244M, WER 6% EN, 10% RU), medium (769M, WER 4.5% EN, 8% RU). Whisper działa na urządzeniach mobilnych przez Core ML (iOS, ANE) i TFLite (Android, GPU). Whisper tiny: RTF 4–10 na CPU, RTF 0.5–2 na GPU (Android). Whisper small: RTF 2–6 na GPU. Whisper medium — RTF 8–15, tylko do non-real-time.
Whisper na iOS (Core ML): Apple MLX Whisper — implementacja Whisper dla Core ML i MLX (Apple Neural Engine). Whisper tiny Core ML na iPhone 15 Pro: RTF 0.3–0.8 (szybciej niż w czasie rzeczywistym!). Whisper small Core ML: RTF 1–3. Whisper Core ML wykorzystuje ANE na A17 Pro (Neural Engine 35 TOPS). Hugging Face Transformers → Eksport do Core ML przez coremltools-whisper. Do streamingu używaj WhisperStitcher (chunking + stitching). Whisper na iOS — najdokładniejszy on-device ASR (WER 6% EN, 10% RU).
// Whisper Core ML na 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) // końcowy tekst z sygnaturami czasowymi
}
Whisper vs Vosk: Whisper jest dokładniejszy (6% vs 9% WER EN), obsługuje 99 języków, zawiera wykrywanie języka, interpunkcję, rozpoznawanie emocji. Whisper jest cięższy (39M–769M vs 50M Vosk), wolniejszy w czasie rzeczywistym (RTF 0.5–6 vs 0.3–0.8). Whisper tiny — porównymalny z Vosk pod względem szybkości (RTF 0.5–2 GPU). Vosk jest lżejszy, szybszy, lepszy do streamingu w czasie rzeczywistym. Whisper — do jednorazowej transkrypcji, gdzie dokładność jest ważniejsza niż szybkość. Vosk — do wprowadzania głosowego w czasie rzeczywistym. Do końcowego tekstu używaj Whisper, do interaktywnego — Vosk.
Wprowadzanie głosowe tekstu — najmasowsze zastosowanie ASR: dyktowanie wiadomości, zapytań wyszukiwania, notatek. Wymaganie: RTF < 1 (czas rzeczywisty), wyniki częściowe (widzieć tekst w miarę wypowiadania). Android Gboard i iOS Keyboard mają wbudowany ASR (on-device, WER 12–18%). Do własnej implementacji używaj Android SpeechRecognizer / SFSpeechRecognizer. Dla maksymalnej dokładności — Cloud ASR + Vosk fallback. Do wprowadzania głosowego z 98% dokładnością dla rosyjskiego — kombinacja Vosk (offline) + Yandex SpeechKit (online).
Transkrypcja rozmów i spotkań — ASR do automatycznego tworzenia stenogramów. Wymagania: brak wymagań dotyczących opóźnienia, WER < 10%, diarizacja mówców (kto mówi). Whisper Small (offline) + pyannote-audio (diarization) — standardowy stos do transkrypcji. Na iOS — Whisper Core ML (RTF 1–3, WER 6–10%). Na Android — Whisper TFLite (RTF 2–6, WER 8–12%) lub Google Cloud ASR + diarization. Dla prywatności (rozmowy nie idą na serwer) — Whisper na urządzeniu. Dokładność diarization: 80–90% DER.
Asystenci głosowi — Siri (SFSpeechRecognizer), Google Assistant (Android SpeechRecognizer), Alexa (on-device ASR). Własny asystent: ASR → NLU (rozumienie języka naturalnego) → Akcja → TTS. ASR — pierwszy etap — określa dokładność całego łańcucha. Do NLU używaj RASA, Snips NLU (on-device) lub Cloud NLU (Dialogflow, Amazon Lex). Do TTS: Android TTS / iOS AVSpeechSynthesizer. Asystent głosowy on-device (Vosk + RASA + TTS) — całkowicie prywatny, działa bez internetu, latency < 2 sekund na zapytanie.
// Asystent głosowy z 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 dla osób z ograniczeniami motorycznymi — Speech Recognition pozwala sterować aplikacją głosem: otworzyć kontakty, wysłać wiadomość, wybrać numer. Android Voice Access i iOS Switch Control + VoiceOver — wbudowane rozwiązania. Do własnej implementacji: GrammarRecogniser (Vosk) ze stałym zestawem poleceń (50–100 fraz) — RTF 0.1–0.3, 99% dokładność. Vosk Grammar pozwala zdefiniować gramatykę w formacie BNF. Dla accessibility kluczowa jest szybkość — Vosk Grammar jest 5x szybszy od swobodnego rozpoznawania i zużywa mniej baterii.
Często zadawane pytania
Używaj noise suppression (WebRTC NS — wbudowany w Android, iOS AVAudioSession). Stosuj VAD do odcinania fragmentów niemowych. Zwiększ SNR przez mikrofon z beamforming (kierunkowe nagrywanie) lub multi-microphone array. Whisper jest bardziej odporny na szum (wytrenowany na 680K godzin z szumami). Vosk z redukcją szumów przez WebRTC daje +5% WER przy szumie 50 dB. Do produkcji używaj testowania z warunkami szumowymi twojej aplikacji.
Tak, od iOS 17 SFSpeechRecognizer obsługuje tryb on-device (requiresOnDeviceRecognition = true). Na iOS 16 i starszych on-device jest niedostępny — wymagany internet dla Siri/Gboard ASR. Alternatywy: Vosk przez C++ wrapper (offline, WER 12–15%), Whisper Core ML (offline, WER 6–10%, latency 2–6x). Do wprowadzania głosowego na iOS 16- używaj Vosk. Whisper Core ML — do transkrypcji plików audio (nie real-time). Wszystkie rozwiązania są całkowicie prywatne i działają bez internetu.
Android SpeechRecognizer obsługuje 60+ języków przez RecognizerIntent.EXTRA_LANGUAGE. Pełną listę określa Locale.getAvailableLocales() na urządzeniu. Rosyjski, angielski, niemiecki, francuski, hiszpański, włoski — zawsze dostępne. Chiński, japoński, koreański — zależy od modelu. Tryb on-device (Android 10+) — 20+ języków. W przeciwieństwie do Vosk (20 języków) i SFSpeechRecognizer (60 języków), Android SpeechRecognizer zależy od wersji Google Play Services.
Używaj model adaptation: Whisper fine-tuning na 100+ godzinach domenowych audio (Hugging Face Trainer). Vosk — wymiana modelu językowego (format ARPA) na domenowy korpus tekstowy (100K+ zdań). Google Cloud ASR — phrase hints (słowa domenowe, DL=0/1/2). SFSpeechRecognizer — SFSpeechRecognitionTaskDelegate z contextualStrings (tablica słów podpowiedzi). Domain adaptation zwiększa dokładność o 15–30% WER dla specyficznej terminologii. Minimum: 500 domenowych plików audio z transkrypcjami.
WER = (S + D + I) / N, gdzie S — substitutions (zamiany), D — deletions (usunięcia), I — insertions (wstawienia), N — liczba słów w tekście wzorcowym. Przykład: wzorzec = „przywitaj się“, predykcja = „przywitaj się“ → S=0, D=0, I=0 → WER = 0/2 = 0%. Do obliczeń używaj biblioteki jiwer (Python) lub WER Calculator (JavaScript). CER — analogicznie na poziomie znaków. Dla języka rosyjskiego CER jest o 20–30% niższy niż WER ze względu na długość słów.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również