Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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ê:
- Inicialize o reconhecedor de fala.
- Compila a gramática de ditado incorporada (ou adiciona restrições personalizadas).
- 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.
Artigos relacionados
Windows developer