L'intégration de la reconnaissance vocale dans les applications iOS transforme la façon dont les utilisateurs interagissent, offrent un contrôle mains libres, une entrée plus rapide des données et une accessibilité améliorée. Le cadre de langage d'Apple offre des capacités robustes, sur le périphérique, de parole en texte qui respectent la confidentialité des utilisateurs et fournissent une transcription fiable en temps réel.

Comprendre l'architecture du cadre de discours

Le cadre de discours (introduit dans iOS 10) fonctionne à travers trois composantes principales:

  • SFSpeechRecongnizer[ – L'interface primaire qui coordonne la reconnaissance d'une langue et d'une localité spécifiques. Elle peut être configurée pour utiliser une reconnaissance sur un appareil ou sur un serveur.
  • SFSpeechReconnaissanceRequest – Représente l'entrée audio. Deux sous-classes principales: pour les fichiers audio préenregistrés et pour les flux audio en direct.
  • SFSpeechReconnaissanceTask – Gère le processus de reconnaissance, fournissant des mises à jour de progrès et des résultats finaux. Il supporte l'annulation et la pause.

Par défaut, iOS 15+ utilise la reconnaissance sur les appareils pour toutes les langues prises en charge, ce qui réduit la latence et garantit que les données ne quittent jamais l'appareil. La reconnaissance basée sur le serveur est toujours disponible pour les anciens appareils ou les langues spécifiques, mais nécessite une connexion Internet active et le consentement de l'utilisateur.

Caractéristiques et capacités clés

  • Real-time streaming[ – La voix est transcrite comme l'utilisateur parle, avec des résultats partiels périodiques.
  • Transpositions alternatives – Chaque résultat comprend plusieurs interprétations avec notation de confiance par et .
  • Expositions conftextuelles – Les développeurs peuvent fournir des phrases personnalisées via pour améliorer la précision des termes spécifiques au domaine.
  • Langues prises en charge – Plus de 60 langues et accents régionaux. Utilisez pour récupérer la liste actuelle.

Mise en place des autorisations et configuration du projet

Toujours demander l'autorisation explicitement. Sans les autorisations appropriées, le système rejettera les demandes de reconnaissance.

Exigences d'Info.plist

Ajouter la clé (Confidentialité – Description de l'utilisation de la reconnaissance vocale) avec une explication claire et orientée vers l'utilisateur. Exemple :

<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>

Si votre application enregistre également l'audio (commun pour la reconnaissance en direct), ajoutez aussi.

Demande d'autorisation

Appeler au début du cycle de vie de l'application, généralement sur un contrôleur de vue. . Le rappel renvoie l'un des quatre statuts suivants :

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
 }
 }
}

Note : Le cadre peut retourner si le périphérique est géré par un profil de contrôle parental ou si la reconnaissance de la parole est désactivée via l'heure d'écran.

Mise en œuvre de la reconnaissance vocale en direct

Pour la capture vocale en temps réel, vous avez besoin d'un pour streamer les tampons audio dans la demande de reconnaissance. Le code suivant démontre une implémentation prête à la production avec un nettoyage approprié.

Étape 1: Configurer la session 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'option réduit le volume de musique de fond, ce qui améliore la précision de transcription dans les environnements bruyants. Pour les applications vocales seulement, considérez pour faire passer l'audio à travers l'enceinte de l'appareil au lieu de l'oreillette.

Étape 2: Créer le Reconnu et la demande

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)")
 }
}

Étape 3 : Nettoiez avec grâce

func stopRecognition() {
 recognitionTask?.cancel()
 audioEngine.stop()
 audioEngine.inputNode.removeTap(onBus: 0)
 request.endAudio()
 // Optionally deactivate audio session
 try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}

Toujours annuler la tâche de reconnaissance avant d'arrêter le moteur audio. L'oubli de supprimer le robinet sur le noeud d'entrée peut causer des cycles de rétention et empêcher le microphone d'être libéré.

Gestion des locaux multilingues et personnalisés

Le cadre de langage prend en charge la détection dynamique de la localisation. Vous pouvez permettre aux utilisateurs de changer de langue ou même de reconnaître plusieurs langues en une seule session en créant des instances séparées .

let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }

// Use recognizers[0] for English, etc.

Pour la reconnaissance sur les appareils, chaque reconnu consomme de la mémoire proportionnelle à son modèle de langage. Testez les performances sur les appareils plus anciens lorsqu'il prend en charge plusieurs langues.

Vocabulaire personnalisé et termes de domaine

Améliorer l'exactitude des termes propres à l'industrie en utilisant la propriété sur :

request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]

Cela laisse entendre que le reconnu est favorable à ces phrases, réduisant la méconnaissance de termes peu communs.

Gestion des erreurs et stratégies de repli

La reconnaissance vocale peut échouer pour de nombreuses raisons : problèmes de réseau (si vous utilisez un serveur), interruptions audio, pannes de microphone ou pression de mémoire.

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
 }
}

Surveiller les changements d'état de tâche de reconnaissance via la propriété de pour détecter les annulations ou les timeouts.

Optimisation du rendement et pratiques exemplaires

  • Preferer reconnaissance sur les appareils[ – Depuis iOS 15, la reconnaissance sur les appareils est la par défaut et offre une latence inférieure. Évitez de forcer le serveur à moins que vous n'ayez besoin d'une langue non encore supportée hors ligne.
  • Limiter les résultats partiels – La mise en place réduit les frais généraux si vous n'avez besoin que de transcription finale.
  • Manage reconnaissance lifespan[ – Annuler les tâches de longue durée lorsque l'utilisateur cesse de parler. Utilisez un délai (p. ex., 2 secondes de silence) pour terminer automatiquement la session.
  • Batterie et mémoire – Les tâches de moteur et de reconnaissance audio consomment des ressources importantes.
  • Test avec des données simulées – Utiliser des fichiers audio préenregistrés () pendant le développement pour éviter les dépendances du microphone.

Interruptions de manipulation

Les appels téléphoniques, les alarmes ou Siri peuvent interrompre une session de reconnaissance active. Abonnez-vous à pour faire une pause et reprendre gracieusement :

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
 }
}

Considérations relatives à l'accessibilité

La reconnaissance vocale améliore l'accessibilité pour les utilisateurs ayant une déficience motrice ou visuelle.

  • Fournit une rétroaction audio claire lors des démarrages/arrêts d'écoute.
  • Supporte VoiceOver en utilisant des étiquettes d'accessibilité sur les boutons de reconnaissance.
  • Offre une méthode alternative d'entrée par texte en cas de non-reconnaissance.
  • Respecte la vie privée des utilisateurs en ne stockant pas de données audio sans consentement explicite.

Essais et débogage

Les simulateurs ne comprennent pas de microphone; test sur les appareils physiques.Utilisez Xcode="s Vocation Recognition diagnostic log sous et ajoutez avec la valeur pour activer la logage verbeuse. Simuler différents environnements sonores et accents pendant l'AQ.

Cas d'utilisations réelles dans le monde

  • La voix commande dans une application CMS[ – Permet aux éditeurs de dicter le contenu ou de naviguer dans les menus mains libres. Par exemple, -Créer un nouvel article déclenche un workflow spécifique.
  • Dictation pour les applications de prise de notes – transcription en temps réel avec reconnaissance de ponctuation.
  • Navigation axée sur l'accessibilité[ – Les utilisateurs peuvent dire --Retourner ou --Ouvrir les paramètres sans toucher l'écran.
  • Transposition médicale ou légale – Utiliser des chaînes contextuelles pour la terminologie spécifique au domaine et combiner avec la reconnaissance sur les appareils pour la protection de la vie privée.

Conclusion

En comprenant l'architecture, en manipulant les autorisations correctement, en gérant les sessions audio et en optimisant les performances, vous pouvez créer une expérience sans faille contrôlée par la voix qui respecte la vie privée des utilisateurs. Testez toujours sur les appareils réels, envisagez les mécanismes de repli et gardez le contexte utilisateur à l'esprit pour offrir une fonctionnalité qui améliore vraiment la convivialité.

Pour plus de détails, voir Apples Speech framework documentation, le AVAudioSession guide[, et le SFSpeechRecongnizer class reference[. Des pratiques exemplaires supplémentaires en matière d'accessibilité peuvent être trouvées dans le site Web Apple Accessibility.