Introdução

O objetivo deste artigo é mostrar como gerar arquivos de áudio, contendo seus textos sendo narrados pelo sintetizador de voz do windows, através da biblioteca System.Speech.

O conceito de transformar texto em voz (ou texto em narração - termo: Text to Speech) não é algo novo, existem relatos de sistemas operacionais começando a implementar este recurso desde a década de 80.

O objetivo deste artigo é demonstrar a praticidade que podemos ter ao querer usar este recurso, uma vez que, ao longo dos anos, tem evoluído bastante na qualidade do áudio produzido, e sua utilização é muito simples dentro do framework .net. E, com isso, poder vir a integrar, eficazmente, nossos projetos.

A quem interessa este artigo

- Desenvolvedores interessados em soluções de acessibilidade (e também comodidade) destinada a sites/softwares com opção para os seus usuários terem acesso ao conteúdo já escrito também em áudio.

- Desenvolvedores interessados em soluções para auxílio de estudantes de idiomas; Que podem também utilizar deste recurso para praticar a pronúncia de palavras.

- Pesquisadores ou estudantes interessados no recurso de “Text to Speech”.

- Qualquer pessoa, que, por algum motivo, necessite transformar texto em áudio.

Do que vamos precisar

1 - Baixar uma “Voice” (voz), capaz de reproduzir um texto no idioma que queremos.

2 - Desenvolver uma pequena aplicação capaz de utilizar a biblioteca System.Speech, junto com a voz correspondente ao idioma, para converter o texto em áudio.

Encontrado uma Voz correspondente ao idioma do texto

Por padrão, o windows possui uma voz capaz de ler textos no idioma inglês, com sotaque norte americano. Esta voz chama-se microsoft SAM ( no windows xp) ou Microsoft Ana (Windows 7). Nós podemos começar já utilizando esta voz em nosso exemplo, e depois ir incorporando vozes de outros idiomas.

De imediato, qualquer pessoa pode testar a voz do windows indo no painel de controle -> teclado -> opções de texto e fala (windows xp), ou painel de controle -> reconhecimento de voz -> Text to speech (windows 7).

Para o nosso idoma, português, a melhor voz que encontrei é chamada “Raquel”, do fabricante Scan Soft. Ela é capaz de ler textos em português com o som muito fiel ao de uma pessoa de verdade. Infelizmente não é gratuita, custa em torno de uns $40 a $90, mas a sua qualidade vale o preço.

Este áudio, foi feito durante a confecção deste artigo e foi gerado usando a voz “Raquel”, e dizendo o texto “eu sou a mosca que pousou em sua sopa”:

http://www.rendti.com.br/examples/texttospeech/exemplo_ptBR.mp3

No final do artigo colocarei mais alguns links de projetos text to speech, de referências usadas para criar este artigo, e o código fonte de um projeto de demonstração.

A biblioteca System.Speech

A

biblioteca System.Speech, do .net framework, possui 3 poderosos namespaces:

System.Speech.Synthesis: Namespace responsável por conter classes para manipular o sintetizador de voz, capaz de transformar texto em áudio.

System.Speech.AudioFormat: Namespace responsável por conter classes para gerar o arquivo de áudio e definir a qualidade do mesmo.

System.Speech.Recognition: Contém classes e namespaces responsáveis por fazer o efeito inverso do proposto neste artigo; ou seja, reconhecer a voz e transformar em texto.

Para realizar nosso exemplo, usaremos os namespaces: System.Speech.Synthesis e o System.Speech.AudioFormat.

Colocando a mão na massa

Primeiramente, adicionamos a referência para o System.Speech em nosso projeto. No Visual Studio, criei um projeto C# Windows Application, e em seguida adicionei a referência. ( References -> Add Reference -> .NET -> System.Speech ).

Em seguida vamos desenvolver nosso código de exemplo. Dentro do namespace responsável pelo sintetizador de voz, a classe que mais utilizaremos é a SpeechSynthesizer.

A maneira mais simples de “ouvir o computador falar” é instanciando esta classe e utilizando seu método Speak, como no código abaixo.


new
 System.Speech.Synthesis.SpeechSynthesizer().Speak("Hello World!");

Com este comando você ouvirá a narração do texto. Muito simples, não é mesmo ?. É claro que temos também mais outras opções interessantes; como o método GetInstalledVoices (disponível a partir do .net framework versão 3) que irá nos dar uma lista das vozes instaladas em nosso sistema operacional. No exemplo abaixo, vamos popular um combo com essa informação:

Declaramos, no início do arquivo, os namespaces que vamos precisar:

   using System.Speech.Synthesis;
   using System.Speech.AudioFormat;

   //E este é o nosso método: CarregaComboVozes

//---------------------------------
   private void carregaComboVozes(ComboBox cmb)
        {
            SpeechSynthesizer synth = new SpeechSynthesizer();
            foreach (InstalledVoice voice in synth.GetInstalledVoices())
            {
                VoiceInfo info = voice.VoiceInfo;
                     string detalhesVoz =
                    "Nome : " + info.Name + " - Idioma: " + info.Culture + 
                    " - Idade: " + info.Age + " Gênero: " + info.Gender + 
                    " - Descrição: " + info.Description;
                cmb.Items.Add(detalhesVoz);
            }
        }
//---------------------------------

Ao passar para este médodo, via parâmetro, um objeto do tipo ComboBox, o resultado será similar a imagem abaixo:

Exemplo de Texto no Combobox

Figura 1. Exemplo de Texto no Combobox.

Retornamos uma lista de InstalledVoice e, para cada uma, temos o objeto VoiceInfo que contém várias propriedades que descrevem cada voz instalada.

Dessas propriedades, temos uma em especial, chamada Name. Mais a frente, ela será a referênia que iremos passar para o nosso sintetizador saber qual voz querermos ouvir.

Entrando texto e gerando um arquivo de áudio .wav

O método Speak nos permite ouvir o texto no mesmo instante ou gerar um arquivo de áudio. Abaixo temos um exemplo de como criar o nosso arquivo .wav, usando a voz Raquel, no idioma pt-BR.


// Instanciamos um objeto para a classe 
// System.Speech.Synthesis.SpeechSynthesizer
using (SpeechSynthesizer synth = new SpeechSynthesizer())
            {

            // Configuramos a saída do áudio, indicando a 
           //  qualidade do arquivo .wav 
                synth.SetOutputToWaveFile(@"C:\teste.wav",
                new SpeechAudioFormatInfo(32000, AudioBitsPerSample.Sixteen, 
                AudioChannel.Mono));

             //Criamos o objeto SoundPlayer, responsável por “tocar” 
             // um arquivo .wav

                System.Media.SoundPlayer m_SoundPlayer =
                  new System.Media.SoundPlayer(@"C:\teste.wav");


                // Construímos um promptBuilder
                PromptBuilder builder = new PromptBuilder();

                // Indicamos o nome da voz (propriedade Name -> VoiceInfo ) 
                builder.StartVoice("ScanSoft Raquel_Full_22Hz");

                // Adicionamos o texto ao nosso prompt
                builder.AppendText("Eu sou a mosca que pousou em sua sopa");

                builder.EndVoice();

                // Speak the prompt.
                synth.Speak(builder);

                //Vamos ouvir o arquivo .wav
                m_SoundPlayer.Play();
            }

 //--------------------------------------------

Ao setar a opção SetOutPutToWaveFile estamos avisando ao sintetizador que ele deve salvar a narração em um arquivo .wav. Automaticamente ele não irá executar o áudio, irá apenas gravar em arquivo. Por isso, para poder escutar, instânciamos a classe System.Media.SoundPlayer, cujo objeto, m_SoundPlayer, terá a finalidade apenas de reproduzir o áudio do arquivo .wav.

Um pouco abaixo, temos a classe PromptBuilder, que pertence ao namespace System.Speech.Synthesis e contém parametros e métodos para adicionar conteúdo, selecionar vozes, controlar atributos das vozes e controlar a pronúncia de palavras. No código acima, em nosso objeto builder, nós adicionamos o nosso texto (método AppendText) e indicamos qual voz nós gostariamos de usar (método StartVoice - recebendo o nome da voz: este nome pode ser obtido através da propriedade Name, da classe VoiceInfo, citada anteriormente).

Após setar o objeto builder, passamos o mesmo para o nosso sintetizador, através do método Speak; onde então será criado um arquivo .wav com a narração do nosso texto.

Convertendo .wav para .mp3

Caso prefira guardar a sua narração no formato .mp3, por ser mais leve, você pode usar o FFMPEG (http://ffmpeg.org/) para converter de wav para mp3.

Linha de comando do ffmpeg:

ffmpeg -i teste.wav -f mp3  teste.mp3
Executando esta linha de comando no nosso código .NET

using System.Diagnostics;
(...)
//  ------------------------------------------------             
string caminhoFFmpeg = "C:\\ffmpeg\\ffmpeg.exe";
string origem = @"c:\teste.wav";
string saida = @"c:\teste.mp3";
string formatosaida = "mp3";
string comando = "-i \"" + origem + "\" -f  " + 
formatosaida + " \"" + saida + "\"";

System.Diagnostics.ProcessStartInfo processStartInfo = new 
System.Diagnostics.ProcessStartInfo(caminhoFFmpeg, comando);

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = processStartInfo;

//  Executa o comando..             
bool processStarted = process.Start();
//  ------------------------------------------------             

O FFMPEG é uma poderosa ferramenta, que funciona por linha de comando, capaz de realizar conversões entre formatos de áudio e vídeo, caso tenha interesse no FFMPEG, pode ler meu artigo onde falo sobre o mesmo, no link:

//www.devmedia.com.br/-net-e-ffmpeg--convertendo-arquivos-de-videos---mpeg-flv-mov-3gp-vcd-vob---e-varios-outros/23702

Baixe o código fonte de exemplo

Fiz este pequeno projeto, de demonstração, usando Windows.Forms com o Visual Studio 2005 (mas você pode converter para qualquer versão mais nova do visual studio), e o .net Framework 3.5, capaz de executar as funcionalidades descritas no artigo:

1 - Listar as vozes instaladas

2 - Selecionar a voz instalada e ouvir a narração de um texto.

3 - Selecionar a voz instalada e gravar um arquivo .mp3 com a narração do texto digitado.

Projeto em execução

Figura 2. Projeto em execução.

Baixando os arquivos .mp3 gerados na confecção deste artigo

Para ter uma noção da qualidade do áudio, ouvindo os arquivos gerados durante a criação deste artigo, é só baixa-los nos links abaixo.

http://www.rendti.com.br/examples/texttospeech/exemplo_ptBR.mp3 -> Em português, falando “eu sou a mosca que pousou em sua sopa, eu sou a mosca que chegou pra te abusar”.

http://www.rendti.com.br/examples/texttospeech/exemplo_enUS.mp3 -> Em ingês, falando “Hello, I am Hungry”.

Conclusão

Através da biblioteca System.Speech é possível integrar a funcionalidade de leitura de texto em suas aplicações. Seu uso é fácil, e você pode, tanto ouvir quanto salvar a narração em arquivo.

Salvar a narração em arquivo é uma funcionalidade que pode ser extendida junto com a biblioteca ffmpeg, para transformar o arquivo de áudio de .wav para .mp3.

O suporte aos idiomas fica condicionado às vozes disponíveis, instaladas no seu PC.

Para aqueles que têm interesse no reconhecimento de voz, existem algumas fontes de material na internet. Dentre elas a página da Universidade Federal do Pará. (Link no final do artigo)

Referências

http://msdn.microsoft.com/en-us/library/ms586901.aspx (Classe System.Speech).

http://msdn.microsoft.com/en-us/library/gg145021.aspx (Namespaces da System.Speech no .net framework 4).

http://msdn.microsoft.com/en-us/library/ms586869.aspx (Método GetInstalledVoice)

http://msdn.microsoft.com/en-us/library/system.speech.synthesis.promptbuilder.aspx (Classe PromptBuilder)

//www.devmedia.com.br/-net-e-ffmpeg--convertendo-arquivos-de-videos---mpeg-flv-mov-3gp-vcd-vob---e-varios-outros/23702 (Meu artigo, onde explico o uso do FFMEPG)

Links

http://www.nextup.com/ (Text Aloud - Software mais usado para TextToSpeech, neste site também é possível comprar as vozes de diversos idiomas).

http://www.laps.ufpa.br/falabrasil/downloads.php (Universidade Federal do Pará, diversos projetos , inclusive com .NET, para reconhecimento de voz).

http://jornaldaparaiba.com.br/ (Jornal da Paraíba, onde é possível escutar as notícias do site).

http://ffmpeg.org (Página do projeto FFMPEG)