Speech Recognition (ASR) — technologie voor automatische spraakherkenning die een audiosignaal omzet in een tekstreeks. Moderne systemen gebruiken deep learning: een encoder (Conformer, Whisper, BiLSTM + CTC) zet het audiospectrogram om in een reeks verborgen toestanden, een decoder (CTC greedy decoding, Beam Search, Transformer decoder) vormt de tekst. In mobiele apps wordt Speech Recognition gebruikt voor spraakinvoer, spraakassistenten, automatische transcriptie van gesprekken en toegankelijkheidsfuncties voor mensen met motorische beperkingen. Volgens Google Cloud Speech-to-Text, 2025 bereikt cloud-ASR een WER van 7% voor Engels en 12% voor Russisch bij SNR > 15 dB.
Belangrijkste punten
Automatic Speech Recognition (ASR) — pipeline: audio → voorverwerking (16 kHz mono, ruisonderdrukking, VAD — spraakactiviteit) → kenmerkextractie (MFCC, LogMel FilterBank) → akoestisch model (neuraal netwerk: CTC / RNNT / Transducer) → taalmodel (LM) → decodering (tekst). Moderne end-to-end modellen (Whisper, Google USM, Conformer CTC) combineren het akoestische en taalmodel in één Transformer, wat de pipeline vereenvoudigt en de nauwkeurigheid verhoogt.
ASR-architecturen voor mobiele apparaten: CTC (Connectionist Temporal Classification) — snel, vereist geen uitlijning van audio en tekst, gebruikt in Vosk, Android native. RNNT (Recurrent Neural Network Transducer) — streaming ASR, lage latentie (Google USM). Conformer — hybride CNN + Transformer, beste nauwkeurigheid, maar zwaarder: Whisper Medium (769M parameters) — 30–60x latentie. Voor on-device heeft CTC de voorkeur: Vosk CTC-modellen nemen 50–100 MB in beslag, latentie 0.3–0.8x real-time.
ASR-metrics: WER (Word Error Rate) — percentage vervangen, verwijderde, ingevoegde woorden ten opzichte van de referentie. Google Cloud ASR — 7% WER (EN), 12% (RU). Vosk — 13% (RU), 9% (EN). Whisper Small — 6% (EN), 10% (RU). CER (Character Error Rate) — analoog, op teken niveau. Real-Time Factor (RTF) — verwerkingstijd / audioduur. RTF < 1 — sneller dan real-time. RTF < 0.3 — real-time ASR. Voor spraakinvoer is RTF < 1 nodig, voor transcriptie RTF < 3.
| ASR Oplossing | WER (EN) | WER (RU) | RTF | On-device |
|---|---|---|---|---|
| Google Cloud ASR | 7% | 12% | 0.3 | Nee |
| Android SpeechRecognizer | 8% | 13% | 0.5–1 | Ja (gemengd) |
| SFSpeechRecognizer | 7% | 12% | 0.3–0.8 | Ja (vanaf iOS 17) |
| Vosk (vosk-model-small-ru) | 9% | 13% | 0.3–0.8 | Ja |
| Whisper Small | 6% | 10% | 2–6 | Ja |
VAD (Voice Activity Detection) — detectie van spraakactiviteit, scheiding van spraak van stilte en ruis. WebRTC VAD — standaard voor mobiele ASR: 30 ms frames, drie modi (0, 1, 2 — van conservatief tot agressief). VAD vermindert RTF met 1.5–3x (slaat niet-spraakdelen over). Silero VAD (MIT) — VAD op basis van een neuraal netwerk, nauwkeuriger dan WebRTC (94% vs 85% ROC AUC), 5–10 ms latentie, TFLite en Core ML. Gebruik voor productie-ASR de cascade VAD → ASR: dit vermindert valse detecties en versnelt de verwerking.
Android SpeechRecognizer — ingebouwde klasse in de Android SDK voor spraakherkenning. Werkt in twee modi: cloud (Google-server) — hoge nauwkeurigheid, vereist internet; on-device (vanaf Android 10+) — ingebouwd ASR-model van GBoard, 20+ talen, WER 15–18%. SpeechRecognizer retourneert tussentijdse resultaten tijdens het spreken en de uiteindelijke tekst. Ondersteunt 60+ talen via RecognizerIntent.EXTRA_LANGUAGE. Aanbevolen voor spraakinvoer — snelle integratie, gratis.
SpeechRecognizer API: aanmaken via SpeechRecognizer.createSpeechRecognizer(context). Intent met RecognizerIntent.ACTION_RECOGNIZE_SPEECH met extra: LANGUAGE_MODEL_FREE_FORM (vrije tekst) of LANGUAGE_MODEL_WEB_SEARCH (zoekopdrachten). Resultaat via RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. Voor continue herkenning (modus „altijd luisteren“) — herstart de recognizer na onResults. Gebruik onDeviceOnly = true om batterij te sparen.
// Android SpeechRecognizer spraakherkenning
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 in Android: on-device werkt zonder internet (Android 10+, Pixel 4+, Samsung S20+). De cloud is nauwkeuriger (Google Neural Network ASM Model), maar heeft een hogere latentie (300–800 ms met netwerk). Gebruik voor spraakinvoer een hybride: cloud met fallback naar on-device bij geen netwerk. Stel voor maximale privacy onDeviceOnly = true in (maar nauwkeurigheid 15–18% WER voor Russisch).
SFSpeechRecognizer — Apple-framework voor spraakherkenning op iOS, macOS, watchOS. Beschikbaar vanaf iOS 10. On-device modus — vanaf iOS 17 (lokaal model, zonder internet). Ondersteunt 60+ talen. Nauwkeurigheid: WER 7–12% (on-device — 12–15%). SFSpeechRecognizer is beschikbaar via Speech.framework — vereist geen extra SDK’s. Toestemmingsverzoek via SFSpeechRecognizer.requestAuthorization.
SFSpeechRecognizer API: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (live audio) of SFSpeechURLRecognitionRequest (audiobestand). Streaming via recognitionTask(with:delegate:) met SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — gedeeltelijk, didFinishRecognition — definitief). On-device modus: request.requiresOnDeviceRecognition = true. Voor iOS 15+: request.shouldReportPartialResults = true (streaming resultaat met lage latentie).
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 heeft native streaming zonder herstart (Android vereist opnieuw startListening). On-device op iOS is beschikbaar vanaf iOS 17 (Android — vanaf Android 10). Beide vereisen gebruikers- toes temming. SFSpeechRecognizer is nauwkeuriger voor Engels (on-device), Android SpeechRecognizer nauwkeuriger voor Russisch (cloud). Voor iOS pre-17 is on-device niet beschikbaar — internet vereist.
Vosk — open-source ASR-bibliotheek van Alpha Cephei voor offline spraakherkenning. Gebaseerd op Kaldi ASR toolkit + CTC-modellen. Ondersteunt 20+ talen: Russisch, Engels, Duits, Frans, Spaans, Chinees, Arabisch. Modellen van 50 MB (small — 50 MB, ru) tot 1.2 GB (large — 1.2 GB, en). Vosk werkt op Android (JNI), iOS (C++ wrapper), Linux, Windows, Raspberry Pi. RTF: 0.3–0.8 op flagship apparaten. Vosk — de beste keuze voor volledige offline ASR.
Vosk API: VoskWaveformModelLoader (model laden) → VoskWaveformRecognizer (herkenner aanmaken) → recognizer.createGrammar(list) of recognizer.getResult() / recognizer.getPartialResult(). Ondersteuning voor grammatica’s (beperkte commando set) — GrammarRecogniser — geeft RTF 0.1–0.3 (3x sneller). Gebruik voor spraakinvoer vrije herkenning (getResult). Voor spraakopdrachten — GrammarRecogniser (99% nauwkeurigheid voor opdrachten).
// 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 is volledig offline — privacy, nul latentie, gratis. De cloud (Google, Yandex) is nauwkeuriger in complexe scenario’s (ruis, accent) — WER 3–5% lager. Vosk is ideaal voor: spraakinvoer zonder internet, toegankelijkheidsapps, transcriptie van gesprekken (privacy). Cloud ASR — voor spraakassistenten waar nauwkeurigheid belangrijker is dan privacy.
Whisper — OpenAI-model voor spraakherkenning, getraind op 680.000 uur audio (meertalig, 99 talen). Beschikbaar in formaten: tiny (39M, WER 10% EN, 15% RU), small (244M, WER 6% EN, 10% RU), medium (769M, WER 4.5% EN, 8% RU). Whisper werkt op mobiele apparaten via Core ML (iOS, ANE) en TFLite (Android, GPU). Whisper tiny: RTF 4–10 op CPU, RTF 0.5–2 op GPU (Android). Whisper small: RTF 2–6 op GPU. Whisper medium — RTF 8–15, alleen voor non-real-time.
Whisper op iOS (Core ML): Apple MLX Whisper — implementatie van Whisper voor Core ML en MLX (Apple Neural Engine). Whisper tiny Core ML op iPhone 15 Pro: RTF 0.3–0.8 (sneller dan real-time!). Whisper small Core ML: RTF 1–3. Voor streaming gebruik WhisperStitcher. Whisper op iOS — de meest nauwkeurige on-device ASR (WER 6% EN, 10% RU).
// Whisper Core ML op 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) // eindtekst met tijdstempels
}
Whisper vs Vosk: Whisper is nauwkeuriger (6% vs 9% WER EN), ondersteunt 99 talen, inclusief taaldetectie, interpunctie, emotieherkenning. Whisper is zwaarder (39M–769M vs 50M Vosk), langzamer in real-time (RTF 0.5–6 vs 0.3–0.8). Vosk is lichter, sneller, beter voor real-time streaming. Whisper — voor eenmalige transcriptie waar nauwkeurigheid prioriteit heeft. Vosk — voor real-time spraakinvoer.
Spraakinvoer van tekst — de meest massale toepassing van ASR: dicteren van berichten, zoekopdrachten, notities. Vereiste: RTF < 1 (real-time), tussentijdse resultaten. Gebruik voor aangepaste implementatie Android SpeechRecognizer / SFSpeechRecognizer. Voor maximale nauwkeurigheid — Cloud ASR + Vosk fallback.
Transcriptie van gesprekken en vergaderingen — ASR voor automatisch maken van stenogrammen. Whisper Small + pyannote-audio — standaard stack. Op iOS — Whisper Core ML. Op Android — Whisper TFLite of Google Cloud ASR.
Spraakassistenten — Siri, Google Assistant, Alexa. Aangepaste assistent: ASR → NLU → Actie → TTS. On-device spraakassistent (Vosk + RASA + TTS) — volledig privé, werkt zonder internet.
// Spraakassistent met 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)
}
})
Toegankelijkheid voor mensen met motorische beperkingen — spraakbesturing van de app via GrammarRecogniser (Vosk) met vaste commandoset (50–100 zinnen) — RTF 0.1–0.3, 99% nauwkeurigheid.
Veelgestelde vragen
Gebruik ruisonderdrukking (WebRTC NS — ingebouwd in Android, iOS AVAudioSession). Pas VAD toe om niet-spraak fragmenten weg te snijden. Whisper is beter bestand tegen ruis. Vosk met ruisonderdrukking via WebRTC geeft +5% WER bij 50 dB ruis.
Ja, vanaf iOS 17 ondersteunt SFSpeechRecognizer de on-device modus. Op iOS 16 en ouder is on-device niet beschikbaar. Alternatieven: Vosk (offline, WER 12–15%), Whisper Core ML (offline, WER 6–10%). Alle oplossingen zijn volledig privé en werken zonder internet.
Android SpeechRecognizer ondersteunt 60+ talen via RecognizerIntent.EXTRA_LANGUAGE. Russisch, Engels, Duits, Frans, Spaans, Italiaans — altijd beschikbaar. On-device modus (Android 10+) — 20+ talen.
Gebruik modelaanpassing: Whisper fine-tuning op 100+ uur domein audio. Vosk — vervanging van het taalmodel (ARPA-formaat) door domein tekstcorpus. Google Cloud ASR — phrase hints. Domeinaanpassing verhoogt de nauwkeurigheid met 15–30% WER.
WER = (S + D + I) / N, waarbij S — substitutions, D — deletions, I — insertions, N — aantal woorden in de referentietekst. Gebruik jiwer (Python) of WER Calculator (JavaScript) voor de berekening. CER — analoog, op teken niveau.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook