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.
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 laNSSpeechRecognitionUsageDescription
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 laNSSpeechRecognitionUsageDescription
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 .
- Pour l’audio préenregistré sur disque, utilisez la
- 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 :
Double-cliquez sur le
Info.plist
fichier pour l’ouvrir et le modifier.Basculez vers la vue Source :
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 :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 :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 NSMicrophoneUsageDescription
Info.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.