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) → декодирање (текст). Савремени end-to-end модели (Whisper, Google USM, Conformer CTC) обједињују acoustic + language model у један Transformer, што поједностављује пајплајн и повећава тачност.
ASR архитектуре за мобилне уређаје: CTC (Connectionist Temporal Classification) — брза, не захтева поравнање аудија и текста, користи се у Vosk-у, Android native. RNNT (Recurrent Neural Network Transducer) — stream 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. Препоручује се за гласовни унос — брза интеграција, бесплатно.
SpeechRecognizer API: креирање преко 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.
SFSpeechRecognizer API: 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 (stream резултат са малим кашњењем).
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.
Vosk API: VoskWaveformModelLoader (учитавање модела) → VoskWaveformRecognizer (креирање препознавача) → recognizer.createGrammar(list) или recognizer.getResult() / recognizer.getPartialResult(). Подршка граматика (коначног скупа команди) — GrammarRecogniser — даје RTF 0.1–0.3 (брже 3x). За гласовни унос користите слободно препознавање (getResult). За гласовне команде — GrammarRecogniser (99% тачност на командама). Vosk такође подржава Speaker Identification (векторска анализа гласа).
// Vosk офлајн 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 аудио
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 на 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) // финални текст са временским ознакама
}
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 секунде на захтев.
// Гласовни асистент са 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 формат) доменским текстуалним корпусом (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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође