Robotica e Sistemi Intelligenti
Implementazione delle funzioni di riconoscimento vocale in Ios con il framework di discorso
Table of Contents
L'integrazione del riconoscimento vocale nelle app iOS trasforma come gli utenti interagiscono, offrendo il controllo senza mani, l'inserimento dei dati più veloce e l'accessibilità migliorata. Il framework Speech di Apple offre funzionalità di linguaggio-to-text robuste e on-device che rispettano la privacy degli utenti e forniscono una trascrizione affidabile in tempo reale.
Comprendere l'architettura del quadro di discorso
Il framework Speech (introdotto in iOS 10) opera attraverso tre componenti principali:
- SFSpeechRecognizer[[[]] – L'interfaccia principale che coordina il riconoscimento per una lingua e un locale specifici.
- SFSpeechRecognitionRequest[[] – Rappresenta l'ingresso audio. Due sottoclassi principali: ] per i file audio preregistrati e per i flussi audio dal vivo.
- SFSpeechRecognitionTask[[[]] – gestisce il processo di riconoscimento, fornendo aggiornamenti di progresso e risultati finali.
Per impostazione predefinita, iOS 15+ utilizza il riconoscimento on-device per tutte le lingue supportate, che riduce la latenza e garantisce che i dati non lascino mai il dispositivo. Il riconoscimento basato sul server è ancora disponibile per i dispositivi più vecchi o lingue specifiche, ma richiede una connessione internet attiva e il consenso dell'utente.
Caratteristiche e capacità chiave
- Real-time streaming[ – La voce è trascritta come parla l'utente, con risultati parziali periodici.
- Trascrizioni alternative[[]] – Ogni risultato include molteplici interpretazioni con fiducia che segnano attraverso [ e .
- Parti di testo[[]] – Gli sviluppatori possono fornire frasi personalizzate tramite [] per migliorare l'accuratezza dei termini specifici del dominio.
- Lingue supportate[] – Oltre 60 lingue e accenti regionali.
Impostazione delle autorizzazioni e configurazione del progetto
Sempre richiesta di autorizzazione esplicitamente.[ Senza autorizzazioni adeguate, il sistema respingerà le richieste di riconoscimento.
Info.plist Requisiti
Aggiungi la chiave [ (Privacy – Speech Recognition Use Description) con una chiara spiegazione di interfaccia utente. Esempio:
<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>
Se la tua app registra anche audio (comune per il riconoscimento dal vivo), aggiungi pure.
Richiesta di autorizzazione
Chiamare presto nel ciclo di vita dell'app, in genere su un controller di vista . Il callback restituisce uno dei quattro stati:
import Speech
SFSpeechRecognizer.requestAuthorization { authStatus in
DispatchQueue.main.async {
switch authStatus {
case .authorized:
// Enable microphone and recognition UI
case .denied, .restricted:
// Show error and disable features
print("Speech recognition not available")
case .notDetermined:
// Handle if the user hasn't seen the dialog (rare)
@unknown default:
break
}
}
}
Nota: Il framework può restituire se il dispositivo è gestito da un profilo di controllo parentale o se il riconoscimento vocale è disabilitato tramite Screen Time.
Implementazione del riconoscimento vocale dal vivo
Per la cattura vocale in tempo reale, è necessario un per trasmettere i buffer audio nella richiesta di riconoscimento.
Passo 1: Configurare la sessione audio
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?
func configureAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("Audio session config failed: \(error.localizedDescription)")
}
}
L'opzione abbassa il volume di musica di sottofondo, che migliora l'accuratezza della trascrizione in ambienti rumorosi.Per le app a voce, considerare per indirizzare l'audio attraverso l'altoparlante del dispositivo invece dell'auricolare.
Fase 2: Crea il Riconoscimento e la Richiesta
func startRecognition() {
guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US")),
recognizer.isAvailable else {
handleError("Recognizer unavailable or not supported")
return
}
configureAudioSession()
request.shouldReportPartialResults = true
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let transcribedText = result.bestTranscription.formattedString
// Update UI or process command
print("Partial: \(transcribedText)")
if result.isFinal {
self.stopRecognition()
// Handle final transcription
}
}
if let error = error {
self.stopRecognition()
self.handleError(error.localizedDescription)
}
}
inputNode.installTap(onBus: 0, bufferSize: 1024,
format: recordingFormat) { buffer, _ in
self.request.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
handleError("Audio engine start failed: \(error.localizedDescription)")
}
}
Passo 3: Pulire Gracefully
func stopRecognition() {
recognitionTask?.cancel()
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
request.endAudio()
// Optionally deactivate audio session
try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}
Cancellare sempre l'attività di riconoscimento prima di fermare il motore audio. Dimenticare di rimuovere il rubinetto sul nodo di ingresso può causare i cicli di mantenimento e impedire che il microfono venga rilasciato.
Gestione di locali multilingue e personalizzati
Il framework Speech supporta il rilevamento dinamico della localizzazione, permettendo agli utenti di cambiare le lingue o anche riconoscere più lingue in una singola sessione creando istanze separate .
let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }
// Use recognizers[0] for English, etc.
Per il riconoscimento on-device, ogni riconosciutore consuma la memoria proporzionale al suo modello di lingua.
Termini di Vocabolario e Dominio personalizzati
Migliorare l'accuratezza dei termini specifici del settore utilizzando la proprietà su :
request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]
Questo suggerisce al riconosciutore di favorire queste frasi, riducendo la cattiva conoscenza dei termini non comuni.
Strategie di gestione e di caduta degli errori
Il riconoscimento vocale può fallire per molti motivi: problemi di rete (se si utilizzano server-based), interruzioni audio, microfono disabilitato o pressione di memoria.
enum RecognitionError: LocalizedError {
case noPermission
case unavailable
case audioSessionFailure
case internalError(Error)
var errorDescription: String? {
switch self {
case .noPermission:
return "Speech recognition permission denied"
case .unavailable:
return "Recognizer is busy or not available"
case .audioSessionFailure:
return "Could not start audio capture"
case .internalError(let error):
return error.localizedDescription
}
}
}
func handleError(_ message: String) {
// Show alert, retry button, or fallback to text input
DispatchQueue.main.async {
// Show toast or log
}
}
Monitorare le modifiche dell'attività di riconoscimento tramite proprietà di per rilevare cancellazioni o timeout.
Ottimizzazione delle prestazioni e migliori pratiche
- Preferisci il riconoscimento on-device[[] – Poiché iOS 15, il riconoscimento on-device è il default e offre latenza inferiore. Evitare di forzare server-based a meno che non si abbia bisogno di una lingua non ancora supportata offline.
- Riduce i risultati parziali[ – Impostazione riduce la sovraccarico se hai solo bisogno di trascrizione finale.
- L'utente smette di parlare di riconoscimento di gestione[[[] – Annullare le attività di lungo periodo quando l'utente smette di parlare.
- Battery and memory[[[] – I compiti di riconoscimento e di motore audio consumano risorse significative.
- Testing with mock data[[] – Utilizzare file audio pre-registrati ([]) durante lo sviluppo per evitare dipendenze del microfono.
Interruzioni di gestione
Telefonate, allarmi o Siri possono interrompere una sessione di riconoscimento attivo. Iscriviti a per fermarsi e riprendere con grazia:
NotificationCenter.default.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt else { return }
if type == AVAudioSession.InterruptionType.began.rawValue {
stopRecognition()
} else if type == AVAudioSession.InterruptionType.ended.rawValue {
// Optionally restart recognition
}
}
Considerazioni di accessibilità
Il riconoscimento vocale migliora l'accessibilità per gli utenti con difetti motori o visivi.
- Fornisce un chiaro feedback audio quando l'ascolto inizia/ferma.
- Supporta VoiceOver utilizzando etichette di accessibilità sui pulsanti di riconoscimento.
- Offre un metodo di input basato su testo alternativo nel caso in cui il riconoscimento non venga riconosciuto.
- Rispetta la privacy dell'utente non memorizzando i dati audio senza un esplicito consenso.
Test e debug
I simulatori non includono un microfono; provano su dispositivi fisici. Usa [Xcode’s Speech Recognition diagnostic log[[[FLT: 1:3)] sotto [] e aggiungi ]] con il valore [[]]] per abilitare logging verbose.
Casi di utilizzo reali
- Comandi vocali in un'app CMS[[[]] – Permetti agli editor di dettare contenuti o navigare menu a mani libere. Ad esempio, "Crea un nuovo articolo" innesca un flusso di lavoro specifico.
- Dictation for Note-taking apps[ – Trascrizione in tempo reale con riconoscimento punteggiatura.
- Navigazione orientata all'accessibilità[[] – Gli utenti possono dire “Torna” o “Apri impostazioni” senza toccare lo schermo.
- Trascrizione fisica o giuridica[[[]] – Utilizza stringhe contestuali per la terminologia specifica di dominio e combina con il riconoscimento on-device per la privacy.
Conclusioni
Grazie alla comprensione dell’architettura, alla gestione delle autorizzazioni, alla gestione delle sessioni audio e all’ottimizzazione delle prestazioni, è possibile creare un’esperienza senza interruzioni controllata dalla voce che rispetta la privacy degli utenti.
Per ulteriori informazioni, fare riferimento a Apple ]] Documentazione di framework specifica, ] Guida di valutazione[[[, e il FLT4]Frizione della classe di riconoscimento[]]]. Ulteriori migliori pratiche per l'accessibilità possono essere trovate nel sito [App6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[6][