Instruções de uso

Essa seção apresenta as informações básicas de como utilizar o CPQD Texto Fala em uma aplicação Java. Detalhes sobre as classes da API pública podem ser consultados acessando a seção Interface de Programação ou através dos hiperlinks presentes no texto.

O código fonte da interface de programação Java está disponível publicamente no GitHub: https://github.com/CPqD/tts-sdk-java.

Inicialização do CPQD Texto Fala

O primeiro passo para usar o CPQD Texto Fala é criar o objeto da Classe SynthesisEngine, importando o pacote br.com.cpqd.tts, para carregar e inicializar a biblioteca dinâmica.

A criação do objeto da Classe SynthesisEngine requer três parâmetros: o caminho da biblioteca dinâmica (libcpqdtts.dll, em Windows, e libcpqdtts.so, em GNU/Linux), o caminho onde o produto está instalado e o caminho onde os arquivos de log serão gerados.

SynthesisEngine engine = new SynthesisEngine("libcpqdtts.so", "/opt/cpqd/tts/engine", "/var/log/tts");

Aviso

A inicialização do CPQD Texto Fala pode ser um processo custoso, dependendo das vozes configuradas no arquivo tts.conf, e só precisa ser feita apenas uma única vez. Não inicialize o produto várias vezes durante a execução da aplicação, pois isso causará lentidão.

Se algum problema ocorrer durante a inicialização, uma exceção será lançada. Detalhes do erro podem ser obtidos no arquivo de log tts.log. Também é possível obter detalhes da exceção, conforme apresentado na seção Classe SynthesisException.

Gerenciamento de vozes

Para utilizar as funções de síntese, é necessário ter uma ou mais vozes carregadas. Normalmente o arquivo tts.conf vem configurado para carregar todas as vozes adquiridas durante a inicializaçao, mas em determinados cenários pode ser interessante carregar a voz apenas quando necessária (e.g. para economizar memória). Nesses casos, a aplicação pode fazer uso do método loadVoice presente na Classe SynthesisEngine para carregar uma voz em tempo de execução.

Aviso

Dependendo do tipo de voz, o carregamento pode ser um processo custoso e causará em lentidão. Em geral, vozes do tipo compact são as mais rápidas de carregar e as do tipo highquality são as mais demoradas. Carregar as vozes na inicialização é a melhor opção na maioria dos cenários.

A voz carregada será identificada pelo seu nome de arquivo. Por exemplo, se o programa invocar a função indicando o caminho /opt/cpqd/tts/engine/rosana-compact.voice, a voz será identificada pela expressão rosana-compact.voice.

loadVoice("/opt/cpqd/tts/engine/rosana-compact.voice");

Uma vez carregada, a voz estará disponível para uso até que seja explicitamente descarregada por meio do método unloadVoice ou até a finalização do CPQD Texto Fala.

unloadVoice("rosana-compact.voice");
if (result != TTS_OK)

Sessões de síntese

Antes de utilizar os métodos de síntese, um objeto de sessão deve ser criado. Uma sessão define um contexto no qual pode-se parametrizar e efetuar uma síntese de fala. As sessões são thread-safe e é recomendado que uma sessão seja utilizada por apenas uma thread.

Os objetos de sessões são criados através do método createSession presente na Classe SynthesisEngine. O objeto de sessão será utilizado por todas os métodos que utilizam sessões de síntese. Ao invocar o método createSession, a aplicação pode indicar o nome da voz padrão. A voz padrão é aquela que será utilizada quando nenhuma outra for especificada via SSML.

SynthesisSession session = engine.createSession(null);

As configurações iniciais de uma sessão de síntese vem do arquivo de configuração. Quando a sessão é criada, o CPQD Texto Fala recupera os parâmetros definidos no arquivo de configuração (e.g. codificação do áudio, ritmo, etc) e aplica-os na sessão. Entretanto, a aplicação pode alterar esses parâmetros para cada sessão utilizando métodos da Classe SynthesisSession. A tabela a seguir lista os métodos que permitem recuperar e alterar as configurações em tempo de execução.

Recuperar Alterar

O exemplo a seguir aumenta o ritmo da fala em 20% e altera a codificação do áudio de saída para: PCM linear, 8kHz, 16 bits por amostra, mono.

session.setRate(1.2F);

session.setEncoderName("pcm/8000/16/1");

É importante destacar que sessões de síntese são recursos limitados e devem ser liberadas quando não forem mais necessárias. A liberação de uma sessão é feita através do método release.

session.release();

Conversão de texto em fala

A conversão de texto em fala pode ser realizada através de dois métodos: textToSpeech e textToSpeechStream da Classe SynthesisSession.

O método textToSpeech oferece a forma mais simples de efetuar a conversão de texto em fala, na qual função bloqueará a thread corrente até que todo o texto tenha sido convertido. Quando o método retornar, a aplicação poderá recuperar o áudio gerado usando o método getAudio ou armazená-lo em disco com o método saveAudio.

session.textToSpeech("Este é um exemplo de síntese de fala");

Já o método textToSpeechStream converte texto em fala via streaming. Nesse modo de operação, a aplicação recebe porções do áudio gerado na medida em que a síntese de fala é efetuada. A entrega do áudio é realizada em blocos via listener e o tamanho dos blocos é variável. Esse modo de operação é bastante útil em aplicações onde o tempo de resposta é um fator crítico, como em cenários envolvendo diálogo em tempo real.

MyListener listener = new MyListener();


session.textToSpeechStream("Este é um exemplo de síntese de fala", listener, null);

Note que o método textToSpeechStream não efetua síntese de forma assíncrona: o método também bloqueia a thread corrente até o final da conversão de texto em fala, mas oferece um meio da aplicação obter resultados parciais. Idealmente, a aplicação deveria criar uma thread separada para invocar o método textToSpeechStream de forma que a interface com o usuário não seja comprometida.

Após a execução do método textToSpeechStream, o áudio também estará disponível para ser recuperado pelos métodos getAudio e saveAudio.

Tratamento de erros

Em caso de falha na execução de alguma operação, os métodos do CPQD Texto Fala irão retornar uma exceção. Os códigos de erro contidos no ojeto da exceção fornecem uma visão geral a respeito da falha ocorrida. Caso seja necessário obter maiores detalhes, seja para incluir em arquivos de log da aplicação ou fornecer para a equipe de suporte do CPQD, pode-se fazer uso da Classe SynthesisException.

try {
   SynthesisSession session = engine.createSession(null);
} catch (SynthesisException e) {
   System.out.println("Erro ao criar a sessão: " + e.getMessage() + e.getCode());
}