Reconnaissance vocale dans les applications Windows

Utilisez la reconnaissance vocale pour fournir des entrées, spécifier des actions ou des commandes et accomplir des tâches dans votre application SDK d'application Windows.

Important

La reconnaissance vocale nécessite l’identité du package MSIX. Les Windows.Media.SpeechRecognition API sont disponibles uniquement lorsque votre application s’exécute avec une identité de package (empaquetée ou empaquetée avec un emplacement externe). Les applications non empaquetées ne peuvent pas utiliser ces API.

API clés

Aperçu

La reconnaissance vocale se compose d’un runtime de reconnaissance vocale, d’API de reconnaissance pour la programmation du runtime, de grammaires prêtes à l’emploi pour la dictée et la recherche web et d’une interface utilisateur système par défaut qui permet aux utilisateurs de découvrir et d’utiliser des fonctionnalités de reconnaissance vocale.

Configurer la reconnaissance vocale

Pour prendre en charge la reconnaissance vocale, l’utilisateur doit se connecter et activer un microphone sur son appareil et accepter la Microsoft politique de confidentialité lui accordant l’autorisation d’utiliser votre application.

Définissez la capacité de périphérique Microphone dans le manifeste du package de votre application pour demander à l’utilisateur l’autorisation d’accéder au microphone. Pour plus d’informations, consultez les déclarations de fonctionnalités d’application.

Si l’utilisateur autorise l’accès, votre application apparaît dans la liste des applications autorisées dans Paramètres > Confidentialité > Microphone. Étant donné que l’utilisateur peut désactiver ce paramètre à tout moment, vérifiez que votre application dispose d’un accès au microphone avant de tenter de l’utiliser.

Si vous souhaitez également prendre en charge la dictée ou d’autres services de reconnaissance vocale (par exemple, une grammaire prédéfinie définie dans une contrainte de rubrique), vérifiez que la reconnaissance vocale en ligne (Settings > Privacy > Speech) est activée.

L’exemple suivant montre comment vérifier si un microphone est présent et si votre application est autorisée à l’utiliser.

public class AudioCapturePermissions
{
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Checks whether the microphone is available and the app has permission to use it.
    /// Perform this check every time the app gets focus, because the user can change
    /// the setting while the app is suspended or not in focus.
    /// </summary>
    /// <returns>True if the microphone is available.</returns>
    public static async Task<bool> RequestMicrophonePermission()
    {
        try
        {
            var settings = new MediaCaptureInitializationSettings
            {
                StreamingCaptureMode = StreamingCaptureMode.Audio,
                MediaCategory = MediaCategory.Speech
            };
            var capture = new MediaCapture();
            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Media player components are not available.
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Permission to use the audio capture device is denied.
            return false;
        }
        catch (Exception exception)
        {
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                // No audio capture devices are present on this system.
                return false;
            }
            throw;
        }
        return true;
    }
}

Reconnaître l’entrée vocale

Une contrainte définit les mots et expressions (vocabulaire) qu’une application reconnaît dans l’entrée vocale. Les contraintes sont au cœur de la reconnaissance vocale et donnent à votre application un meilleur contrôle sur la précision de la reconnaissance.

Vous pouvez utiliser les types de contraintes suivants.

Grammaires prédéfinies

Les grammaires de dictée et de recherche web prédéfinies fournissent une reconnaissance vocale sans vous obliger à créer une grammaire. Lorsque vous utilisez ces grammaires, un service web distant effectue la reconnaissance et retourne les résultats à l’appareil.

La grammaire de dictée de texte libre par défaut reconnaît la plupart des mots et expressions qu’un utilisateur peut dire dans une langue particulière et est optimisé pour les phrases courtes. Si vous ne spécifiez aucune contrainte pour votre SpeechRecognizer, la grammaire de dictée prédéfinie est utilisée.

La grammaire de recherche web contient un grand nombre de mots et d’expressions, optimisés pour les termes que les utilisateurs utilisent généralement lors de la recherche sur le web.

Note

Les grammaires de dictée et de recherche web prédéfinies peuvent être volumineuses et, étant donné qu’elles sont en ligne (pas sur l’appareil), les performances peuvent ne pas être aussi rapides qu’avec une grammaire personnalisée installée localement.

Ces grammaires prédéfinies reconnaissent jusqu’à 10 secondes d’entrée vocale et ne nécessitent aucun effort de création. Toutefois, ils nécessitent une connexion réseau.

Consultez SpeechRecognitionTopicConstraint.

Contraintes de liste programmatique

Les contraintes de liste programmatique offrent une approche légère de la création de grammaires simples à l’aide d’une liste de mots ou d’expressions. Une contrainte de liste fonctionne bien pour reconnaître des expressions courtes et distinctes. La spécification de tous les mots d’une grammaire améliore la précision de la reconnaissance, car le moteur de reconnaissance vocale doit uniquement traiter la voix pour confirmer une correspondance. La liste peut également être mise à jour par programmation.

Consultez SpeechRecognitionListConstraint.

Grammaires SRGS

Une grammaire SRGS (Speech Recognition Grammar Specification) est un document statique qui utilise le format XML défini par la version 1.0 de SRGS. Une grammaire SRGS vous donne le meilleur contrôle sur l’expérience de reconnaissance vocale en vous permettant de capturer plusieurs significations sémantiques dans une seule reconnaissance.

Consultez SpeechRecognitionGrammarFileConstraint.

Contraintes de commande vocale

Utilisez un fichier XML VCD (Voice Command Definition) pour définir les commandes que l’utilisateur peut dire pour lancer des actions lors de l’activation de votre application. Consultez SpeechRecognitionVoiceCommandDefinitionConstraint.

Pour commencer à utiliser des contraintes, consultez Définir des contraintes de reconnaissance personnalisée.

Exemple de reconnaissance de base

L’exemple suivant crée un module de reconnaissance vocale, compile les contraintes de dictée par défaut et commence à écouter l’entrée vocale.

private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the default dictation grammar.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeAsync();

    // Display the recognized text.
    if (result.Status == Windows.Media.SpeechRecognition.SpeechRecognitionResultStatus.Success)
    {
        resultTextBlock.Text = result.Text;
    }
}

Note

Cet exemple utilise RecognizeAsync (sans interface utilisateur). Si vous souhaitez utiliser l’interface utilisateur de reconnaissance intégrée, appelez RecognizeWithUIAsync à la place. Consultez SpeechRecognizerUIOptions pour connaître les options de personnalisation.

Personnaliser l’interface utilisateur de reconnaissance

Lorsque votre application appelle SpeechRecognizer.RecognizeWithUIAsync, le système affiche plusieurs écrans en séquence :

  • Pour les grammaires prédéfinies (dictée ou recherche web) : ÉcouteRéflexionJe vous ai entendu dire (ou erreur).
  • Pour les contraintes de liste ou SRGS : ÉcouteAvez-vous dit (si ambigu) → J’ai entendu (ou erreur).

Utilisez la classe SpeechRecognizerUIOptions (obtenue via SpeechRecognizer.UIOptions) pour personnaliser l’écran d’écoute :

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    speechRecognizer.RecognitionQualityDegrading += SpeechRecognizer_RecognitionQualityDegrading;

    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(
        Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");

    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    await speechRecognizer.CompileConstraintsAsync();

    Windows.Media.SpeechRecognition.SpeechRecognitionResult result =
        await speechRecognizer.RecognizeWithUIAsync();

    resultTextBlock.Text = result.Text;
}