Spraakherkenning in Windows-apps

Gebruik spraakherkenning om invoer te bieden, acties of opdrachten op te geven en taken uit te voeren in uw Windows App SDK-app.

Important

Voor spraakherkenning is een MSIX-pakketidentiteit vereist. De Windows.Media.SpeechRecognition API's zijn alleen beschikbaar wanneer uw app wordt uitgevoerd met pakketidentiteit (verpakt of verpakt met externe locatie). Uitgepakte apps kunnen deze API's niet gebruiken.

Sleutel-API's

Overview

Spraakherkenning bestaat uit een spraakruntime, herkennings-API's voor het programmeren van de runtime, kant-en-klare grammatica's voor dicteren en zoeken op internet, en een standaardsysteeminterface waarmee gebruikers spraakherkenningsfuncties kunnen detecteren en gebruiken.

Spraakherkenning configureren

Om spraakherkenning te ondersteunen, moet de gebruiker verbinding maken en een microfoon inschakelen op het apparaat en het Microsoft privacybeleid accepteren dat toestemming verleent voor uw app om deze te gebruiken.

Stel de mogelijkheid van het microfoonapparaat in het pakketmanifest van uw app in om de gebruiker om toegangsmachtigingen voor microfoons te vragen. Zie mogelijkheidsdeclaraties voor apps voor meer informatie.

Als de gebruiker toegang verleent, wordt uw app weergegeven in de lijst met goedgekeurde toepassingen bij Privacymicrofoon > instellingen>. Omdat de gebruiker deze instelling op elk gewenst moment kan uitschakelen, controleert u of uw app toegang heeft tot de microfoon voordat u deze probeert te gebruiken.

Als u ook ondersteuning wilt bieden voor dicteren of andere spraakherkenningsservices (zoals een vooraf gedefinieerde grammatica die is gedefinieerd in een onderwerpbeperking), controleert u of Online spraakherkenning (Privacy > speech-instellingen>) is ingeschakeld.

In het volgende voorbeeld ziet u hoe u kunt controleren of er een microfoon aanwezig is en of uw app gemachtigd is om deze te gebruiken.

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

Spraakinvoer herkennen

Een beperking definieert de woorden en woordgroepen (woordenlijst) die een app herkent in spraakinvoer. Beperkingen vormen de kern van spraakherkenning en geven uw app meer controle over de nauwkeurigheid van de herkenning.

U kunt de volgende typen beperkingen gebruiken.

Vooraf gedefinieerde grammatica's

Vooraf gedefinieerde dicteer- en webzoekopdrachten bieden spraakherkenning zonder dat u een grammatica hoeft te schrijven. Wanneer u deze grammatica's gebruikt, voert een externe webservice de herkenning uit en retourneert de resultaten naar het apparaat.

De standaard grammatica van vrije tekst herkent de meeste woorden en woordgroepen die een gebruiker in een bepaalde taal kan zeggen en is geoptimaliseerd voor korte woordgroepen. Als u geen beperkingen opgeeft voor uw SpeechRecognizer, wordt de vooraf gedefinieerde grammatica van dicteren gebruikt.

De grammatica van webzoekopdrachten bevat een groot aantal woorden en woordgroepen, geoptimaliseerd voor termen die mensen doorgaans gebruiken bij het zoeken op internet.

Opmerking

Vooraf gedefinieerde dicteer- en webzoekopdrachten kunnen groot zijn en omdat ze online zijn (niet op het apparaat), zijn de prestaties mogelijk niet zo snel als bij een aangepaste grammatica die lokaal is geïnstalleerd.

Deze vooraf gedefinieerde grammatica's herkennen maximaal 10 seconden spraakinvoer en vereisen geen bewerking. Ze hebben echter een netwerkverbinding nodig.

Zie SpeechRecognitionTopicConstraint.

Programmeerbare lijstbeperkingen

Programmatische lijstbeperkingen bieden een lichtgewicht benadering voor het maken van eenvoudige grammatica's met behulp van een lijst met woorden of woordgroepen. Een lijstbeperking werkt goed voor het herkennen van korte, afzonderlijke zinnen. Als u alle woorden in een grammatica opgeeft, wordt de nauwkeurigheid van de herkenning verbeterd, omdat de spraakherkenningsengine alleen spraak hoeft te verwerken om een overeenkomst te bevestigen. De lijst kan ook programmatisch worden bijgewerkt.

Zie SpeechRecognitionListConstraint.

SRGS-grammatica's

Een SRGS-grammatica (Speech Recognition Grammar Specification) is een statisch document dat gebruikmaakt van de XML-indeling die is gedefinieerd door SRGS versie 1.0. Een SRGS-grammatica geeft u de grootste controle over de spraakherkenningservaring door meerdere semantische betekenissen in één herkenning vast te leggen.

Zie SpeechRecognitionGrammarFileConstraint.

Beperkingen voor spraakopdrachten

Gebruik een VCD-bestand (Voice Command Definition) om de opdrachten te definiëren die de gebruiker kan zeggen om acties te starten bij het activeren van uw app. Zie SpeechRecognitionVoiceCommandDefinitionConstraint.

Zie Aangepaste herkenningsbeperkingen definiëren om aan de slag te gaan met beperkingen.

Voorbeeld van basisherkenning

In het volgende voorbeeld wordt een spraakherkenning gemaakt, worden de standaarddicteerbeperkingen gecompileerd en wordt geluisterd naar spraakinvoer.

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

Opmerking

In dit voorbeeld wordt RecognizeAsync gebruikt (zonder gebruikersinterface). Als u de ingebouwde gebruikersinterface voor herkenning wilt gebruiken, roept u in plaats daarvan RecognizeWithUIAsync aan. Zie SpeechRecognizerUIOptions voor aanpassingsopties.

De herkenningsinterface aanpassen

Wanneer uw app SpeechRecognizer.RecognizeWithUIAsync aanroept, worden in het systeem verschillende schermen op volgorde weergegeven:

  • Voor vooraf gedefinieerde grammatica's (dicteren of zoeken op internet): LuisterenDenkenHoorde u zeggen (of fout).
  • Voor lijst- of SRGS-beperkingen: luisterenZei u (indien niet eenduidig) → Hoorde u zeggen (of fout).

Gebruik de klasse SpeechRecognizerUIOptions (verkregen via SpeechRecognizer.UIOptions) om het luisterscherm aan te passen:

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