WPF - Usando os recursos do Microsoft .NET Speech (C#)


Neste artigo eu vou falar um pouco mais sobre a tecnologia Text-to-Speech (recurso que sintetiza voz a partir de um texto). Este recurso estava presente desde as primeiras versões do Visual Basic e existem diversas bibliotecas de terceiros no mercado que podem ser usadas para tratar o recurso de texto para voz e também o do reconhecimento de voz.

Text-To-Speech : Sintetiza voz a partir de um texto.
     Speech recognization : Converte a fala humana em um texto
     Microsoft Speech Server (MSS) - Um servidor com suporte a recursos de voz.
     SALT - Speech Application Language Tags - Padrão aberto baseado na linguagem XML usado em páginas HTML/XHTML para incluir recursos de reconhecimento de voz em aplicações web.

Quero apresentar neste artigo a nova classe  System.Speech que passou a vir incorporada com a plataforma .NET a partir da versão 3.0. Agora você tem ao seu dispor uma classe com recursos de reconhecimento e síntese de voz que quando usada em conjunto com o Microsoft Speech SDK 5.1 permite a criação de aplicações muito interessantes.

O recursos necessários para acompanhar este artigo são:

Usando a classe System.Speech para síntese de voz com WPF

Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo WPF Application com o nome fala_WPF;

A próxima tarefa é incluir uma referência a classe System.Speech. Para isso clique com o botão sobre o nome do projeto e selecione Add Reference;

A seguir na janela Add Reference , abra a aba .NET e selecione System.Speech clicando no botão OK;

Em seguida vamos criar uma interface bem simples que nos permita digitar um texto em uma caixa de texto , controlar o volume e a velocidade , falar o texto, data , a hora e o nome que no caso é o Microsoft Ana Para isso vamos usar os seguintes controles a partir da ToolBox:

Veja abaixo como ficou o leiaute da interface criada:

Vamos agora definir o código usando os recursos da classe System.Speech. No arquivo MainWindow.xaml.cs inclua a referência ao namespace Speech.Synthesis;

using System.Speech.Synthesis;

A primeira que vamos fazer é declarar no início do do arquivo code-behind  MainWindow.xaml.cs uma instância do objeto Speech chamado aqui de speaker;

SpeechSynthesizer speaker = new SpeechSynthesizer();

A classe System.Speech.Synthesis.Speechsynthesizer possui as propriedades e método que permitem  sintetizar em voz humana uma string usando a linguagem padrão e a voz do sistema operacional. No meu caso estou usando o Windows 7 e a voz padrão é a voz da Microsoft Ana. Se estiver usando o Windows XP a voz usada será a Microsoft Sam.

Para sintetizar a voz do texto digitado usamos o seguinte código no evento Click do botão - Falar Texto:

private void btnFalarTexto_Click(object sender, RoutedEventArgs e)
{
     if (!txtTexto.Text.Equals(string.Empty))
     {
         speaker.SpeakAsync(txtTexto.Text);
     }
     else
     {
         MessageBox.Show("Informe o texto para falar.");
    }
}

Este código usa o método SpeakAsync da classe Speechsynthesizer para reproduzir o texto digitado usando a voz padrão Microsoft Ana. Os valores para a velocidade e o volume foram definidos no evento ValueChanged dos controles Sliders conforme o código abaixo:

 private void sldVolume_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  {
        speaker.Volume = (int)sldVolume.Value;
  }

 private void sldVelocidade_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  {
      speaker.Rate = (int)sldVelocidade.Value;
  }

O código para falar a data , a hora e o nome estão no evento Click dos respectivos controles Button conforme abaixo:

  private void btnFalarData_Click(object sender, RoutedEventArgs e)
   {
         speaker.SpeakAsync("Today is " + DateTime.Now.ToShortDateString());
   }
   private void btnFalarHora_Click(object sender, RoutedEventArgs e)
   {
       speaker.SpeakAsync("The time is " + DateTime.Now.ToShortTimeString());
  }
  private void btnFalarNome_Click(object sender, RoutedEventArgs e)
  {
         speaker.SpeakAsync("My name is " + speaker.Voice.Name);
  }

Executando o projeto iremos obter o seguinte resultado:

Um detalhe: o texto esta em inglês pois não há ainda um pacote para a língua portuguesa.

Obs: Veja o meu outro artigo sobre o assunto: VB .NET - Usando os recursos do Microsoft .NET Speech

Pegue o projeto completo aqui: Fala_WPF.zip

Eu sei á penas WPF, mas eu gosto...

Referências:


José Carlos Macoratti