Riconoscimento vocale — cos'è, tecnologie e principio di funzionamento

Autore: IT Sectr Pubblicato: 2026-07-19 Tempo di lettura: 10 min

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

  • Riconoscimento vocale — conversione della voce in testo (ASR) mediante reti neurali
  • Android SpeechRecognizer — ASR su dispositivo + cloud, 60+ lingue, WER 7–12%
  • SFSpeechRecognizer — riconoscimento nativo iOS, su dispositivo da iOS 17
  • Vosk — ASR offline, 20+ lingue, latenza 0.5–1.5x tempo reale, WER 13% russo
  • Whisper — ASR di OpenAI, su dispositivo tramite Core ML / TFLite, multilingua

Cos'è il Riconoscimento vocale: principi dell'ASR

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 ASRWER (EN)WER (RU)RTFSu dispositivo
Google Cloud ASR7%12%0.3No
Android SpeechRecognizer8%13%0.5–1Sì (ibrido)
SFSpeechRecognizer7%12%0.3–0.8Sì (da iOS 17)
Vosk (vosk-model-small-ru)9%13%0.3–0.8
Whisper Small6%10%2–6

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 API

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.

kotlin
// 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).

iOS SFSpeechRecognizer e Speech Framework

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).

swift
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: riconoscimento offline in 20+ lingue

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).

kotlin
// 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 OpenAI su dispositivi mobili

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).

swift
// 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.

Applicazioni del Riconoscimento vocale in ambito mobile

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.

kotlin
// 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

Come migliorare la precisione del riconoscimento vocale in un ambiente rumoroso?

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.

È possibile riconoscere la voce senza Internet su iOS?

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.

Quali lingue supporta Android SpeechRecognizer?

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.

Come configurare il riconoscimento vocale per un dominio specifico (medicina, legge)?

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.

Come calcolare il WER (Word Error Rate) per l'ASR?

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

  • Riconoscimento vocale (ASR) — conversione dell'audio in testo tramite modelli CTC/RNNT/Transformer
  • Android SpeechRecognizer — 60+ lingue, cloud + su dispositivo (Android 10+), WER 8–15%
  • SFSpeechRecognizer (iOS) — 60+ lingue, su dispositivo da iOS 17, WER 7–14%
  • Vosk — ASR offline, 20+ lingue, RTF 0.3–0.8, WER 9–13%
  • Whisper — ASR più preciso (WER 6% EN), 99 lingue, ma pesante per il tempo reale
  • Su dispositivo — privacy, senza Internet, Vosk/Whisper Core ML
  • Applicazioni — input vocale, trascrizione, assistenti, accessibilità

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.

Discuti il progetto

Leggi anche