Povolení průběžného diktování

Naučte se, jak ve vaší aplikaci Windows App SDK zachytávat a rozpoznávat dlouhý souvislý diktovaný řečový vstup.

Important

Rozpoznávání řeči vyžaduje identitu balíčku MSIX. Rozhraní API Windows.Media.SpeechRecognition jsou dostupná pouze když vaše aplikace běží s identitou balíčku (v balíčku nebo v balíčku s externím umístěním). Nevybalené aplikace nemůžou tato rozhraní API používat.

Klíčová rozhraní API

Přehled

V rozpoznávání řeči se naučíte zachytit a rozpoznat krátký vstup řeči pomocí RecognizeAsync nebo RecognizeWithUIAsync. Pro delší nepřetržité relace rozpoznávání řeči, jako je diktování nebo e-mail, použijte vlastnost ContinuousRecognitionSession objektu SpeechRecognizer k získání objektu SpeechContinuousRecognitionSession.

Poznámka:

Podpora jazyka diktování závisí na zařízení, na kterém je vaše aplikace spuštěná. U počítačů a přenosných počítačů se pro diktování rozpoznává jenom en-US, zatímco Xbox dokáže rozpoznat všechny jazyky podporované rozpoznáváním řeči. Další informace najdete v tématu Určení jazyka rozpoznávání řeči.

Nastavení

Ke správě relace nepřetržitého diktování potřebuje vaše aplikace následující objekty:

  • Instance objektu SpeechRecognizer .
  • Odkaz na dispečer uživatelského rozhraní, který během diktování aktualizuje uživatelské rozhraní.
  • Způsob, jak sledovat kumulovaná slova mluvená uživatelem

Deklarujte instanci SpeechRecognizer a prvek StringBuilder pro shromažďování výsledků rozpoznávání jako pole vaší třídy stránky:

private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;

Ve WinUI 3 použijete DispatcherQueue k odesílání aktualizací uživatelského rozhraní z vláken na pozadí (ne CoreDispatcher):

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

Inicializovat

Během inicializace:

  1. Inicializace rozpoznávání řeči
  2. Zkompilujte předdefinované gramatiky diktování (nebo přidejte vlastní omezení).
  3. Nastavte naslouchací procesy událostí pro události rozpoznávání.
// 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();

Řešení událostí rozpoznávání

Výsledek vygenerován

Událost ResultGenerated je vyvolána, když uživatel mluví. Rozpoznávač pravidelně předává část řečového vstupu. Confidence Zkontrolujte vlastnost a rozhodněte se, jestli se má výsledek přijmout.

Vzhledem k tomu, že se tato událost aktivuje ve vlákně na pozadí, použijte DispatcherQueue.TryEnqueue k aktualizaci uživatelského rozhraní:

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

Dokončeno

Událost Completed označuje, že relace průběžného rozpoznávání skončila. Relace skončí, když zavoláte StopAsync nebo CancelAsyncnebo dojde k chybě nebo když uživatel přestal mluvit.

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

Vygenerovaná hypotéza

Zpracujte událost HypothesisGenerated, aby se zobrazily průběžné výsledky, zatímco rozpoznávač stále zpracovává data. Tím se zlepší rychlost odezvy tím, že uživateli poskytnete zpětnou vazbu, než bude k dispozici konečný výsledek:

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

Spuštění a zastavení rozpoznávání

Před spuštěním nebo zastavením relace zkontrolujte stav rozpoznávání:

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

Chcete-li okamžitě zrušit operaci a zahodit nevyřízené výsledky, zavolejte CancelAsync místo StopAsync.

Poznámka:

Událost ResultGenerated se může aktivovat po volání CancelAsync z důvodu multithreadingu. Pokud při zrušení relace rozpoznávání nastavíte soukromá pole, vždy ověřte jejich hodnoty v obslužné metodě ResultGenerated.