Utilisation de l'API de reconnaissance vocale sous iOS 10

Ce que vous allez créer

introduction

Siri est une fonctionnalité essentielle d’iOS depuis son introduction en 2011. Désormais, iOS 10 offre de nouvelles fonctionnalités permettant aux développeurs d’interagir avec Siri. En particulier, deux nouveaux cadres sont maintenant disponibles: Speech et SiriKit.. 

Aujourd'hui, nous allons examiner le cadre Speech, qui nous permet de traduire facilement l'audio en texte. Vous apprendrez à créer une application réelle qui utilise l'API de reconnaissance vocale pour vérifier l'état d'un vol..

Si vous souhaitez en savoir plus sur SiriKit, je l’ai couvert dans mon tutoriel Créer des extensions SiriKit dans iOS 10. Pour plus d'informations sur les autres nouvelles fonctionnalités pour les développeurs dans iOS 10, consultez le cours de Markus Mühlberger, ici sur Envato Tuts+.

Usage

La reconnaissance vocale est le processus de traduction d'un son en direct ou préenregistré en texte transcrit. Depuis l'introduction de Siri dans iOS 5, le clavier du système comporte un bouton permettant aux utilisateurs de dicter facilement. Cette fonctionnalité peut être utilisée avec n'importe quelle entrée de texte UIKit et ne nécessite pas d'écrire un code supplémentaire à celui que vous auriez écrit pour prendre en charge une entrée de texte standard. C'est vraiment rapide et facile à utiliser, mais il y a quelques limitations:

  • Le clavier est toujours présent lors de la dictée.
  • La langue ne peut pas être personnalisée par l'application elle-même.
  • L'application ne peut pas être notifiée lorsque la dictée commence et se termine.

Pour permettre aux développeurs de créer des applications plus personnalisables et plus puissantes avec la même technologie de dictée que Siri, Apple a créé le framework Speech. Il permet à chaque appareil exécutant iOS 10 de traduire l'audio en texte dans plus de 50 langues et dialectes..

Cette nouvelle API est beaucoup plus puissante car elle ne fournit pas simplement un simple service de transcription, elle fournit également des interprétations alternatives de ce que l'utilisateur peut avoir dit. Vous pouvez contrôler le moment d'arrêter une dictée, afficher les résultats lorsque votre utilisateur parle et le moteur de reconnaissance vocale s'adapte automatiquement aux préférences de l'utilisateur (langue, vocabulaire, noms, etc.).. 

Une fonctionnalité intéressante est la prise en charge de la transcription de l’audio préenregistré. Si vous créez une application de messagerie instantanée, par exemple, vous pouvez utiliser cette fonctionnalité pour transcrire le texte de nouveaux messages audio..

Installer

Tout d'abord, vous devrez demander à l'utilisateur l'autorisation de transmettre sa voix à Apple pour analyse.. 

Selon l'appareil et la langue à reconnaître, iOS peut décider de manière transparente de transcrire l'audio sur l'appareil même ou, si la reconnaissance vocale locale n'est pas disponible sur l'appareil, iOS utilisera les serveurs d'Apple pour effectuer le travail.. 

C'est pourquoi une connexion Internet active est généralement requise pour la reconnaissance vocale. Je vais vous montrer comment vérifier très vite la disponibilité du service..

Il existe trois étapes pour utiliser la reconnaissance vocale:

  • Expliquez: dites à votre utilisateur pourquoi vous voulez accéder à sa voix.
  • Autoriser: demander explicitement l'autorisation d'accéder à leur voix.
  • Requête: chargez un audio préenregistré à partir du disque en utilisant SFSpeechURLRecognitionRequest, ou diffuser de l'audio en direct en utilisant SFSpeechAudioBufferRecognitionRequest et traiter la transcription.

Si vous voulez en savoir plus sur le framework Speech, regardez WWDC 2016 Session 509. Vous pouvez également lire la documentation officielle.

Exemple

Je vais maintenant vous montrer comment créer une application réelle qui tire parti de l'API de reconnaissance vocale. Nous allons créer une petite application de suivi des vols dans laquelle l'utilisateur peut simplement indiquer un numéro de vol. L'application affichera l'état actuel du vol. Oui, nous allons construire un petit assistant comme Siri pour vérifier l'état de tout vol!

Dans le référentiel GitHub du tutoriel, j'ai fourni un projet squelette qui contient une interface utilisateur de base qui nous aidera pour ce tutoriel. Téléchargez et ouvrez le projet dans Xcode 8.2 ou supérieur. Partir d'une interface existante nous permettra de nous concentrer sur l'API de reconnaissance vocale.

Jetez un coup d'œil aux cours du projet. UIViewController + Style.swift contient la majeure partie du code responsable de la mise à jour de l'interface utilisateur. L’exemple de source de données des vols affichés dans le tableau est déclaré en FlightsDataSource.swift.

Si vous exécutez le projet, il devrait ressembler à ceci.

Après que l'utilisateur ait appuyé sur le bouton du microphone, nous souhaitons lancer la reconnaissance vocale pour transcrire le numéro de vol. Donc, si l'utilisateur dit "LX40", nous aimerions afficher les informations concernant la porte et l'état actuel du vol. Pour ce faire, nous appellerons une fonction permettant de rechercher automatiquement le vol dans une source de données et d'afficher l'état du vol.. 

Nous allons d’abord explorer comment transcrire à partir d’audio préenregistré. Nous apprendrons plus tard comment mettre en œuvre la reconnaissance de la parole en direct, plus intéressante.

Commençons par mettre en place le projet. Ouvrez le Info.plist fichier et ajoutez une nouvelle ligne avec l'explication qui sera montrée à l'utilisateur lorsqu'il lui sera demandé la permission d'accéder à sa voix. La nouvelle ligne ajoutée est surlignée en bleu dans l'image suivante..

Une fois que cela est fait, ouvrez ViewController.swift. Ne faites pas attention au code qui est déjà dans cette classe; c'est seulement prendre soin de mettre à jour l'interface utilisateur pour nous.

La première étape avec tout nouveau framework que vous souhaitez utiliser est de l'importer en haut du fichier..

importer le discours

Pour afficher la boîte de dialogue d’autorisation à l’utilisateur, ajoutez ce code dans viewDidLoad (animé :) méthode:

commutateur SFSpeechRecognizer.authorizationStatus () case .notDéterminé: askSpeechPermission () case .authorized: self.status = .ready case .denied, .restricted: self.status = .unavailable

le statut La variable prend soin de changer l'interface utilisateur pour avertir l'utilisateur que la reconnaissance vocale n'est pas disponible en cas de problème. Nous allons attribuer un nouveau statut à la même variable chaque fois que nous souhaitons modifier l'interface utilisateur..

Si l'application n'a pas encore demandé l'autorisation de l'utilisateur, le statut de l'autorisation sera non déterminé, et nous appelons le askSpeechPermission méthode pour le demander comme défini à l'étape suivante.

Vous devriez toujours échouer normalement si une fonctionnalité spécifique n'est pas disponible. C'est aussi très important de toujours communiquer à l'utilisateur lorsque vous enregistrez sa voix. N'essayez jamais de reconnaître leur voix sans mettre à jour l'interface utilisateur et en informer l'utilisateur.

Voici l'implémentation de la fonction pour demander la permission à l'utilisateur.

func askSpeechPermission () SFSpeechRecognizer.requestAuthorization statut dans OperationQueue.main.addOperation statut du commutateur case .authorized: self.status = .ready défaut: self.status = .unavailable

Nous invoquons le demandeAutorisation méthode pour afficher la demande de confidentialité de reconnaissance vocale que nous avons ajoutée à la Info.plist. Nous passons ensuite au thread principal au cas où la fermeture aurait été invoquée sur un autre thread. Nous souhaitons mettre à jour l'interface utilisateur uniquement à partir du thread principal. Nous assignons le nouveau statut mettre à jour le bouton du microphone pour signaler à l'utilisateur la disponibilité (ou non) de la reconnaissance vocale.

Reconnaissance audio préenregistrée

Avant d'écrire le code pour reconnaître le son préenregistré, nous devons trouver l'URL du fichier audio. Dans le navigateur de projet, vérifiez que vous avez un fichier nommé LX40.m4a. J'ai enregistré ce fichier moi-même avec l'application Mémos vocaux sur mon iPhone en disant "LX40". Nous pouvons facilement vérifier si nous obtenons une transcription correcte de l'audio.

Stocker l'URL du fichier audio dans une propriété:

var preRecordedAudioURL: URL = return Bundle.main.url (pour la ressource: "LX40", avec l'extension: "m4a")!  ()

Il est temps de voir enfin la puissance et la simplicité du framework Speech. C'est le code qui fait toute la reconnaissance vocale pour nous:

func reconnaîtreFichier (URL: URL) garde laisser reconnaisseur = SFSpeechRecognizer (), reconnaisseur.isAvailable autre retour laisser demande = SFSpeechURLRecognitionRequest (url: reconnaisseur.recognitionTask (avec: demande) résultat, erreur dans la garde laisser reconnaissant = SFSpeechRecognizer (), Recognizer.isAvailable autre return self.status = .unavailable si let result = result self.flightTextView.text = result.bestTranscription.formattedString si result.isFinal self.searchFlight (number: result.bestTranscription.formattedString)  sinon si let error = error print (error)

Voici ce que fait cette méthode:

  • Initialiser un SFSpeechRecognizer exemple et vérifiez que la reconnaissance vocale est disponible avec une déclaration de garde. S'il n'est pas disponible, nous définissons simplement le statut sur indisponible et revenir. (L’initialiseur par défaut utilise les paramètres régionaux de l’utilisateur, mais vous pouvez également utiliser SFSpeechRecognizer (locale :) initialiseur pour fournir des paramètres régionaux différents.)
  • Si la reconnaissance vocale est disponible, créez un SFSpeechURLRecognitionRequest exemple en passant l'URL audio préenregistrée.
  • Lancer la reconnaissance vocale en invoquant le reconnaissanceTâche (avec :) méthode avec la demande précédemment créée.

La fermeture sera appelée plusieurs fois avec deux paramètres: un résultat et un objet d'erreur. 

le reconnaisseur est en train de lire le fichier et d’essayer de reconnaître le texte progressivement. Pour cette raison, la fermeture est appelée plusieurs fois. Chaque fois qu'il reconnaît une lettre ou un mot ou apporte des corrections, la fermeture est invoquée avec des objets à jour.. 

le résultat objet a la isFinal propriété définie sur true lorsque le fichier audio a été complètement analysé. Dans ce cas, nous commençons une recherche dans notre source de données de vol pour voir si nous pouvons trouver un vol avec le numéro de vol reconnu. le searchFlight la fonction se chargera d'afficher le résultat.

La dernière chose qui nous manque, c'est d'invoquer le reconnaîtreFichier (URL :) fonction lorsque le bouton du microphone est enfoncé:

@IBAction func microphonePressed (_ expéditeur: N'importe lequel) RecognFile (url: preRecordedAudioURL)

Exécutez l'application sur votre appareil sous iOS 10, appuyez sur le bouton du microphone et vous verrez le résultat. Le fichier audio "LX40" est reconnu progressivement et l'état du vol est affiché.!

 

Conseil: Le numéro de vol est affiché dans une UITextView. Comme vous l'avez peut-être remarqué, si vous activez le détecteur de données de numéro de vol dans UITextView, vous pouvez appuyer dessus et le statut actuel du vol s'affichera.!

L'exemple de code complet jusqu'à présent peut être visualisé dans la branche audio pré-enregistré de GitHub..

Reconnaissance audio en direct

Voyons maintenant comment implémenter la reconnaissance vocale en direct. Ce sera un peu plus compliqué que ce que nous venons de faire. Vous pouvez à nouveau télécharger le même projet squelette et suivre.

Nous avons besoin d’une nouvelle clé dans le Info.plist fichier pour expliquer à l'utilisateur pourquoi nous avons besoin d'accéder au microphone. Ajouter une nouvelle ligne à votre Info.plist comme indiqué dans l'image.

Nous n'avons pas besoin de demander manuellement la permission à l'utilisateur, car iOS le fera pour nous dès que nous aurons accès à une API liée à un microphone..

Nous pouvons réutiliser le même code que celui utilisé dans la section précédente (n'oubliez pas de importer le discours) de demander l'autorisation. le viewDidLoad (animé :) La méthode est implémentée exactement comme avant:

commutateur SFSpeechRecognizer.authorizationStatus () case .notDéterminé: askSpeechPermission () case .authorized: self.status = .ready case .denied, .restricted: self.status = .unavailable

En outre, la méthode pour demander à l'utilisateur l'autorisation est la même..

func askSpeechPermission () SFSpeechRecognizer.requestAuthorization statut dans OperationQueue.main.addOperation statut du commutateur case .authorized: self.status = .ready défaut: self.status = .unavailable

L'implémentation de commencer l'enregistrement va être un peu différent. Ajoutons d’abord quelques nouvelles variables d’instance qui vous seront utiles lors de la gestion de la session audio et de la tâche de reconnaissance vocale..

let audioEngine = AVAudioEngine () let speechRecognizer: SFSpeechRecognizer? = SFSpeechRecognizer () laisser demande = SFSpeechAudioBufferRecognitionRequest () var RecognTask: SFSpeechRecognitionTask?

Examinons chaque variable séparément:

  • AVAudioEngine est utilisé pour traiter un flux audio. Nous allons créer un nœud audio et le relier à ce moteur afin que nous puissions être mis à jour lorsque le microphone reçoit des signaux audio..
  • SFSpeechRecognizer est la même classe que nous avons vu dans la partie précédente du tutoriel, et il s’occupe de reconnaître le discours. Etant donné que l'initialiseur peut échouer et renvoyer nil, nous le déclarons facultatif pour éviter les plantages au moment de l'exécution.
  • SFSpeechAudioBufferRecognitionRequest est un tampon utilisé pour reconnaître le discours en direct. Etant donné que nous n'avons pas le fichier audio complet comme auparavant, nous avons besoin d'un tampon pour allouer la parole pendant que l'utilisateur parle.
  • SFSpeechRecognitionTask gère la tâche de reconnaissance vocale en cours et peut être utilisé pour l'arrêter ou l'annuler.

Une fois que nous avons déclaré toutes les variables requises, implémentons commencer l'enregistrement.

func startRecording () // Configurez le moteur audio et le garde de reconnaissance vocale laissez node = audioEngine.inputNode else return laissez enregistrementFormat = noeud.outputFormat (forBus: 0) noeud.installTap (onBus: 0, bufferSize: 1024, format: recordingFormat ) tampon, _ dans self.request.append (tampon) // Préparer et commencer à enregistrer audioEngine.prepare () do essayer audioEngine.start () self.status = .recognizing catch return print (error) / / Analyser la reconnaissance vocale vocale = speechRecognizer? .RecognitionTask (avec: request, resultHandler: result, error in if let result = result self.flightTextView.text = result.bestTranscription.formattedString self.searchFlight (number: result.bestTranscription.formattedString ) sinon si let error = erreur print (error))

C'est le code de base de notre fonctionnalité. Je vais l'expliquer étape par étape:

  • Nous obtenons d'abord le inputNode du audioEngine. Un appareil peut éventuellement avoir plusieurs entrées audio, et ici nous sélectionnons la première.
  • Nous disons au noeud d'entrée que nous voulons surveiller le flux audio. Le bloc que nous fournissons sera appelé à chaque flux audio reçu de 1024 octets. Nous ajoutons immédiatement le tampon audio à la demande afin qu'il puisse démarrer le processus de reconnaissance.
  • Nous préparons le moteur audio pour commencer l'enregistrement. Si l'enregistrement commence avec succès, définissez le statut sur .reconnaissant afin que nous mettions à jour l'icône du bouton pour informer l'utilisateur que sa voix est en cours d'enregistrement.
  • Attribuons l'objet renvoyé de speechRecognizer.recognitionTask (avec: resultHandler :) au tâche de reconnaissance variable. Si la reconnaissance réussit, nous recherchons le vol dans notre source de données et mettons à jour l'interface utilisateur.. 

La fonction pour annuler l’enregistrement est aussi simple que d’arrêter le moteur audio, de retirer le tap du noeud d’entrée et d’annuler la tâche de reconnaissance..

func cancelRecording () audioEngine.stop () si let node = audioEngine.inputNode node.removeTap (onBus: 0) RecognTask? .cancel ()

Il ne nous reste plus qu'à démarrer et arrêter l'enregistrement. Modifier le microphonePressé méthode comme suit:

@IBAction func microphoneAppliqué () état du commutateur cas .ready: startRecording () status =. Cas reconnaissant. Reconnaissant: cancelRecording () statut = .ready par défaut: break

En fonction du courant statut, nous commençons ou arrêtons la reconnaissance vocale.

Générez et exécutez l'application pour voir le résultat. Essayez d’épeler l’un des numéros de vol indiqués et vous devriez voir son statut apparaître.

 

Une fois encore, l'exemple de code peut être visualisé dans la branche audio en direct sur GitHub..

Les meilleures pratiques

La reconnaissance vocale est une API très puissante fournie par Apple aux développeurs iOS qui ciblent iOS 10. Elle est totalement gratuite, mais gardez à l’esprit que son utilisation n’est pas illimitée. Elle est limitée à environ une minute pour chaque tâche de reconnaissance vocale et votre application peut également être limitée par les serveurs d'Apple si elle nécessite trop de calcul. Pour ces raisons, cela a un impact important sur le trafic réseau et la consommation d'énergie. 

Assurez-vous que les utilisateurs sont bien informés sur l'utilisation de la reconnaissance vocale et soyez aussi transparent que possible lorsque vous enregistrez leur voix.. 

résumer

Dans ce didacticiel, vous avez appris à utiliser la reconnaissance vocale rapide, précise et flexible dans iOS 10. Utilisez-la à votre avantage pour offrir à vos utilisateurs un nouveau moyen d'interagir avec votre application tout en améliorant son accessibilité.. 

Si vous souhaitez en savoir plus sur l'intégration de Siri dans votre application ou sur certaines autres fonctionnalités intéressantes pour les développeurs pour iOS 10, consultez le cours de Markus Mühlberger..

Découvrez également certains de nos autres tutoriels gratuits sur iOS 10..