23 09 2014
Síntese de voz em aplicativos para a Windows Store
Olá caro(a) leitor(a)!
Quem se inscreveu na minha newsletter sabe que o meu plano para a semana passada era escrever sobre reconhecimento de voz (“speech recognition“) e síntese de voz (“speech synthesis” ou “text-to-speech“) em aplicativos para a Windows Store (“metro style apps“). Porém, devido a alguns imprevistos relacionados à minha volta para casa depois das férias, não consegui escrever algo substancial na semana passada. Então, antes de tudo, se você quer ficar por dentro das novidades do meu blog, inscreva-se na minha newsletter.
Outro ponto de dificuldade que enfrentei é que a sistemática para reconhecimento de voz em aplicativos para a Windows Store mudou drasticamente. Agora temos que utilizar o controle “Bing Speech Recognition“, e eu não tinha conseguido fazer o exemplo funcionar até poucos dias atrás (no sábado eu finalmente consegui fazer funcionar com a ajuda de um outro MVP da Bélgica). Como são várias etapas para fazer esse controle funcionar de forma correta, resolvi dividir esses dois assuntos em dois artigos, um falando sobre reconhecimento de voz e outro falando sobre síntese de voz. No artigo dessa semana, vou abordar síntese de voz em aplicativos para a Windows Store.
O processo de habilitar síntese de voz no seu aplicativo para a Windows Store é muito simples e agrega um valor bem interessante, principalmente no quesito acessibilidade. Para demonstrar o funcionamento do sintetizador de voz, vamos criar uma Windows Store Blank App e, na MainPage, vamos adicionar um TextBox e um Button:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Width="300" Margin="50" HorizontalAlignment="Left"> <TextBox x:Name="TextoASintetizar" /> <Button x:Name="Sintetizar" HorizontalAlignment="Stretch" Content="Sintetizar" Click="Sintetizar_Click" /> </StackPanel> </Grid>
No code-behind da MainPage, vamos adicionar o código para fazer a síntese do texto digitado no TextBox:
private async void Sintetizar_Click(object sender, RoutedEventArgs e) { var synthesizer = new Windows.Media.SpeechSynthesis.SpeechSynthesizer(); Windows.Media.SpeechSynthesis.SpeechSynthesisStream stream = await synthesizer.SynthesizeTextToStreamAsync(TextoASintetizar.Text); var mediaElement = new MediaElement(); mediaElement.SetSource(stream, stream.ContentType); mediaElement.Play(); }
Como vocês podem ver, o processo de síntese de voz em aplicativos para a Windows Store é muito simples. Basta criar uma instância da classe SpeechSynthesizer e chamar o seu método SynthesizeTextToStreamAsync passando o texto a ser sintetizado. Com isso temos uma Stream com o resultado da síntese e podemos utilizar um MediaElement para reproduzir o conteúdo dessa Stream.
Execute a aplicação, digite algo no TextBox, clique no botão “Sintetizar” e veja o resultado sendo reproduzido. Note que, caso o seu sistema operacional esteja em inglês, você deve digitar algo em inglês para ser sintetizado, uma vez que a voz instalada nesse caso só conseguirá fazer a síntese em inglês.
Escolhendo a voz a ser utilizada
Ao chamar o método SynthesizeTextToStreamAsync sem configurar uma voz para o SpeechSynthesizer, o sintetizador de voz utilizará a voz default do sistema. Caso o seu sistema operacional esteja configurado em inglês, a voz default é a “Microsoft David Desktop“.
Para escolher uma voz específica na síntese, basta alterar a propriedade Voice do SpeechSynthesizer para uma das vozes instaladas no sistema. E para saber quais vozes estão instaladas no sistema, basta acessar a propriedade estática AllVoices da classe SpeechSynthesizer.
Vamos melhorar um pouco o nosso exemplo, adicionando um ComboBox com as vozes disponíveis e utilizando a voz selecionada ao realizar a síntese. Adicione um ComboBox na MainPage com o nome de “Voz“:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Width="300" Margin="50" HorizontalAlignment="Left"> <TextBox x:Name="TextoASintetizar" /> <ComboBox x:Name="Voz" /> <Button x:Name="Sintetizar" HorizontalAlignment="Stretch" Content="Sintetizar" Click="Sintetizar_Click" /> </StackPanel> </Grid>
Depois vá até o code-behind da MainPage e adicione as etapas para preencher o ComboBox no construtor:
public MainPage() { this.InitializeComponent(); Voz.ItemsSource = Windows.Media.SpeechSynthesis.SpeechSynthesizer.AllVoices; Voz.DisplayMemberPath = "DisplayName"; Voz.SelectedIndex = 0; }
E, finalmente, na ação de sintetizar, vamos configurar a propriedade Voice do SpeechSynthesizer com a voz selecionada no ComboBox:
private async void Sintetizar_Click(object sender, RoutedEventArgs e) { var synthesizer = new Windows.Media.SpeechSynthesis.SpeechSynthesizer(); if (Voz.SelectedItem != null) synthesizer.Voice = (Windows.Media.SpeechSynthesis.VoiceInformation) Voz.SelectedItem; Windows.Media.SpeechSynthesis.SpeechSynthesisStream stream = await synthesizer.SynthesizeTextToStreamAsync(TextoASintetizar.Text); var mediaElement = new MediaElement(); mediaElement.SetSource(stream, stream.ContentType); mediaElement.Play(); }
Instalando vozes de outros idiomas
Caso o seu sistema operacional esteja configurado em inglês, muito provavelmente você só terá disponível vozes que falam em inglês. Para adicionar suporte a outros idiomas, basta instalar o language pack do idioma desejado. Para verificar se você tem o language pack instalado, vá até a busca por configurações do Windows (tecla do Windows + “W” no Windows 8.1), digite “language” e escolha a opção “Edit language and keyboard options“:
Na tela que se abre, abaixo de cada idioma configurado, você tem a informação indicando se o language pack está instalado ou disponível para instalação. Por exemplo, no meu computador eu já tinha instalado o language pack para o idioma Português Brasil:
Se eu ainda não tivesse instalado (como é o caso do idioma alemão no meu computador), eu poderia clicar no idioma, e logo em seguida clicar no botão “Options“:
Na tela de detalhes do idioma escolhido, basta clicar em “Download” para que o language pack seja baixado e instalado:
Após a instalação, ao executarmos novamente o nosso exemplo, veremos que novas vozes foram adicionadas:
E você, já está utilizando síntese de voz nos seus aplicativos? Se não, por que? Se sim, o que você achou do esquema de síntese de voz em aplicativos para a Windows Store? Deixe um comentário logo abaixo!
Para finalizar, repito aqui novamente o meu convite para inscrever-se na minha newsletter. Dessa forma você fica sempre por dentro das novidades aqui do meu blog.
Até o próximo artigo!
André Lima
Image by Howard Lake used under Creative Commons
https://www.flickr.com/photos/howardlake/5540462170/
Dica rápida: Desabilitando as animações em uma apresentação do PowerPoint Reconhecimento de voz em aplicativos para a Windows Store
[…] 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 […]
Hello Mr.Andre,
I hope you have been well,
I tried the above approach to change the voice of the SpeechSynthesizer to an Arabic voice,
I faced a problem in that the installed Arabic voices (Naayf and Hoda) don’t appear in the GetInstalledVoices() method !
I posted a question about it in MSDN but got no useful answer,
https://social.msdn.microsoft.com/Forums/en-US/20014a3c-8d30-44b6-867a-3a67f0a43071/how-to-set-the-voice-of-speechsynthesizer-to-an-arabic-voice-?forum=windowsgeneraldevelopmentissues
You have been always a great teacher for me, I hope you could help me if you time allows it.
Thanks very much Sir.
Hello Ahmed!
Everything pretty well over here, I hope you are also well..
In this article I used specifically the library for the Windows Store Applications (Windows.Media.SpeechSynthesis.SpeechSynthesizer), which is probably different from the one you are using in a “normal” application (Microsoft.Speech.Synthesis).. I have no experience with this other library, but, anyway, I took a look in the thread you started in the MSDN forums and replied to you there..
Let’s keep the discussion there in this case, to avoid discussing it in multiple places.. :)
Regards,
André Lima
Hi Ahmed!
From what I can see, you could solve the issue by updating to the latest version of the Spire.Barcode library, correct? Or is there still anything open regarding this issue?
Regards,
André Lima