Table of Contents
Integrarea recunoașterii vocii în aplicațiile iOS transformă modul în care utilizatorii interacționează, oferind control fără mâini, accesarea mai rapidă a datelor și îmbunătățirea accesibilității. Cadrul de vorbire al Apple oferă capacități solide, de vorbire pe dispozitiv, care respectă confidențialitatea utilizatorilor și oferă transcriere în timp real fiabilă. Acest articol acoperă totul de la configurarea fundațională la modele avansate de implementare, inclusiv optimizarea performanțelor, suport multilingv și gestionarea erorilor bunelor practici.
Înțelegerea arhitecturii-cadru a discursului
Cadrul de vorbire (introdus în iOS 10) funcționează prin trei componente principale:
- SfspeechRecognizer
- SFS speechRecognitionRequest
- SFS speechRecognitionTask
Cadrul procesează audio printr-un motor automat de recunoaștere a vorbirii (ASR). În mod implicit, iOS 15+ folosește recunoașterea pe dispozitiv pentru toate limbile acceptate, care reduce latența și asigură datele nu lasă niciodată dispozitivul. Recunoașterea pe bază de server este încă disponibilă pentru dispozitive mai vechi sau limbi specifice, dar necesită o conexiune activă la internet și consimțământul utilizatorului.
Caracteristici cheie și capacități
- Transmisie în timp real
- Tolnologie alternativă
- Frasele contextuale
- Limbi acceptate
Configurare permisiuni și configurare proiect
Întotdeauna solicitaţi autorizaţie explicit. Fără permisiuni adecvate, sistemul va respinge cererile de recunoaştere. Urmaţi aceşti paşi:
Cerințe de informare.plist
Adaugă cheia (Privietate
<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>
Dacă aplicaţia dumneavoastră înregistrează şi audio (frecvent pentru recunoaşterea în direct), adăugaţi şi .
Cerere de autorizare
Apel timpuriu în ciclul de viață al aplicației, de obicei pe un controler vizual . Apelul returnează unul dintre cele patru statute:
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
}
}
}
Notă: Cadrul poate reveni dacă dispozitivul este gestionat de un profil de control parental sau dacă recunoașterea vorbirii este dezactivată prin intermediul Ecrane Time.
Punerea în aplicare a recunoașterii discursului în direct
Pentru captarea vocii în timp real, aveți nevoie de un pentru a introduce tampoane audio în cererea de recunoaștere. Următorul cod demonstrează o implementare pregătită de producție cu o curățare adecvată.
Pasul 1: Configurează sesiunea 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)")
}
}
Opțiunea reduce volumul muzicii de fundal, ceea ce îmbunătățește acuratețea transcripției în medii zgomotoase. Pentru aplicațiile exclusiv vocale, ia în considerare să direcționeze audio prin difuzor în locul castii.
Pasul 2: Creați un recunoștitor și o cerere
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)")
}
}
Pasul 3: Curăţaţi cu graţie
func stopRecognition() {
recognitionTask?.cancel()
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
request.endAudio()
// Optionally deactivate audio session
try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}
Anulați întotdeauna sarcina de recunoaștere înainte de oprirea motorului audio. Uitând să eliminați robinetul de pe nodul de intrare poate provoca cicluri de reținere și pentru a preveni lansarea microfonului.
Manipularea localurilor multilingve și personalizate
Cadrul de vorbire sprijină detectarea dinamică a localurilor. Puteți permite utilizatorilor să schimbe limbile sau chiar să recunoască mai multe limbi într-o singură sesiune prin crearea unor situații separate .
let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }
// Use recognizers[0] for English, etc.
Pentru recunoașterea pe dispozitiv, fiecare recunoștitor consumă memorie proporțională cu modelul său de limbă. Performanță de testare pe dispozitive mai vechi atunci când susține mai multe limbi.
Termeni personalizați vocabular și domeniu
Îmbunătăţirea preciziei pentru termeni specifici industriei prin utilizarea proprietăţii pe :
request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]
Acest lucru indică faptul că recunoaşterea favorizează aceste fraze, reducând recunoaşterea greşită a unor termeni neobişnuiţi.
Strategii de manipulare a erorilor și de retragere a apelurilor
Recunoaşterea vocală poate eşua din mai multe motive: probleme de reţea (dacă se utilizează server-based), întreruperi audio, microfon dezactivat, sau presiune de memorie. Implementaţi un handler robust:
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
}
}
Monitorizează modificările de stare a sarcinii prin proprietatea de a detecta anulările sau timeout-urile.
Optimizarea performanței și cele mai bune practici
- Preferă recunoașterea pe-dispozitiv
- Rezultate parțiale limit
- Manage recunoastere viataspan
- Baterie și memorie
- Testarea cu date simulate
Întreruperea gestionării
Apelurile telefonice, alarmele sau Siri pot întrerupe o sesiune de recunoaştere activă. Abonează-te la pentru a întrerupe şi relua graţios:
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
}
}
Considerații privind accesibilitatea
Recunoaşterea vocală sporeşte accesibilitatea pentru utilizatorii cu tulburări motorii sau vizuale. Asiguraţi-vă că sunteţi implementat:
- Oferă feedback audio clar atunci când ascultă începe/oprește.
- Suportă VoceOver prin utilizarea etichetelor de accesibilitate pe butoanele de recunoaștere.
- Oferă o metodă alternativă de intrare bazată pe text în cazul în care recunoașterea nu reușește.
- Respectă confidențialitatea utilizatorului prin faptul că nu stochează date audio fără consimțământul explicit.
Testare și depanare
Simulatoare nu includ un microfon; test pe dispozitive fizice. Utilizați Xcode
Cazuri de utilizare la nivel mondial
- Voice commands in a CMS app
- Dictație pentru aplicații care iau notițe
- Accesibilitate-focalizat de navigare
- Medical or legal transcription
Concluzie
Cadrul de vorbire Apples oferă o bază solidă pentru adăugarea recunoașterii vocale la aplicațiile iOS. Prin înțelegerea arhitecturii, manipularea permisiunilor în mod corespunzător, gestionarea sesiunilor audio și optimizarea pentru performanță, puteți crea o experiență fără probleme controlată de voce care respectă confidențialitatea utilizatorului. Testați întotdeauna pe dispozitive reale, luați în considerare mecanismele de rezervă, și păstrați contextul utilizatorului în minte pentru a oferi o caracteristică care îmbunătățește cu adevărat usabilitatea.
Pentru o citire ulterioară, a se vedea Apple Documentație-cadru pentru vorbire, [AVAudioSession guide, și SFSpeechRecognizer class .Cele mai bune practici suplimentare pentru accesibilitate pot fi găsite în Site-ul web privind accesibilitatea .