Włączanie ciągłego dyktowania

Dowiedz się, jak przechwytywać i rozpoznawać długie, ciągłe wejście mowy w trybie dyktowania w aplikacji korzystającej z Zestaw SDK do aplikacji systemu Windows.

Ważna

Rozpoznawanie mowy wymaga tożsamości pakietu MSIX. Interfejsy API Windows.Media.SpeechRecognition są dostępne tylko wtedy, gdy aplikacja działa z identyfikatorem pakietu (spakietowana lub spakietowana z lokalizacją zewnętrzną). Aplikacje rozpakowane nie mogą używać tych interfejsów API.

Kluczowe interfejsy API

Przegląd

W funkcji rozpoznawania mowy dowiesz się, jak przechwytywać i rozpoznawać krótkie dane wejściowe mowy przy użyciu funkcji RecognizeAsync lub RecognizeWithUIAsync. W przypadku dłuższych, ciągłych sesji rozpoznawania mowy — takich jak dyktowanie lub obsługa poczty e-mail — użyj właściwości ContinuousRecognitionSession obiektu SpeechRecognizer, aby uzyskać obiekt SpeechContinuousRecognitionSession.

Uwaga / Notatka

Obsługa języka dyktowania zależy od urządzenia, na którym jest uruchomiona aplikacja. Na komputerach PC i laptopach do dyktowania rozpoznawany jest tylko język en-US, natomiast konsola Xbox może rozpoznawać wszystkie języki obsługiwane przez funkcję rozpoznawania mowy. Aby uzyskać więcej informacji, zobacz Określanie języka rozpoznawania mowy.

Ustawienia

Aplikacja potrzebuje następujących obiektów do zarządzania sesją ciągłego dyktowania:

  • Instancja obiektu SpeechRecognizer.
  • Referencja do dispatchera interfejsu użytkownika do aktualizowania interfejsu użytkownika podczas dyktowania.
  • Sposób śledzenia skumulowanych słów wypowiadanych przez użytkownika.

Zadeklaruj instancję SpeechRecognizer oraz obiekt StringBuilder do gromadzenia wyników rozpoznawania jako pola klasy strony:

private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;

W WinUI 3 używa się elementu DispatcherQueue do przekazywania aktualizacji interfejsu użytkownika z wątków w tle (nie CoreDispatcher):

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

Inicjalizacja

Podczas inicjowania wykonasz:

  1. Zainicjuj rozpoznawanie mowy.
  2. Skompiluj wbudowaną gramatykę dyktowania (lub dodaj ograniczenia niestandardowe).
  3. Konfigurowanie odbiorników zdarzeń na potrzeby zdarzeń rozpoznawania.
// 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();

Obsługa zdarzeń rozpoznawania

Wygenerowano wynik

Zdarzenie ResultGenerated jest uruchamiane, gdy użytkownik mówi. Moduł rozpoznawania okresowo przesyła fragment wejściowego sygnału mowy. Sprawdź właściwość, Confidence aby zdecydować, czy chcesz zaakceptować wynik.

Ponieważ to zdarzenie jest wywoływane w tle, użyj DispatcherQueue.TryEnqueue, aby zaktualizować interfejs użytkownika:

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

Zakończono

Zdarzenie Completed wskazuje, że sesja ciągłego rozpoznawania została zakończona. Sesja kończy się po wywołaniu metody StopAsync lub CancelAsync, gdy wystąpi błąd lub gdy użytkownik przestanie mówić.

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

HipotezaGenerowana

Obsłuż zdarzenie HypothesisGenerated, aby wyświetlać wyniki częściowe, gdy moduł rozpoznawania nadal przetwarza dane. Poprawia to czas reakcji, przekazując opinię użytkownika przed udostępnieniem końcowego wyniku:

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

Uruchamianie i zatrzymywanie rozpoznawania

Przed rozpoczęciem lub zatrzymaniem sesji sprawdź stan rozpoznawania:

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

Aby natychmiast anulować i odrzucić oczekujące wyniki, wywołaj CancelAsync zamiast StopAsync.

Uwaga / Notatka

Zdarzenie ResultGenerated może zostać wywołane po wywołaniu CancelAsync ze względu na wielowątkowość. Jeśli podczas anulowania sesji rozpoznawania ustawiasz pola prywatne, zawsze zweryfikuj ich wartości w programie obsługi ResultGenerated.