André Alves de Lima

Talking about Software Development and more…

Reconhecimento de voz em aplicativos para a Windows Store

Caro(a) leitor(a), na semana passada escrevi sobre síntese de voz em aplicativos para a Windows Store. Para completar o ciclo, nesta semana vou abordar o reconhecimento de voz (speech recognition) em aplicativos para a Windows Store.

Como mencionei no artigo da semana passada, a sistemática para reconhecimento de voz em aplicativos para a Windows Store mudou bastante ao compararmos com a maneira como isso é feito em aplicativos desktop “normais“. Em aplicativos para a Windows Store precisamos utilizar o controle Bing Speech Recognition. Porém, não basta simplesmente instalar e sair utilizando. Temos que seguir todo um processo estranho e atualmente mal documentado. Por isso decidi fazer algo como um passo-a-passo neste artigo.

Instalando o controle Bing Speech Recognition

O primeiro (e mais fácil) passo desse processo é instalar o controle “Bing Speech Recognition“. Para isso, vá até a página do controle, clique em “Baixar” e siga as instruções do instalador. Isso fará com que o controle seja adicionado ao seu Visual Studio 2013. O próximo passo é criar um aplicativo no Microsoft Azure Marketplace.

Criando um aplicativo no Microsoft Azure Marketplace

Esse é o passo mais sinistro e mal documentado de todo o processo. Consegui fazer um dos exemplos da própria Microsoft funcionar com a ajuda de um outro MVP da Bélgica (o Diederik Krols). Hoje, ao escrever esse artigo, fui me aprofundando mais e mais na documentação e, depois de vários cliques, acabei chegando neste documento da Microsoft. Em uma das categorias desse documento você consegue encontrar o procedimento para registrar a aplicação no Marketplace e conseguir as credenciais para fazer o controle funcionar. Vou poupar o seu trabalho e detalhar o processo com algumas screenshots.

A primeira etapa é ir até o Microsoft Azure Marketplace (que, a propósito, eu nem sabia que existia) e criar uma conta, caso você ainda não tenha uma. É importante que você utilize o país “United States“, pois o controle do Bing Speech Recognition só está disponível nessa região. Caso você já tenha uma conta no Microsoft Azure Marketplace, é só ir em “My Account” e mudar o país para “United States“.

Após ter criado a conta, vá até a página do Speech Recognition Control Data e clique em “Sign Up“. Siga os passos até que o controle seja adicionado à sua conta.

Feito isso, agora é hora de criar uma application no Azure Marketplace. Vá até a página de aplicações para desenvolvedores e clique em “Register“:

Na página que se abre, preencha as informações necessárias e clique em “Create“, atentando principalmente para os campos “Client ID” e “Client secret“, uma vez que você irá precisar dessas informações mais para frente na construção da aplicação de exemplo. No campo “Client ID” você pode escolher um ID para a sua aplicação. E o campo “Client secret” vem automaticamente preenchido com o token a ser utilizado na aplicação para realizar a autenticação.

Feito o registro, feche a página do Microsoft Azure Marketplace e abra o Visual Studio para construirmos a nossa aplicação de exemplo (ufa!).

Utilizando o controle Bing Speech Recognition

No Visual Studio 2013, crie uma Windows Store Blank App. Logo de cara, vá até as referências e adicione a referência ao Bing.Speech, que você encontra dentro da categoria “Extensions“:

Feito isso, na MainPage, logo no topo do XAML, na declaração da Page, adicione o namespace para o Bing Speech Recognition (xmlns:speech=”using:Bing.Speech.Xaml”):

<Page
    x:Class="App3.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App3"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:speech="using:Bing.Speech.Xaml"
    mc:Ignorable="d">

Tente compilar a aplicação e veja que você não vai conseguir. Isso se deve ao fato de que o controle do Bing Speech não funciona com a arquitetura “Any CPU“, que é o default do Visual Studio quando criamos uma solução para a Windows Store:

Portanto, temos que alterar a arquitetura de “Any CPU” para alguma das opções disponíveis (ARM, x86 ou x64) na barra do Visual Studio ou na página “Build” das propriedades da sua aplicação:

Eu recomendo nesse caso, pelo menos para desenvolver, a utilização da arquitetura x86, uma vez que, com essa arquitetura, o designer do XAML funciona perfeitamente. Recompile a solução e veja que, após a alteração da arquitetura, ela é compilada com sucesso.

Agora, dentro do Grid, vamos criar um StackPanel com três controles: um SpeechRecognizerUx (que é o controle de UI do Bing Speech Recognition), um TextBlock (que vai armazenar o texto reconhecido) e um AppBarButton (que servirá para começar o processo de reconhecimento):

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel>
            <speech:SpeechRecognizerUx Height="100"
                                       x:Name="SpeechControl" />
            <TextBlock x:Name="ResultText"
                       FontSize="60"/>
            <AppBarButton x:Name="SpeakButton"
                          Icon="Microphone"
                          Click="SpeakButton_Click"></AppBarButton>
        </StackPanel>
    </Grid>

Depois vá até o code-behind da MainPage, declare um Bing.Speech.SpeechRecognizer e, no evento Loaded da MainPage, vamos inicializá-lo:

        private Bing.Speech.SpeechRecognizer _recognizer;

        public MainPage()
        {
            this.InitializeComponent();
            this.Loaded += MainPage_Loaded;
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            var credentials = new Bing.Speech.SpeechAuthorizationParameters();
            credentials.ClientId = "SEU_CLIENT_ID";
            credentials.ClientSecret = "SEU_CLIENT_SECRET";
            _recognizer = new Bing.Speech.SpeechRecognizer("en-US", credentials);
            SpeechControl.SpeechRecognizer = _recognizer;
        }

Note que nesse passo é importante que você configure corretamente o “ClientID” e “ClientSecret” obtidos no passo anterior, durante a criação do aplicativo no Microsoft Azure Marketplace.

O passo final no desenvolvimento do exemplo é implementar o handler para o evento Click do botão que iniciará o processo de reconhecimento de voz. Nesse evento, vamos chamar o método RecognizeSpeechToTextAsync e colocar o resultado do reconhecimento no TextBlock que chamamos anteriormente de ResultText:

        private async void SpeakButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var result = await _recognizer.RecognizeSpeechToTextAsync();
                if (result.TextConfidence != Bing.Speech.SpeechRecognitionConfidence.Rejected)
                    ResultText.Text = result.Text;
                else
                    ResultText.Text = "Desculpe, não consegui detectar o que você falou...";
            }
            catch (Exception)
            {
                ResultText.Text = "Erro durante o reconhecimento de voz...";
            }
        }

Por fim, os únicos passos que estão faltando são adicionar a “capability” de microfone e adicionar mais algumas informações no seu arquivo appxmanifest. Para adicionar a capability de microfone, abra o arquivo appxmanifest da sua aplicação, vá até a aba “Capabilities” e marque a opção “Microphone“:

Agora só falta a gambiarra nível “pro” de adicionar “na mão” umas extensions no seu arquivo appxmanifest, caso contrário a aplicação não funcionará e lançará uma exception durante o processo de reconhecimento. Para isso, clique com o botão direito no seu appxmanifest no Solution Explorer e escolha a opção “Open with“:

Na caixa de opções, escolha “XML (Text) Editor“:

No arquivo XML que se abre, logo após o fechamento da tagCapabilities“, adicione o seguinte código:

  <Extensions>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>Microsoft.Speech.VoiceService.MSSRAudio.dll</Path>
        <ActivatableClass ActivatableClassId="Microsoft.Speech.VoiceService.MSSRAudio.Encoder" ThreadingModel="both" />
      </InProcessServer>
    </Extension>
    <Extension Category="windows.activatableClass.proxyStub">
      <ProxyStub ClassId="5807FC3A-A0AB-48B4-BBA1-BA00BE56C3BD">
        <Path>Microsoft.Speech.VoiceService.MSSRAudio.dll</Path>
        <Interface Name="IEncodingSettings" InterfaceId="C97C75EE-A76A-480E-9817-D57D3655231E" />
      </ProxyStub>
    </Extension>
    <Extension Category="windows.activatableClass.proxyStub">
      <ProxyStub ClassId="F1D258E4-9D97-4BA4-AEEA-50A8B74049DF">
        <Path>Microsoft.Speech.VoiceService.Audio.dll</Path>
        <Interface Name="ISpeechVolumeEvent" InterfaceId="946379E8-A397-46B6-B9C4-FBB253EFF6AE" />
        <Interface Name="ISpeechStatusEvent" InterfaceId="FB0767C6-7FAA-4E5E-AC95-A3C0C4D72720" />
      </ProxyStub>
    </Extension>
  </Extensions>

Espero que a Microsoft melhore esse processo no futuro, porque, do jeito que está agora não tem condições, não é mesmo?

Mas, enfim, agora sim o exemplo vai funcionar. Execute a aplicação e faça um teste você mesmo!

Infelizmente, o controle ainda não suporta o idioma português. Somente os seguintes idiomas são atualmente suportados (lista obtida da documentação na data de escrita desse artigo):

de-DE – German (Germany)
en–US – English (Unites States)
en-GB – English (Great Britain)
es-ES – Spanish (Spain)
fr-FR – French (France)
it-IT – Italian (Italy)
zh-CN – Chinese (China)

E aí, o que você está esperando para adicionar reconhecimento de voz no seu aplicativo? Eu particularmente não gostei dessa sistemática atualmente disponibilizada pela Microsoft, mas, o que podemos fazer se esse é a única maneira? Deixe o seu comentário logo abaixo e compartilhe sua opinião com a gente!

E inscreva-se na minha newsletter para ficar por dentro das novidades do blog e também para ficar sabendo em primeira mão sobre um produto que estou desenvolvendo no momento.

Até a próxima!

André Lima

Image by SparkCBC used under Creative Commons
https://www.flickr.com/photos/25031050@N06/4443536762/

2 thoughts on “Reconhecimento de voz em aplicativos para a Windows Store

  • valderez donzelli disse:

    Um absurdo o produto comercializado e comprado no brasil não ter o reconhecimento de fala do idioma do País!
    Se os anteriores tinham !

    Bom nem mudando de idioma este bendito reconhecimento de fala funciona. O que fazer?
    cade o vido do site http://windows.microsoft.com/pt-BR/windows-8/using-speech-recognition!

    Trocar de idioma é o fim do mundo! ou nosso país já adotou o Espanhol como lingua oficia?

    • andrealveslima disse:

      Olá Valderez!
      Muito obrigado pelo seu comentário!
      O reconhecimento de voz em português está disponível no Windows 8.1 diretamente no sistema operacional.. O que nós, programadores, não conseguimos fazer é utilizá-lo ao desenvolvermos aplicativos para a Windows Store (que rodam nessa nova interface “moderna” do Windows).. Nesse cenário, a única opção até o momento é utilizar esse controle que mencionei no artigo, o qual não suporta o idioma português até agora.. Acredito que eles adicionarão suporte ao nosso idioma em breve, visto que o idioma português tem se mostrado bastante importante para a Microsoft.. Inclusive, o Technical Preview do Windows 10 foi lançado também em português do Brasil, o que é um ótimo sinal..
      Enfim, assim que eu souber que o controle está suportanto o português, eu atualizo o post..
      E, caso queira ficar por dentro das novidades do meu site, inscreva-se!
      Abraço!
      André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *