Aktivieren des kontinuierlichen Diktierens

Erfahren Sie, wie Sie in Ihrer Windows App SDK-App langformatige, kontinuierliche Diktiereingaben erfassen und erkennen.

Important

Für die Spracherkennung ist MSIX-Paketidentität erforderlich. Die Windows.Media.SpeechRecognition-APIs sind nur verfügbar, wenn Ihre App mit Paketidentität (verpackt oder mit externem Speicherort verpackt) ausgeführt wird. Entpackte Apps können diese APIs nicht verwenden.

Wichtige APIs

Übersicht

Unter Spracherkennung lernen Sie, wie Sie kurze Spracheingaben mithilfe von RecognizeAsync oder RecognizeWithUIAsync erfassen und erkennen. Für längere, kontinuierliche Spracherkennungssitzungen ( z. B. Diktieren oder E-Mails ) verwenden Sie die ContinuousRecognitionSession Eigenschaft eines SpeechRecognizer Objekts, um ein SpeechContinuousRecognitionSession Objekt abzurufen.

Hinweis

Die Sprachunterstützung für Diktat hängt vom Gerät ab, auf dem Ihre App ausgeführt wird. Für PCs und Laptops wird nur en-US für das Diktieren erkannt, während Xbox alle Sprachen erkennen können, die von der Spracherkennung unterstützt werden. Weitere Informationen finden Sie unter Angeben der Sprache für die Spracherkennung.

Einrichten

Ihre App benötigt die folgenden Objekte, um eine fortlaufende Diktiersitzung zu verwalten:

  • Eine Instanz eines SpeechRecognizer Objekts.
  • Ein Verweis auf den UI-Verteiler, um die Benutzeroberfläche während des Diktierens zu aktualisieren.
  • Eine Möglichkeit zum Nachverfolgen der gesammelten Wörter, die vom Benutzer gesprochen werden.

Deklarieren Sie eine SpeechRecognizer Instanz und eine StringBuilder , um Erkennungsergebnisse als Felder ihrer Seitenklasse zu sammeln:

private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;

In WinUI 3 verwenden Sie DispatcherQueue, um UI-Aktualisierungen aus Hintergrundthreads zu dispatchen (nicht CoreDispatcher):

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

Initialize

Während der Initialisierung führen Sie Folgendes aus:

  1. Initialisieren Sie die Spracherkennung.
  2. Kompilieren Sie die integrierte Diktiergrammatik (oder fügen Sie benutzerdefinierte Einschränkungen hinzu).
  3. Richten Sie Ereignislistener für Erkennungsereignisse ein.
// 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();

Erkennungsereignisse behandeln

Ergebnis generiert

Das ResultGenerated Ereignis wird ausgelöst, wenn der Benutzer spricht. Der Erkenner gibt in regelmäßigen Abständen einen Abschnitt der Spracheingabe weiter. Überprüfen Sie die Confidence Eigenschaft, um zu entscheiden, ob das Ergebnis akzeptiert werden soll.

Da dieses Ereignis auf einem Hintergrundthread ausgelöst wird, verwenden Sie DispatcherQueue.TryEnqueue, um die Benutzeroberfläche zu aktualisieren:

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

Abgeschlossen

Das Completed Ereignis gibt an, dass die kontinuierliche Erkennungssitzung beendet wurde. Die Sitzung endet, wenn Sie anrufen StopAsync oder CancelAsync, wenn ein Fehler auftritt oder wenn der Benutzer nicht mehr spricht.

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 erstellt

Verarbeiten Sie das HypothesisGenerated-Ereignis, um Zwischenergebnisse anzuzeigen, während der Erkenner noch verarbeitet. Dadurch wird die Reaktionsfähigkeit verbessert, indem dem Benutzer Feedback gegeben wird, bevor ein endgültiges Ergebnis verfügbar ist:

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 und Beenden der Erkennung

Überprüfen Sie den Erkennungsstatus, bevor Sie eine Sitzung starten oder beenden:

// 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();
}

Wenn Sie ausstehende Ergebnisse sofort abbrechen und verwerfen möchten, rufen Sie CancelAsync anstelle von StopAsync.

Hinweis

Ein ResultGenerated-Ereignis kann aufgrund von Multithreading ausgelöst werden, nachdem Sie CancelAsync aufgerufen haben. Wenn Sie beim Abbrechen der Erkennungssitzung private Felder festlegen, überprüfen Sie immer ihre Werte im ResultGenerated Handler.