Continue dicteren inschakelen

Ontdek hoe u spraakinvoer voor lange, doorlopende dictering kunt vastleggen en herkennen in uw Windows App SDK-app.

Important

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

Sleutel-API's

Overview

In Spraakherkenning leert u hoe u korte spraakinvoer kunt vastleggen en herkennen met behulp van RecognizeAsync of RecognizeWithUIAsync. Gebruik voor langere tijd continue spraakherkenningssessies, zoals dicteren of e-mail, de ContinuousRecognitionSession eigenschap van een SpeechRecognizer om een SpeechContinuousRecognitionSession object te verkrijgen.

Opmerking

De taalondersteuning voor dicteren is afhankelijk van het apparaat waarop uw app wordt uitgevoerd. Voor pc's en laptops wordt alleen en-US herkend voor dicteren, terwijl Xbox alle talen kan herkennen die worden ondersteund door spraakherkenning. Zie De taal voor spraakherkenning opgeven voor meer informatie.

Inrichten

Uw app heeft de volgende objecten nodig om een continue dicteersessie te beheren:

  • Een exemplaar van een SpeechRecognizer object.
  • Een verwijzing naar de ui-dispatcher om de gebruikersinterface bij te werken tijdens het dicteren.
  • Een manier om de opgesomde woorden bij te houden die door de gebruiker worden gesproken.

Declareer een SpeechRecognizer-instantie en een StringBuilder om herkenningsresultaten te verzamelen als velden in uw paginaklasse:

private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;

In WinUI 3 gebruikt u DispatcherQueue om UI-updates vanuit achtergrondthreads door te geven (niet CoreDispatcher):

// Get the DispatcherQueue for the current thread (UI thread).
private Microsoft.UI.Dispatching.DispatcherQueue dispatcherQueue =
    Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();

Initialiseren

Tijdens de initialisatie gaat u het volgende doen:

  1. Initialiseer de spraakherkenning.
  2. Compileer de ingebouwde grammatica van dicteren (of voeg aangepaste beperkingen toe).
  3. Stel gebeurtenislisteners in voor herkenningsgebeurtenissen.
// Initialize the speech recognizer.
speechRecognizer = new SpeechRecognizer();

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

// Subscribe to continuous recognition events.
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
    ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.ContinuousRecognitionSession.Completed +=
    ContinuousRecognitionSession_Completed;
speechRecognizer.HypothesisGenerated +=
    SpeechRecognizer_HypothesisGenerated;

dictatedTextBuilder = new StringBuilder();

Het afhandelen van herkenningsevenementen

ResultaatGegenereerd

De ResultGenerated gebeurtenis wordt geactiveerd terwijl de gebruiker spreekt. De recognizer geeft periodiek een stuk spraakinvoer door. Controleer de Confidence eigenschap om te bepalen of het resultaat moet worden geaccepteerd.

Omdat deze gebeurtenis wordt geactiveerd op een achtergrondthread, gebruikt u DispatcherQueue.TryEnqueue om de gebruikersinterface bij te werken:

private void ContinuousRecognitionSession_ResultGenerated(
    SpeechContinuousRecognitionSession sender,
    SpeechContinuousRecognitionResultGeneratedEventArgs args)
{
    if (args.Result.Confidence == SpeechRecognitionConfidence.Medium ||
        args.Result.Confidence == SpeechRecognitionConfidence.High)
    {
        dictatedTextBuilder.Append(args.Result.Text + " ");

        dispatcherQueue.TryEnqueue(() =>
        {
            dictationTextBox.Text = dictatedTextBuilder.ToString();
            btnClearText.IsEnabled = true;
        });
    }
}

Volbracht

De Completed gebeurtenis geeft aan dat de sessie voor continue herkenning is beëindigd. De sessie wordt beëindigd wanneer u belt StopAsync of CancelAsync, of wanneer er een fout optreedt, of wanneer de gebruiker is gestopt met spreken.

private void ContinuousRecognitionSession_Completed(
    SpeechContinuousRecognitionSession sender,
    SpeechContinuousRecognitionCompletedEventArgs args)
{
    if (args.Status != SpeechRecognitionResultStatus.Success)
    {
        dispatcherQueue.TryEnqueue(() =>
        {
            if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded)
            {
                dictationTextBox.Text = dictatedTextBuilder.ToString();
            }
        });
    }
}

Hypothese gegenereerd

Verwerk de HypothesisGenerated-gebeurtenis om tussentijdse resultaten weer te geven terwijl de herkenner nog bezig is met verwerken. Dit verbetert de reactiesnelheid door de gebruiker feedback te geven voordat er een eindresultaat beschikbaar is:

private void SpeechRecognizer_HypothesisGenerated(
    SpeechRecognizer sender,
    SpeechRecognitionHypothesisGeneratedEventArgs args)
{
    string hypothesis = args.Hypothesis.Text;
    string textboxContent = dictatedTextBuilder.ToString() + " " + hypothesis + " ...";

    dispatcherQueue.TryEnqueue(() =>
    {
        dictationTextBox.Text = textboxContent;
        btnClearText.IsEnabled = true;
    });
}

Starten en stoppen van herkenning

Controleer de status van de recognizer voordat u een sessie start of stopt:

// Start continuous recognition.
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
    await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}

// Stop continuous recognition (lets pending events complete).
if (speechRecognizer.State != SpeechRecognizerState.Idle)
{
    await speechRecognizer.ContinuousRecognitionSession.StopAsync();
}

Roep CancelAsync aan in plaats van StopAsync om onmiddellijk te annuleren en resultaten die nog in behandeling zijn te verwerpen.

Opmerking

Een ResultGenerated-gebeurtenis kan optreden nadat u CancelAsync hebt aangeroepen als gevolg van multithreading. Als u privévelden instelt bij het annuleren van de herkenningssessie, valideert u altijd de waarden in de ResultGenerated handler.