Riconoscimento vocale (ASR) è una tecnologia di riconoscimento automatico del parlato che converte un segnale audio in una sequenza di testo. I sistemi moderni utilizzano il deep learning: un codificatore (Conformer, Whisper, BiLSTM + CTC) converte lo spettrogramma audio in una sequenza di stati nascosti, e un decodificatore (CTC greedy decoding, Beam Search, Transformer decoder) produce il testo. Nelle applicazioni mobili, il Riconoscimento vocale viene utilizzato per l'input vocale, gli assistenti vocali, la trascrizione automatica delle chiamate e le funzioni di accessibilità per persone con limitazioni motorie. Secondo Google Cloud Speech-to-Text, 2025, l'ASR cloud raggiunge un WER del 7% per l'inglese e del 12% per il russo con SNR > 15 dB.
Punti chiave
Automatic Speech Recognition (ASR) è una pipeline: audio → pre-elaborazione (16 kHz mono, riduzione del rumore, VAD — rilevamento dell'attività vocale) → estrazione delle caratteristiche (MFCC, LogMel FilterBank) → modello acustico (rete neurale: CTC / RNNT / Transducer) → modello linguistico (LM) → decodifica (testo). I modelli moderni end-to-end (Whisper, Google USM, Conformer CTC) combinano il modello acustico e quello linguistico in un unico Transformer, semplificando la pipeline e migliorando la precisione.
Architetture ASR per dispositivi mobili: CTC (Connectionist Temporal Classification) — veloce, non richiede allineamento audio-testo, utilizzata in Vosk e Android nativo. RNNT (Recurrent Neural Network Transducer) — ASR in streaming, bassa latenza (Google USM). Conformer — un ibrido di CNN + Transformer, migliore precisione ma più pesante: Whisper Medium (769M params) — latenza 30–60x. Per su dispositivo, CTC è preferito: i modelli CTC di Vosk occupano 50–100 MB, latenza 0.3–0.8x tempo reale.
Metriche ASR: WER (Word Error Rate) — percentuale di parole sostituite, cancellate e inserite rispetto al riferimento. Google Cloud ASR — 7% WER (EN), 12% (RU). Vosk — 13% (RU), 9% (EN). Whisper Small — 6% (EN), 10% (RU). CER (Character Error Rate) — simile, a livello di caratteri. Real-Time Factor (RTF) — tempo di elaborazione / durata audio. RTF < 1 — più veloce del tempo reale. RTF < 0.3 — ASR in tempo reale. L'input vocale richiede RTF < 1, la trascrizione richiede RTF < 3.
| Soluzione ASR | WER (EN) | WER (RU) | RTF | Su dispositivo |
|---|---|---|---|---|
| Google Cloud ASR | 7% | 12% | 0.3 | No |
| Android SpeechRecognizer | 8% | 13% | 0.5–1 | Sì (ibrido) |
| SFSpeechRecognizer | 7% | 12% | 0.3–0.8 | Sì (da iOS 17) |
| Vosk (vosk-model-small-ru) | 9% | 13% | 0.3–0.8 | Sì |
| Whisper Small | 6% | 10% | 2–6 | Sì |
VAD (Voice Activity Detection) — rilevamento dell'attività vocale, che separa il parlato dal silenzio e dal rumore. WebRTC VAD è lo standard per l'ASR mobile: frame di 30 ms, tre modalità (0, 1, 2 — da conservativa ad aggressiva). VAD riduce l'RTF di 1.5–3x (salta i segmenti non parlati). Silero VAD (MIT) è un VAD neurale, più preciso di WebRTC (94% vs 85% ROC AUC), latenza 5–10 ms, TFLite e Core ML. Per l'ASR in produzione, utilizzare la cascata VAD → ASR: ciò riduce i falsi positivi e accelera l'elaborazione.
Android SpeechRecognizer è una classe integrata nell'SDK Android per il riconoscimento vocale. Funziona in due modalità: cloud (server Google) — alta precisione, richiede Internet; su dispositivo (da Android 10+) — modello ASR incorporato di GBoard, 20+ lingue, WER 15–18%. SpeechRecognizer restituisce risultati intermedi (risultati parziali) durante il parlato e il testo finale. Supporta 60+ lingue tramite RecognizerIntent.EXTRA_LANGUAGE. Raccomandato per l'input vocale — integrazione rapida, gratuito.
API SpeechRecognizer: creazione tramite SpeechRecognizer.createSpeechRecognizer(context). Intent con RecognizerIntent.ACTION_RECOGNIZE_SPEECH con extra: LANGUAGE_MODEL_FREE_FORM (testo libero) o LANGUAGE_MODEL_WEB_SEARCH (query di ricerca). Risultati tramite RecognitionListener: onReadyForSpeech → onBeginningOfSpeech → onRmsChanged → onPartialResults → onResults. Per il riconoscimento continuo (modalità ascolto sempre) — riavviare il riconoscitore dopo onResults. Per risparmiare batteria, utilizzare 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)
Su dispositivo vs Cloud su Android: su dispositivo funziona senza Internet (Android 10+, Pixel 4+, Samsung S20+). Il cloud è più preciso (Google Neural Network ASM Model) ma ha una latenza maggiore (300–800 ms inclusa la rete). Per l'input vocale, utilizzare un approccio ibrido: cloud con fallback su dispositivo in assenza di rete. Android SpeechRecognizer seleziona automaticamente la modalità in base a RecognizerIntent.EXTRA_PREFER_OFFLINE. Per la massima privacy — impostare onDeviceOnly = true (ma la precisione è 15–18% WER per il russo).
SFSpeechRecognizer è il framework di Apple per il riconoscimento vocale su iOS, macOS e watchOS. Disponibile da iOS 10. Modalità su dispositivo — da iOS 17 (modello locale, senza Internet). Supporta 60+ lingue. Precisione: WER 7–12% (su dispositivo — 12–15%). SFSpeechRecognizer è disponibile tramite Speech.framework — non richiede SDK aggiuntivi. Richiesta di autorizzazione tramite SFSpeechRecognizer.requestAuthorization.
API SFSpeechRecognizer: SFSpeechRecognizer(locale: Locale(identifier: "ru_RU")) → SFSpeechAudioBufferRecognitionRequest (audio in diretta) o SFSpeechURLRecognitionRequest (file audio). Streaming tramite recognitionTask(with:delegate:) con SFSpeechRecognitionTaskDelegate (didHypothesizeTranscription — parziale, didFinishRecognition — finale). Modalità su dispositivo: request.requiresOnDeviceRecognition = true. Per iOS 15+: request.shouldReportPartialResults = true (risultato in streaming con bassa latenza).
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 ha lo streaming nativo senza riavvio (Android richiede startListening ripetuto). La modalità su dispositivo su iOS è disponibile da iOS 17 (Android da Android 10). Entrambi richiedono l'autorizzazione dell'utente (NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription per iOS, RECORD_AUDIO per Android). SFSpeechRecognizer è più preciso in inglese (su dispositivo), Android SpeechRecognizer è più preciso in russo (cloud). Per iOS precedente a 17, la modalità su dispositivo non è disponibile — richiede Internet. Per iOS 17+, la modalità su dispositivo fornisce WER 12–14% per il russo.
Vosk è una libreria ASR open source di Alpha Cephei per il riconoscimento vocale offline. Basata su Kaldi ASR toolkit + modelli CTC. Supporta 20+ lingue: russo, inglese, tedesco, francese, spagnolo, cinese, arabo. Modelli da 50 MB (piccolo — 50 MB, ru) a 1.2 GB (grande — 1.2 GB, en). Vosk funziona su Android (JNI), iOS (wrapper C++), Linux, Windows, Raspberry Pi. RTF: 0.3–0.8 su dispositivi di punta. Vosk è la scelta migliore per un ASR offline completo.
API Vosk: VoskWaveformModelLoader (caricamento del modello) → VoskWaveformRecognizer (creazione del riconoscitore) → recognizer.createGrammar(list) o recognizer.getResult() / recognizer.getPartialResult(). Supporto di grammatiche (insieme finito di comandi) — GrammarRecogniser — fornisce RTF 0.1–0.3 (3x più veloce). Per l'input vocale, utilizzare il riconoscimento libero (getResult). Per i comandi vocali — GrammarRecogniser (99% di precisione sui comandi). Vosk supporta anche l'identificazione del parlante (analisi vettoriale della voce).
// 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 ASR cloud: Vosk è completamente offline — privacy, latenza zero, gratuito. Il cloud (Google, Yandex) è più preciso in scenari complessi (rumore, accento) — WER 3–5% inferiore. Vosk è ideale per: input vocale senza Internet, app di accessibilità, trascrizione di chiamate (privacy). L'ASR cloud è per gli assistenti vocali dove la precisione conta più della privacy. Raccomandazione: Vosk per offline, SFSpeechRecognizer (iOS) / SpeechRecognizer (Android) per online — combinare approcci per diversi scenari.
Whisper è un modello di OpenAI per il riconoscimento vocale, addestrato su 680.000 ore di audio (multilingue, 99 lingue). Disponibile in dimensioni: tiny (39M, WER 10% EN, 15% RU), small (244M, WER 6% EN, 10% RU), medium (769M, WER 4.5% EN, 8% RU). Whisper funziona su dispositivi mobili tramite Core ML (iOS, ANE) e TFLite (Android, GPU). Whisper tiny: RTF 4–10 su CPU, RTF 0.5–2 su GPU (Android). Whisper small: RTF 2–6 su GPU. Whisper medium — RTF 8–15, solo per non tempo reale.
Whisper su iOS (Core ML): Apple MLX Whisper — un'implementazione di Whisper per Core ML e MLX (Apple Neural Engine). Whisper tiny Core ML su iPhone 15 Pro: RTF 0.3–0.8 (più veloce del tempo reale!). Whisper small Core ML: RTF 1–3. Whisper Core ML utilizza ANE su A17 Pro (Neural Engine 35 TOPS). Hugging Face Transformers → Esportazione in Core ML tramite coremltools-whisper. Per lo streaming, utilizzare WhisperStitcher (chunking + stitching). Whisper su iOS è l'ASR su dispositivo più preciso (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 è più preciso (6% vs 9% WER EN), supporta 99 lingue, include rilevamento della lingua, punteggiatura e riconoscimento delle emozioni. Whisper è più pesante (39M–769M vs 50M Vosk), più lento in tempo reale (RTF 0.5–6 vs 0.3–0.8). Whisper tiny è paragonabile a Vosk in velocità (RTF 0.5–2 GPU). Vosk è più leggero, più veloce, migliore per lo streaming in tempo reale. Whisper è per la trascrizione una tantum dove la precisione è prioritaria rispetto alla velocità. Vosk è per l'input vocale in tempo reale. Utilizzare Whisper per il testo finale, Vosk per l'uso interattivo.
Input di testo vocale — l'uso più diffuso dell'ASR: dettare messaggi, query di ricerca, note. Requisito: RTF < 1 (tempo reale), risultati parziali (vedere il testo mentre si parla). Android Gboard e la tastiera iOS hanno ASR integrato (su dispositivo, WER 12–18%). Per implementazione personalizzata, utilizzare Android SpeechRecognizer / SFSpeechRecognizer. Per la massima precisione — ASR cloud + fallback Vosk. Per input vocale con precisione del 98% in russo — combinare Vosk (offline) + Yandex SpeechKit (online).
Trascrizione di chiamate e riunioni — ASR per la generazione automatica di trascrizioni. Requisiti: nessun requisito di latenza, WER < 10%, diarizzazione del parlante (chi sta parlando). Whisper Small (offline) + pyannote-audio (diarizzazione) è lo stack standard per la trascrizione. Su iOS — Whisper Core ML (RTF 1–3, WER 6–10%). Su Android — Whisper TFLite (RTF 2–6, WER 8–12%) o Google Cloud ASR + diarizzazione. Per la privacy (le chiamate non vanno sul server) — Whisper sul dispositivo. Precisione della diarizzazione: 80–90% DER.
Assistenti vocali — Siri (SFSpeechRecognizer), Google Assistant (Android SpeechRecognizer), Alexa (ASR su dispositivo). Assistente personalizzato: ASR → NLU (Natural Language Understanding) → Azione → TTS. L'ASR è il primo stadio — determina la precisione dell'intera catena. Per NLU, utilizzare RASA, Snips NLU (su dispositivo) o NLU cloud (Dialogflow, Amazon Lex). Per TTS: Android TTS / iOS AVSpeechSynthesizer. Un assistente vocale su dispositivo (Vosk + RASA + TTS) è completamente privato, funziona senza Internet, latenza < 2 secondi per richiesta.
// 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)
}
})
Accessibilità per persone con limitazioni motorie — Il Riconoscimento vocale consente di controllare l'app con la voce: aprire contatti, inviare messaggio, comporre un numero. Android Voice Access e iOS Switch Control + VoiceOver sono soluzioni integrate. Per implementazione personalizzata: GrammarRecogniser (Vosk) con un insieme fisso di comandi (50–100 frasi) — RTF 0.1–0.3, precisione 99%. Vosk Grammar consente di definire la grammatica in formato BNF. La velocità è fondamentale per l'accessibilità — Vosk Grammar è 5x più veloce del riconoscimento libero e consuma meno batteria.
Domande frequenti
Utilizzare la soppressione del rumore (WebRTC NS — integrato in Android, iOS AVAudioSession). Applicare VAD per tagliare i frammenti non parlati. Aumentare il SNR utilizzando un microfono con beamforming (registrazione direzionale) o un array multi-microfono. Whisper è più resistente al rumore (addestrato su 680K ore con rumore). Vosk con soppressione del rumore tramite WebRTC dà +5% WER a 50 dB di rumore. Per la produzione, testare con le condizioni di rumore della propria applicazione.
Sì, da iOS 17 SFSpeechRecognizer supporta la modalità su dispositivo (requiresOnDeviceRecognition = true). Su iOS 16 e precedenti, la modalità su dispositivo non è disponibile — è richiesta Internet per l'ASR di Siri/Gboard. Alternative: Vosk tramite wrapper C++ (offline, WER 12–15%), Whisper Core ML (offline, WER 6–10%, latenza 2–6x). Per input vocale su iOS 16-, utilizzare Vosk. Whisper Core ML è per la trascrizione di file audio (non in tempo reale). Tutte le soluzioni sono completamente private e funzionano senza Internet.
Android SpeechRecognizer supporta 60+ lingue tramite RecognizerIntent.EXTRA_LANGUAGE. L'elenco completo è determinato da Locale.getAvailableLocales() sul dispositivo. Russo, inglese, tedesco, francese, spagnolo, italiano sono sempre disponibili. Cinese, giapponese, coreano dipendono dal modello del dispositivo. Modalità su dispositivo (Android 10+) — 20+ lingue. A differenza di Vosk (20 lingue) e SFSpeechRecognizer (60 lingue), Android SpeechRecognizer dipende dalla versione di Google Play Services.
Utilizzare l'adattamento del modello: fine-tuning di Whisper su 100+ ore di audio di dominio (Hugging Face Trainer). Vosk — sostituire il modello linguistico (formato ARPA) con un corpus testuale di dominio (100K+ frasi). Google Cloud ASR — phrase hints (parole di dominio, DL=0/1/2). SFSpeechRecognizer — SFSpeechRecognitionTaskDelegate con contextualStrings (array di stringhe di suggerimento). L'adattamento del dominio migliora la precisione del 15–30% WER per la terminologia specifica. Minimo: 500 file audio di dominio con trascrizioni.
WER = (S + D + I) / N, dove S — sostituzioni, D — cancellazioni, I — inserzioni, N — numero di parole nel testo di riferimento. Esempio: riferimento = "ciao come stai", previsione = "ciao cosa fai" → S=1 (come→cosa), D=1 (cancellato "stai"?), I=0 → WER = 2/3 = 66%. Utilizzare la libreria jiwer (Python) o WER Calculator (JavaScript) per il calcolo. CER è simile a livello di caratteri. Per il russo, il CER è del 20–30% inferiore al WER a causa della lunghezza delle parole.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche