VB .NET - Usando os recursos do Microsoft .NET Speech


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.

Na primeira parte deste artigo eu vou mostrar como usar a camada de Speech da plataforma .NET para sintetizar voz a partir de textos e depois tratarei do reconhecimento de voz.

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

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

Abra o VB 2010 Express Edition e crie um novo projeto do tipo WIndows Forms Application com o nome sintetizandoVoz_Speech;

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;

Feito isso abra o formulário padrão form1.vb e inclua os seguintes namespaces no início do formulário:

Imports System.Speech
Imports
System.Speech.Synthesis
Imports
System.IO

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 , exportar o texto como um arquivo padrão .WAV e falar o texto digitado. 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.

A primeira que vamos fazer é declarar no início do formulário form1.vb uma instância do objeto Speech chamado aqui de speaker;

Dim speaker As 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:

    Private Sub btnFalar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFalar.Click

        If Not txtTexto.Text = String.Empty Then
            speaker.Rate = Convert.ToInt32(trkbVelocidade.Value)
            speaker.Volume = Convert.ToInt32(trkbVolume.Value)
            speaker.SpeakAsync(txtTexto.Text)
        Else
            MsgBox("Informe um texto para sintetizar.")
        End If

    End Sub

Este código usa as propriedades Rate, Volume  para definir a velocidade e o volume da voz e 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 volume são obtidos a partir dos controles TrackBar  que têm os seus valores iniciais definidos no evento Load do formulário:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        trkbVelocidade.Value = 0
        trkbVolume.Value = 70
    End Sub

Para gerar um arquivo padrão .wav exportando para o sistema de arquivos basta informar o nome e o local onde o arquivo deverá ser gerado e clicar no botão Exportar. O código que realiza esta operação esta no evento Click deste botão:

 Private Sub btnExportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportar.Click
        If txtExportar.Text = String.Empty Then
            MessageBox.Show("Informe um local para salvar o arquivo .WAV", "Arquivo não definido", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            Try
                speaker.Rate = Convert.ToInt32(trkbVelocidade.Value)
                speaker.Volume = Convert.ToInt32(trkbVolume.Value)
                speaker.SetOutputToWaveFile(txtExportar.Text)
                speaker.Speak(txtTexto.Text)
                speaker.SetOutputToDefaultAudioDevice()
                MessageBox.Show("Arquivo gerado com sucesso.", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show("Erro ao gravar o arquivo." & vbNewLine & ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    End Sub

 

Este código novamente usa as propriedades Rate e Volume da classe Speechsynthesizer  para definir a velocidade e volume da voz gravada.

O método SetOutputToWaveFile() é que vai gerar o arquivo .wav com o nome e o local indicados usando o padrão do seu dispositivo de áudio.

A seguir temos um exemplo da execução da opção para gerar e exportar um arquivo .wav gerado a partir do texto digitado:

Pegue o programa completo aqui: sintetizandoVoz_Speech.zip

Obs: Veja o meu outro artigo sobre o assunto: WPF - Usando os recursos do Microsoft .NET Speech (C#) (ainda inativo)

Eu sei á penas VB .NET, mas eu gosto...

Referências:


José Carlos Macoratti