Permitir ditado contínuo

Saiba como capturar e reconhecer entrada de voz de ditado contínuo e extenso na sua aplicação com o SDK de Aplicações Windows.

Importante

O reconhecimento de voz requer a identidade do pacote MSIX. As APIs Windows.Media.SpeechRecognition estão disponíveis apenas quando a sua aplicação é executada com identidade de pacote (empacotada ou empacotada com localização externa). As aplicações não embaladas não podem usar estas APIs.

APIs principais

Descrição geral

No reconhecimento de fala, aprende-se a captar e reconhecer entradas curtas de fala usando RecognizeAsync ou RecognizeWithUIAsync. Para sessões de reconhecimento de voz mais longas e contínuas — como ditado ou correio eletrónico — utilize a propriedade ContinuousRecognitionSession de um SpeechRecognizer para obter um objeto SpeechContinuousRecognitionSession.

Observação

O suporte à linguagem de ditado depende do dispositivo onde a sua aplicação está a correr. Para PCs e portáteis, apenas en-US é reconhecida para ditado, enquanto Xbox pode reconhecer todas as línguas suportadas pelo reconhecimento de voz. Para mais informações, consulte Especificar a linguagem do reconhecedor de voz.

Configurar

A sua aplicação precisa dos seguintes objetos para gerir uma sessão de ditado contínua:

  • Uma instância de um objeto SpeechRecognizer.
  • Uma referência ao despachante da interface para atualizar a interface durante o ditado.
  • Uma forma de acompanhar as palavras acumuladas pelo utilizador.

Declare uma SpeechRecognizer instância e um StringBuilder para acumular resultados de reconhecimento como campos da sua classe de página:

private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;

No WinUI 3, utiliza-se DispatcherQueue para despachar atualizações da interface a partir de threads em segundo plano (não CoreDispatcher):

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

Inicializar

Durante a inicialização, você:

  1. Inicialize o reconhecedor de fala.
  2. Compila a gramática de ditado incorporada (ou adiciona restrições personalizadas).
  3. Organize ouvintes para eventos de reconhecimento.
// 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();

Processar eventos de reconhecimento

Resultado gerado

O ResultGenerated evento dispara enquanto o utilizador fala. O reconhecedor transmite periodicamente um segmento de entrada de voz. Verifique a Confidence propriedade para decidir se aceita o resultado.

Como este evento é ativado num tópico em segundo plano, use DispatcherQueue.TryEnqueue para atualizar a interface:

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

Concluído

O Completed evento indica que a sessão de reconhecimento contínua terminou. A sessão termina quando chama StopAsync ou CancelAsync, ou quando ocorre um erro, ou quando o utilizador deixa de falar.

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

HipóteseGerado

Processe o evento HypothesisGenerated para mostrar resultados intermédios enquanto o reconhecedor ainda estiver a processar. Isto melhora a capacidade de resposta ao dar feedback ao utilizador antes de estar disponível um resultado final:

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

Reconhecimento de início e fim

Verifique o estado do recognizer antes de iniciar ou parar uma sessão:

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

Para cancelar imediatamente e descartar resultados pendentes, ligue CancelAsync em vez de StopAsync.

Observação

Um ResultGenerated evento poderá ser acionado depois de chamar CancelAsync devido ao multithreading. Se definir campos privados ao cancelar a sessão de reconhecimento, valide sempre os seus valores no ResultGenerated handler.