.NET

8 mai, 2012

Transformando texto escrito em texto narrado com .NET e a biblioteca System.Speech

Publicidade

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 é mostrar como gerar arquivos de áudio, contendo seus textos sendo narrados pelo sintetizador de voz do Windows, através da biblioteca System.Speech. Vamos demonstrar a praticidade que podemos ter ao querer usar este recurso, uma vez que, ao longo dos anos, ele tem evoluído bastante na qualidade do áudio produzido e sua utilização é muito simples dentro do framework .NET. E com isso, ele poder vir a integrar de forma eficaz nos nossos projetos.

A quem interessa este artigo: 

  • Desenvolvedores interessados em soluções de acessibilidade (e também comodidade) destinadas a sites/ softwares com opção para os seus usuários tenham acesso ao conteúdo já escrito, só que agora 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 em inglês norte americano. Esta voz se chama Microsoft SAM ( no Windows XP) ou Microsoft Ana (Windows 7). Nós podemos começar utilizando esta voz em nosso exemplo e depois incorporar 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 (isso no Windows XP), ou Painel de Controle -> Reconhecimento de Voz -> Text to Speech (no Windows 7).

Para o nosso idoma, português, a melhor voz que encontrei é chamada de “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, ela não é gratuita e custa entre US$40 a US$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”.

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 três 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 transformá-la 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 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 um objeto do tipo ComboBox, via parâmetro, para este médodo, o resultado será similar a imagem abaixo:

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ência 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; 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 parâmetros e métodos para adicionar conteúdo, selecionar vozes, controlar os 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; no qual, 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 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 aqui.

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.

Este é o link para baixar o código fonte:  http://www.rendti.com.br/examples/texttospeech/projeto.rar

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.

  • Clique aqui para fazer o download da versão em português, falando “eu sou a mosca que pousou em sua sopa, eu sou a mosca que chegou pra te abusar”.
  • Clique aqui para fazer o download da versão em inglê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 – essa é 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

 Links: