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
- Baixar uma “voice” (voz), capaz de reproduzir um texto no idioma que queremos.
- 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:
- Listar as vozes instaladas;
- Selecionar a voz instalada e ouvir a narração de um texto;
- 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
- 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)
- https://imasters.com.br/artigo/23929/dotnet/convertendo-arquivos-de-videos-com-net-e-ffmpeg (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)