Dev (Back & Front)ARTIGO

Transformando texto escrito em texto narrado com .NET e a 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 é 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.NET113 conteúdosNovidades do .NET 9 – o tipo genérico OrderedDictionaryDev (Back & Front) · dez 2024Novidades .NET 10: novas formas de uso do .NET CLIDev (Back & Front) · dez 2025Novidades do .NET 5: implementando um proxy reverso com YARP + ASP.NET 5Dev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) . E com isso, ele poder vir a integrar de forma eficaz nos nossos projetos.

A quem interessa este artigo: 

 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:

é micro empresário e analista de sistemas. Desenvolve soluções em .NET, PHP e ASP na sua empresa, Rend Tecnologia da Informação Ltda. Possui certificações Microsoft: MCP em Desenvolvimento Web com C#, MCTS em SQL Server 2005. Atualmente estudan desenvolvimento com Android e Windows Phone e é aluno especial no mestrado em sistemas e computação da UNIFACS - Universidade de Salvador.

Ver perfil