Reconnaissance vocale dans Xamarin.iOS

Cet article présente la nouvelle API Speech et montre comment l’implémenter dans une application Xamarin.iOS pour prendre en charge la reconnaissance vocale continue et transcrire la parole (à partir de flux audio en direct ou enregistrés) en texte.

Nouveauté d’iOS 10, Apple a publié l’API Reconnaissance vocale qui permet à une application iOS de prendre en charge la reconnaissance vocale continue et de transcrire la parole (à partir de flux audio en direct ou enregistrés) en texte.

Selon Apple, l’API Reconnaissance vocale présente les fonctionnalités et avantages suivants :

  • Très précis
  • État de l’art
  • Facile à utiliser
  • Rapide
  • Prend en charge plusieurs langues
  • Respecte la confidentialité de l’utilisateur

Fonctionnement de la reconnaissance vocale

La reconnaissance vocale est implémentée dans une application iOS en acquérant de l’audio en direct ou préenregistré (dans l’une des langues parlées prises en charge par l’API) et en le transmettant à un module Reconnaissance vocale qui retourne une transcription en texte brut des mots prononcés.

Fonctionnement de la reconnaissance vocale

Dictée au clavier

Lorsque la plupart des utilisateurs pensent à la reconnaissance vocale sur un appareil iOS, ils pensent à la assistant vocale Siri intégrée, qui a été publiée avec la dictée au clavier dans iOS 5 avec l’iPhone 4S.

La dictée du clavier est prise en charge par tout élément d’interface qui prend en charge TextKit (comme UITextField ou UITextArea) et est activée par l’utilisateur qui clique sur le bouton Dictée (directement à gauche de la barre d’espace) dans le clavier virtuel iOS.

Apple a publié les statistiques de dictée au clavier suivantes (collectées depuis 2011) :

  • La dictée du clavier a été largement utilisée depuis sa sortie dans iOS 5.
  • Environ 65 000 applications l’utilisent par jour.
  • Environ un tiers de toute la dictée iOS est effectuée dans une application tierce.

La dictée au clavier est extrêmement facile à utiliser, car elle ne nécessite aucun effort de la part du développeur, autre que l’utilisation d’un élément d’interface TextKit dans la conception de l’interface utilisateur de l’application. La dictée au clavier présente également l’avantage de ne pas exiger de demandes de privilèges spéciales de la part de l’application avant de pouvoir être utilisée.

Les applications qui utilisent les nouvelles API reconnaissance vocale nécessitent des autorisations spéciales pour être accordées par l’utilisateur, car la reconnaissance vocale nécessite la transmission et le stockage temporaire des données sur les serveurs d’Apple. Pour plus d’informations, consultez notre documentation sur les améliorations de la sécurité et de la confidentialité.

Bien que la dictée au clavier soit facile à implémenter, elle présente plusieurs limitations et inconvénients :

  • Il nécessite l’utilisation d’un champ d’entrée de texte et l’affichage d’un clavier.
  • Il fonctionne uniquement avec l’entrée audio en direct et l’application n’a aucun contrôle sur le processus d’enregistrement audio.
  • Il n’offre aucun contrôle sur la langue utilisée pour interpréter la parole de l’utilisateur.
  • Il n’existe aucun moyen pour l’application de savoir si le bouton Dictée est même disponible pour l’utilisateur.
  • L’application ne peut pas personnaliser le processus d’enregistrement audio.
  • Il fournit un ensemble très superficiel de résultats qui manquent d’informations telles que le calendrier et la confiance.

API reconnaissance vocale

Nouveauté d’iOS 10, Apple a publié l’API Reconnaissance vocale qui offre un moyen plus puissant pour une application iOS d’implémenter la reconnaissance vocale. Cette API est la même qu’Apple utilise pour alimenter Siri et la dictée au clavier, et elle est capable de fournir une transcription rapide avec une précision de pointe.

Les résultats fournis par l’API reconnaissance vocale sont personnalisés de manière transparente pour les utilisateurs individuels, sans que l’application ait à collecter ou à accéder à des données utilisateur privées.

L’API Reconnaissance vocale fournit des résultats à l’application appelante en quasi-temps réel à mesure que l’utilisateur parle et fournit plus d’informations sur les résultats de la traduction que le texte. Il s’agit notamment des paramètres suivants :

  • Interprétations multiples de ce que l’utilisateur a dit.
  • Niveaux de confiance pour les traductions individuelles.
  • Informations de minutage.

Comme indiqué ci-dessus, l’audio pour la traduction peut être fourni soit par un flux en direct, soit à partir d’une source préenregistré et dans l’une des 50 langues et dialectes pris en charge par iOS 10.

L’API Reconnaissance vocale peut être utilisée sur n’importe quel appareil iOS exécutant iOS 10 et, dans la plupart des cas, nécessite une connexion Internet active, car la majeure partie des traductions s’effectue sur les serveurs d’Apple. Cela dit, certains appareils iOS plus récents prennent en charge la traduction toujours activée sur l’appareil de langues spécifiques.

Apple a inclus une API de disponibilité pour déterminer si une langue donnée est disponible pour la traduction au moment actuel. L’application doit utiliser cette API au lieu de tester directement la connectivité Internet.

Comme indiqué ci-dessus dans la section Dictée au clavier, la reconnaissance vocale nécessite la transmission et le stockage temporaire de données sur les serveurs Apple via Internet. Par conséquent, l’application doit demander à l’utilisateur l’autorisation d’effectuer la reconnaissance en incluant la NSSpeechRecognitionUsageDescription clé dans son Info.plist fichier et en appelant la SFSpeechRecognizer.RequestAuthorization méthode .

En fonction de la source audio utilisée pour la reconnaissance vocale, d’autres modifications du fichier de Info.plist l’application peuvent être nécessaires. Pour plus d’informations, consultez notre documentation sur les améliorations de la sécurité et de la confidentialité.

Adoption de la reconnaissance vocale dans une application

Le développeur doit suivre quatre étapes majeures pour adopter la reconnaissance vocale dans une application iOS :

  • Fournissez une description de l’utilisation dans le fichier de Info.plist l’application à l’aide de la NSSpeechRecognitionUsageDescription clé . Par exemple, une application d’appareil photo peut inclure la description suivante : « Cela vous permet de prendre une photo simplement en disant le mot « fromage ».
  • Demandez l’autorisation en appelant la SFSpeechRecognizer.RequestAuthorization méthode pour présenter une explication (fournie dans la NSSpeechRecognitionUsageDescription clé ci-dessus) de la raison pour laquelle l’application souhaite accéder à la reconnaissance vocale à l’utilisateur dans une boîte de dialogue et lui permettre d’accepter ou de refuser.
  • Créez une demande de reconnaissance vocale :
    • Pour l’audio préenregistré sur disque, utilisez la SFSpeechURLRecognitionRequest classe .
    • Pour l’audio en direct (ou l’audio à partir de la mémoire), utilisez la SFSPeechAudioBufferRecognitionRequest classe .
  • Transmettez la demande de reconnaissance vocale à un module de reconnaissance vocale (SFSpeechRecognizer) pour commencer la reconnaissance. L’application peut éventuellement conserver le retourné SFSpeechRecognitionTask pour surveiller et suivre les résultats de la reconnaissance.

Ces étapes sont décrites en détail ci-dessous.

Fournir une description de l’utilisation

Pour fournir la clé requise NSSpeechRecognitionUsageDescription dans le Info.plist fichier, procédez comme suit :

  1. Double-cliquez sur le Info.plist fichier pour l’ouvrir et le modifier.

  2. Basculez vers la vue Source :

    Vue Source

  3. Cliquez sur Ajouter une nouvelle entrée, entrez NSSpeechRecognitionUsageDescription pour la propriété, String pour le type et une description d’utilisation comme valeur. Par exemple :

    Ajout de NSSpeechRecognitionUsageDescription

  4. Si l’application gère la transcription audio en direct, elle nécessite également une description de l’utilisation du microphone. Cliquez sur Ajouter une nouvelle entrée, entrez NSMicrophoneUsageDescription pour la propriété, String pour le type et une description d’utilisation comme valeur. Par exemple :

    Ajout de NSMicrophoneUsageDescription

  5. Enregistrez les modifications du fichier.

Important

Le fait de ne pas fournir l’une des touches ci-dessus Info.plist (NSSpeechRecognitionUsageDescription ou NSMicrophoneUsageDescription) peut entraîner l’échec de l’application sans avertissement lors de la tentative d’accès à la reconnaissance vocale ou au microphone pour l’audio en direct.

Demande d’autorisation

Pour demander l’autorisation utilisateur requise qui permet à l’application d’accéder à la reconnaissance vocale, modifiez la classe main View Controller et ajoutez le code suivant :

using System;
using UIKit;
using Speech;

namespace MonkeyTalk
{
    public partial class ViewController : UIViewController
    {
        protected ViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Request user authorization
            SFSpeechRecognizer.RequestAuthorization ((SFSpeechRecognizerAuthorizationStatus status) => {
                // Take action based on status
                switch (status) {
                case SFSpeechRecognizerAuthorizationStatus.Authorized:
                    // User has approved speech recognition
                    ...
                    break;
                case SFSpeechRecognizerAuthorizationStatus.Denied:
                    // User has declined speech recognition
                    ...
                    break;
                case SFSpeechRecognizerAuthorizationStatus.NotDetermined:
                    // Waiting on approval
                    ...
                    break;
                case SFSpeechRecognizerAuthorizationStatus.Restricted:
                    // The device is not permitted
                    ...
                    break;
                }
            });
        }
    }
}

La RequestAuthorization méthode de la SFSpeechRecognizer classe demande à l’utilisateur l’autorisation d’accéder à la reconnaissance vocale en utilisant la raison fournie par le développeur dans la NSSpeechRecognitionUsageDescription clé du Info.plist fichier.

Un SFSpeechRecognizerAuthorizationStatus résultat est retourné à la routine de rappel de la RequestAuthorization méthode qui peut être utilisée pour effectuer une action en fonction de l’autorisation de l’utilisateur.

Important

Apple suggère d’attendre que l’utilisateur ait démarré une action dans l’application qui nécessite la reconnaissance vocale avant de demander cette autorisation.

Reconnaissance de la parole préenregistré

Si l’application souhaite reconnaître la parole à partir d’un fichier WAV ou MP3 préenregistré, elle peut utiliser le code suivant :

using System;
using UIKit;
using Speech;
using Foundation;
...

public void RecognizeFile (NSUrl url)
{
    // Access new recognizer
    var recognizer = new SFSpeechRecognizer ();

    // Is the default language supported?
    if (recognizer == null) {
        // No, return to caller
        return;
    }

    // Is recognition available?
    if (!recognizer.Available) {
        // No, return to caller
        return;
    }

    // Create recognition task and start recognition
    var request = new SFSpeechUrlRecognitionRequest (url);
    recognizer.GetRecognitionTask (request, (SFSpeechRecognitionResult result, NSError err) => {
        // Was there an error?
        if (err != null) {
            // Handle error
            ...
        } else {
            // Is this the final translation?
            if (result.Final) {
                Console.WriteLine ("You said, \"{0}\".", result.BestTranscription.FormattedString);
            }
        }
    });
}

En examinant ce code en détail, il tente tout d’abord de créer un reconnaissance vocale (SFSpeechRecognizer). Si la langue par défaut n’est pas prise en charge pour la reconnaissance vocale, null est retournée et les fonctions se terminent.

Si speech Recognizer est disponible pour la langue par défaut, l’application vérifie si elle est actuellement disponible pour la reconnaissance à l’aide de la Available propriété . Par exemple, la reconnaissance peut ne pas être disponible si l’appareil n’a pas de connexion Internet active.

Un SFSpeechUrlRecognitionRequest est créé à partir de l’emplacement NSUrl du fichier préenregistré sur l’appareil iOS et il est remis à Speech Recognizer pour le traiter avec une routine de rappel.

Lorsque le rappel est appelé, si le NSError n’est pas null , une erreur doit être gérée. Étant donné que la reconnaissance vocale est effectuée de manière incrémentielle, la routine de rappel peut être appelée plusieurs fois afin que la SFSpeechRecognitionResult.Final propriété soit testée pour voir si la traduction est terminée et si la meilleure version de la traduction est écrite (BestTranscription).

Reconnaissance vocale en direct

Si l’application souhaite reconnaître la parole en direct, le processus est très similaire à la reconnaissance de paroles préenregistrés. Par exemple :

using System;
using UIKit;
using Speech;
using Foundation;
using AVFoundation;
...

#region Private Variables
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
#endregion
...

public void StartRecording ()
{
    // Setup audio session
    var node = AudioEngine.InputNode;
    var recordingFormat = node.GetBusOutputFormat (0);
    node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
        // Append buffer to recognition request
        LiveSpeechRequest.Append (buffer);
    });

    // Start recording
    AudioEngine.Prepare ();
    NSError error;
    AudioEngine.StartAndReturnError (out error);

    // Did recording start?
    if (error != null) {
        // Handle error and return
        ...
        return;
    }

    // Start recognition
    RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
        // Was there an error?
        if (err != null) {
            // Handle error
            ...
        } else {
            // Is this the final translation?
            if (result.Final) {
                Console.WriteLine ("You said \"{0}\".", result.BestTranscription.FormattedString);
            }
        }
    });
}

public void StopRecording ()
{
    AudioEngine.Stop ();
    LiveSpeechRequest.EndAudio ();
}

public void CancelRecording ()
{
    AudioEngine.Stop ();
    RecognitionTask.Cancel ();
}

En examinant ce code en détail, il crée plusieurs variables privées pour gérer le processus de reconnaissance :

private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;

Il utilise AV Foundation pour enregistrer l’audio qui sera passé à un afin de SFSpeechAudioBufferRecognitionRequest gérer la demande de reconnaissance :

var node = AudioEngine.InputNode;
var recordingFormat = node.GetBusOutputFormat (0);
node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
    // Append buffer to recognition request
    LiveSpeechRequest.Append (buffer);
});

L’application tente de démarrer l’enregistrement et toutes les erreurs sont gérées si l’enregistrement ne peut pas être démarré :

AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);

// Did recording start?
if (error != null) {
    // Handle error and return
    ...
    return;
}

La tâche de reconnaissance est démarrée et un handle est conservé pour la tâche de reconnaissance (SFSpeechRecognitionTask) :

RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
    ...
});

Le rappel est utilisé de la même manière que celui utilisé ci-dessus sur la parole préenregistré.

Si l’enregistrement est arrêté par l’utilisateur, le moteur audio et la demande de reconnaissance vocale sont informés :

AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();

Si l’utilisateur annule la reconnaissance, le moteur audio et la tâche de reconnaissance sont informés :

AudioEngine.Stop ();
RecognitionTask.Cancel ();

Il est important d’appeler RecognitionTask.Cancel si l’utilisateur annule la traduction pour libérer de la mémoire et du processeur de l’appareil.

Important

Le fait de ne pas fournir les NSSpeechRecognitionUsageDescription touches ou NSMicrophoneUsageDescriptionInfo.plist peut entraîner l’échec de l’application sans avertissement lors de la tentative d’accès à la reconnaissance vocale ou au microphone pour l’audio en direct (var node = AudioEngine.InputNode;). Pour plus d’informations, consultez la section Fournir une description de l’utilisation ci-dessus.

Limites de la reconnaissance vocale

Apple impose les limitations suivantes lors de l’utilisation de la reconnaissance vocale dans une application iOS :

  • La reconnaissance vocale est gratuite pour toutes les applications, mais son utilisation n’est pas illimitée :
    • Les appareils iOS individuels ont un nombre limité de reconnaissances qui peuvent être effectuées par jour.
    • Les applications seront limitées à l’échelle mondiale sur une base de requête quotidienne.
  • L’application doit être prête à gérer les échecs de connexion réseau et de limite d’utilisation de la reconnaissance vocale.
  • La reconnaissance vocale peut avoir un coût élevé en matière de décharge de batterie et de trafic réseau élevé sur l’appareil iOS de l’utilisateur. Pour cette raison, Apple impose une limite stricte de durée audio d’environ une minute de voix maximale.

Si une application atteint régulièrement ses limites de limitation de débit, Apple demande au développeur de les contacter.

Considérations relatives à la confidentialité et à la convivialité

Apple propose la suggestion suivante pour être transparent et respecter la confidentialité de l’utilisateur lors de l’inclusion de la reconnaissance vocale dans une application iOS :

  • Lors de l’enregistrement de la parole de l’utilisateur, veillez à indiquer clairement que l’enregistrement a lieu dans l’interface utilisateur de l’application. Par exemple, l’application peut lire un son « d’enregistrement » et afficher un indicateur d’enregistrement.
  • N’utilisez pas la reconnaissance vocale pour les informations utilisateur sensibles telles que les mots de passe, les données d’intégrité ou les informations financières.
  • Affichez les résultats de la reconnaissance avant d’agir dessus. Cela fournit non seulement des commentaires sur ce que fait l’application, mais permet également à l’utilisateur de gérer les erreurs de reconnaissance au fur et à mesure qu’elles sont effectuées.

Résumé

Cet article a présenté la nouvelle API Speech et a montré comment l’implémenter dans une application Xamarin.iOS pour prendre en charge la reconnaissance vocale continue et transcrire la parole (à partir de flux audio en direct ou enregistrés) en texte.