Partilhar via


Reconhecimento de fala

Utilize o reconhecimento de voz para fornecer entrada, especificar uma ação ou comando e realizar tarefas.

APIs importantes: Windows.Media.SpeechRecognition

O reconhecimento de voz é composto por um tempo de execução de voz, APIs de reconhecimento para programar o tempo de execução, gramáticas prontas para uso em ditado e pesquisa na web, e uma interface padrão do sistema que ajuda os utilizadores a descobrir e utilizar funcionalidades de reconhecimento de voz.

Configurar reconhecimento de voz

Para suportar o reconhecimento de voz com a sua aplicação, o utilizador deve ligar e ativar um microfone no seu dispositivo, e aceitar a Política de Privacidade da Microsoft que concede permissão para que a sua aplicação o utilize.

Para solicitar automaticamente ao utilizador um diálogo do sistema a pedir permissão para aceder e usar o feed de áudio do microfone (exemplo do exemplo de Reconhecimento de Fala e síntese de voz mostrado abaixo), basta definir a capacidade do dispositivoMicrofone no manifesto do pacote da App. Para mais detalhes, consulte declarações de capacidades da aplicação.

Política de privacidade para acesso a microfones

Se o utilizador clicar em 'Sim' para permitir o acesso ao microfone, a sua aplicação é adicionada à lista de aplicações aprovadas na página Definições -> Privacidade -> Microfone. No entanto, como o utilizador pode optar por desligar esta definição a qualquer momento, deve confirmar que a sua aplicação tem acesso ao microfone antes de tentar usá-lo.

Se também quiser suportar ditado, Cortana ou outros serviços de reconhecimento de voz (como uma gramática pré-definida numa restrição de tópico), deve também confirmar que o reconhecimento de fala online (Definições -> Privacidade -> Fala) está ativado.

Este excerto mostra como a sua aplicação pode verificar se um microfone está presente e se tem permissão para o usar.

public class AudioCapturePermissions
{
    // If no microphone is present, an exception is thrown with the following HResult value.
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
    /// the Cortana/Dictation privacy check.
    ///
    /// You should perform this check every time the app gets focus, in case the user has changed
    /// the setting while the app was suspended or not in focus.
    /// </summary>
    /// <returns>True, if the microphone is available.</returns>
    public async static Task<bool> RequestMicrophonePermission()
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
            settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
            settings.MediaCategory = MediaCategory.Speech;
            MediaCapture capture = new MediaCapture();

            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Thrown when a media player is not available.
            var messageDialog = new Windows.UI.Popups.MessageDialog("Media player components are unavailable.");
            await messageDialog.ShowAsync();
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Thrown when permission to use the audio capture device is denied.
            // If this occurs, show an error or disable recognition functionality.
            return false;
        }
        catch (Exception exception)
        {
            // Thrown when an audio capture device is not present.
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                await messageDialog.ShowAsync();
                return false;
            }
            else
            {
                throw;
            }
        }
        return true;
    }
}
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
IAsyncOperation<bool>^  AudioCapturePermissions::RequestMicrophonePermissionAsync()
{
    return create_async([]() 
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings^ settings = ref new MediaCaptureInitializationSettings();
            settings->StreamingCaptureMode = StreamingCaptureMode::Audio;
            settings->MediaCategory = MediaCategory::Speech;
            MediaCapture^ capture = ref new MediaCapture();

            return create_task(capture->InitializeAsync(settings))
                .then([](task<void> previousTask) -> bool
            {
                try
                {
                    previousTask.get();
                }
                catch (AccessDeniedException^)
                {
                    // Thrown when permission to use the audio capture device is denied.
                    // If this occurs, show an error or disable recognition functionality.
                    return false;
                }
                catch (Exception^ exception)
                {
                    // Thrown when an audio capture device is not present.
                    if (exception->HResult == AudioCapturePermissions::NoCaptureDevicesHResult)
                    {
                        auto messageDialog = ref new Windows::UI::Popups::MessageDialog("No Audio Capture devices are present on this system.");
                        create_task(messageDialog->ShowAsync());
                        return false;
                    }

                    throw;
                }
                return true;
            });
        }
        catch (Platform::ClassNotRegisteredException^ ex)
        {
            // Thrown when a media player is not available. 
            auto messageDialog = ref new Windows::UI::Popups::MessageDialog("Media Player Components unavailable.");
            create_task(messageDialog->ShowAsync());
            return create_task([] {return false; });
        }
    });
}
var AudioCapturePermissions = WinJS.Class.define(
    function () { }, {},
    {
        requestMicrophonePermission: function () {
            /// <summary>
            /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
            /// the Cortana/Dictation privacy check.
            ///
            /// You should perform this check every time the app gets focus, in case the user has changed
            /// the setting while the app was suspended or not in focus.
            /// </summary>
            /// <returns>True, if the microphone is available.</returns>
            return new WinJS.Promise(function (completed, error) {

                try {
                    // Request access to the audio capture device.
                    var captureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
                    captureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio;
                    captureSettings.mediaCategory = Windows.Media.Capture.MediaCategory.speech;

                    var capture = new Windows.Media.Capture.MediaCapture();
                    capture.initializeAsync(captureSettings).then(function () {
                        completed(true);
                    },
                    function (error) {
                        // Audio Capture can fail to initialize if there's no audio devices on the system, or if
                        // the user has disabled permission to access the microphone in the Privacy settings.
                        if (error.number == -2147024891) { // Access denied (microphone disabled in settings)
                            completed(false);
                        } else if (error.number == -1072845856) { // No recording device present.
                            var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                            messageDialog.showAsync();
                            completed(false);
                        } else {
                            error(error);
                        }
                    });
                } catch (exception) {
                    if (exception.number == -2147221164) { // REGDB_E_CLASSNOTREG
                        var messageDialog = new Windows.UI.Popups.MessageDialog("Media Player components not available on this system.");
                        messageDialog.showAsync();
                        return false;
                    }
                }
            });
        }
    })

Reconhecer entrada de fala

Uma restrição define as palavras e frases (vocabulário) que uma aplicação reconhece na entrada da fala. As restrições estão no cerne do reconhecimento de voz e dão à sua aplicação maior controlo sobre a precisão do reconhecimento de voz.

Pode usar os seguintes tipos de restrições para reconhecer a entrada da fala.

Gramáticas pré-definidas

A ditadura pré-definida e as gramáticas de pesquisa na web fornecem reconhecimento de fala para a sua aplicação sem que precise de criar uma gramática. Ao utilizar estas gramáticas, o reconhecimento de voz é realizado por um serviço web remoto e os resultados são devolvidos ao dispositivo.

A gramática padrão de ditado em texto livre consegue reconhecer a maioria das palavras e expressões que um utilizador pode dizer numa determinada língua, e está otimizada para reconhecer frases curtas. A gramática de ditado pré-definida é usada se não especificares quaisquer restrições para o teu objeto SpeechRerecognizer . O ditado em texto livre é útil quando não se quer limitar o tipo de coisas que um utilizador pode dizer. Utilizações típicas incluem criar notas ou ditar o conteúdo de uma mensagem.

A gramática de pesquisa na web, tal como a gramática de ditado, contém um grande número de palavras e frases que um utilizador pode dizer. No entanto, está otimizado para reconhecer termos que as pessoas normalmente usam ao pesquisar na internet.

Observação

 Como as gramáticas de ditado e pesquisa web predefinidas podem ser grandes, e porque estão online (não no dispositivo), o desempenho pode não ser tão rápido como com uma gramática personalizada instalada no dispositivo.  

Estas gramáticas pré-definidas podem ser usadas para reconhecer até 10 segundos de entrada de fala e não exigem qualquer esforço de autoria da sua parte. No entanto, exigem uma ligação a uma rede.

Para usar as restrições do serviço web, o suporte à entrada e ditado de voz deve estar ativado nas Definições , ativando a opção "Conhece-me" em Definições -> Privacidade -> Fala, Entintagem e Digitação.

Aqui, mostramos como testar se a entrada de voz está disponível e, caso não esteja, abrir a página de Definições -> Privacidade -> Fala, tinta digital e escrita.

Primeiro, inicializamos uma variável global (HResultPrivacyStatementDeclined) ao valor HResult de 0x80045509. Veja Tratamento de exceções para em C# ou Visual Basic.

private static uint HResultPrivacyStatementDeclined = 0x80045509;

Depois detetemos quaisquer exceções padrão durante o reconhecimento e testamos se o valor HResult é igual ao valor da variável HResultPrivacyStatementDeclined. Se sim, mostramos um aviso e chamamos await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); para abrir a página de Definições.

catch (Exception exception)
{
  // Handle the speech privacy policy error.
  if ((uint)exception.HResult == HResultPrivacyStatementDeclined)
  {
    resultTextBlock.Visibility = Visibility.Visible;
    resultTextBlock.Text = "The privacy statement was declined." + 
      "Go to Settings -> Privacy -> Speech, inking and typing, and ensure you" +
      "have viewed the privacy policy, and 'Get To Know You' is enabled.";
    // Open the privacy/speech, inking, and typing settings page.
    await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); 
  }
  else
  {
    var messageDialog = new Windows.UI.Popups.MessageDialog(exception.Message, "Exception");
    await messageDialog.ShowAsync();
  }
}

Veja Reconhecimento de FalaTemaRestrição.

Restrições de listas programáticas

As restrições de listas programáticas fornecem uma abordagem leve para criar gramáticas simples usando uma lista de palavras ou frases. Uma restrição de lista funciona bem para reconhecer frases curtas e distintas. Especificar explicitamente todas as palavras numa gramática também melhora a precisão do reconhecimento, pois o motor de reconhecimento de fala só deve processar a fala para confirmar uma correspondência. A lista também pode ser atualizada programaticamente.

Uma restrição de lista consiste num array de cadeias que representam a entrada de voz que a sua aplicação aceitará para uma operação de reconhecimento. Pode criar uma restrição de lista na sua aplicação criando um objeto de restrição de lista de reconhecimento de voz e passando um array de strings. Depois, adiciona esse objeto à coleção de restrições do reconhecedor. O reconhecimento é bem-sucedido quando o reconhecedor de fala reconhece qualquer uma das cadeias do array.

Ver Reconhecimento de FalaListaConstraint.

Gramáticas SRGS

Uma Gramática de Reconhecimento de Fala (SRGS) é um documento estático que, ao contrário de uma restrição de lista programática, utiliza o formato XML definido pela Versão 1.0 do SRGS. Uma gramática SRGS oferece o maior controlo sobre a experiência de reconhecimento de voz, permitindo captar múltiplos significados semânticos num único reconhecimento.

Consulte a Constraint de Ficheiro de Gramática de Reconhecimento de Fala.

Restrições de comandos de voz

Use um ficheiro XML de Definição de Comando de Voz (VCD) para definir os comandos que o utilizador pode dar para iniciar ações ao ativar a sua aplicação. Para mais detalhes, consulte Ativar uma aplicação em primeiro plano com comandos de voz através do Cortana.

Ver Restrição de Definição de Comando de Voz para Reconhecimento de Fala/

Nota O tipo de restrição que usa depende da complexidade da experiência de reconhecimento que pretende criar. Qualquer uma pode ser a melhor escolha para uma tarefa específica de reconhecimento, e podes encontrar utilizações para todo o tipo de restrições na tua aplicação. Para começar com restrições, veja Definir restrições de reconhecimento personalizadas.

A gramática de ditado da aplicação universal Windows predefinida reconhece a maioria das palavras e frases curtas numa língua. É ativado por defeito quando um objeto de reconhecimento de voz é instanciado sem restrições personalizadas.

Neste exemplo, mostramos como:

  • Crie um reconhecedor de fala.
  • Compilar as restrições padrão da aplicação Universal Windows (não foram adicionadas gramáticas ao conjunto gramatical do reconhecedor de voz).
  • Comece a ouvir a fala usando a interface básica de reconhecimento e o feedback TTS fornecidos pelo método RecognizeWithUIAsync . Use o método RecognizeAsync se a interface padrão não for necessária.
private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the dictation grammar by default.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Personalize a interface de reconhecimento

Quando a sua aplicação tenta reconhecimento de voz ligando para o SpeechRecognizer.RecognizeWithUIAsync, vários ecrãs são mostrados pela seguinte ordem.

Se estiver a usar uma restrição baseada numa gramática pré-definida (ditado ou pesquisa na web):

  • O ecrã de Escuta .
  • O ecrã Pensamento.
  • O ecrã de reconhecimento de voz ou o ecrã de erro.

Se estiver a usar uma restrição baseada numa lista de palavras ou frases, ou uma restrição baseada num ficheiro gramatical SRGS:

  • O ecrã de escuta.
  • O ecrã do "Disseste", se o que o utilizador disse puder ser interpretado como mais de um resultado potencial.
  • O ecrã "Ouvir o que disse" ou o ecrã de erro.

A imagem seguinte mostra um exemplo do fluxo entre ecrãs de um reconhecedor de fala que utiliza uma restrição baseada num ficheiro gramatical SRGS. Neste exemplo, o reconhecimento de fala foi bem-sucedido.

Ecrã inicial de reconhecimento para uma restrição baseada num ficheiro gramatical SGRS

Ecrã de reconhecimento intermédio para uma restrição baseada num ficheiro gramatical SGRS

Ecrã final de reconhecimento para uma restrição baseada num ficheiro gramatical SGRS

O ecrã de Escuta pode fornecer exemplos de palavras ou frases que a aplicação consegue reconhecer. Aqui, mostramos como usar as propriedades da classe SpeechRecognizerUIOptions (obtida ao chamar a propriedade SpeechRecognizer.UIOptions ) para personalizar o conteúdo no ecrã de Listening .

private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Listen for audio input issues.
    speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;

    // Add a web search grammar to the recognizer.
    var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");


    speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
    speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
    speechRecognizer.Constraints.Add(webSearchGrammar);

    // Compile the constraint.
    await speechRecognizer.CompileConstraintsAsync();

    // Start recognition.
    Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
    //await speechRecognizer.RecognizeWithUIAsync();

    // Do something with the recognition result.
    var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
    await messageDialog.ShowAsync();
}

Amostras