WebSocket¶
A API WebSocket permite a integração de aplicações com as funções de síntese de fala, com um canal de comunicação de baixa latência e pequeno overhead para a transferência de stream de áudio.
Este documento tem como objetivo detalhar o mecanismo de comunicação da API WebSocket do servidor de síntese de fala do CPQD, visando facilitar a integração de aplicações que façam uso de suas funcionalidades.
Visão geral¶
Para utilizar a interface de integração WebSocket, o servidor WebSocket/REST do Texto Fala deve estar instalado e disponível através de uma URL.
URL padrão
ws://<SERVER>/ws/v3/synthesize
A conexão entre aplicação e servidor é estabelecida de maneira padrão para essa tecnologia, ou seja, através de uma mensagem HTTP de handshake enviada pelo cliente, com indicação de upgrade da conexão para o protocolo WebSocket. O servidor irá responder o handshake e abrir uma conexão socket com o cliente. A partir desse momento, mensagens podem ser trocadas entre os dois endpoints.
Mensagens¶
A API WebSocket utiliza um conjunto de mensagens para acionar as funções do Texto Fala. Ela é composta pelas seguintes mensagens:
SET PARAMS
Define parâmetros de configuração da síntese de fala para a sessão websocket, como voz, codificação, volume, ritmo da fala e utilizador.
GET PARAMS
Obtém os parâmetros de configuração da síntese de fala para a sessão websocket.
TEXT TO SPEECH
Realiza a síntese de fala a partir de um texto ou XML/SSML.
STOP
Interrompe o stream de áudio, após o início da síntese.
ENCODERS
Obtém os nomes dos encoders de voz.
VOICES
Obtém os nomes das vozes disponíveis.
Formato: as mensagens possuem formato JSON e devem ser enviadas pela aplicação no socket aberto. Dependendo da mensagem, o servidor poderá responder uma mensagem em formato texto (JSON) ou o stream de áudio em formato binário. O corpo da requisição deve possuir os seguintes atributos:
mType
indica a mensagem. Valores: «get-param», «set-param», «text-to-speech», «stop», «encoders», «voices»
text
(opcional) o texto a ser convertido em áudio
voice
(opcional) o nome da voz. Veja valores válidos em “/tts/rest/v2/voices”
encoder
(opcional) o nome do encoder de áudio. Veja valores válidos em “/tts/rest/v2/encoders”
volume
(opcional) define o volume padrão. Valores aceitos: 0.0 (mudo) a 2.0 (alto). O valor padrão é 1.0.
rate
(opcional) define o ritmo padrão. Valores aceitos: 0.3 (lento) a 3.0 (rápido). O valor padrão é 1.0.
cache
(opcional) indica se o áudio pode ser recuperado de memória cache ou se a síntese deve ser realizada (boolean)
autoclose
(opcional) indica se o socket deve ser fechado após a síntese
Exemplos de mensagens:
Mensagem de configuração de parâmetros da sessão
Mensagem:
{ "mType": "set-param" "voice": "rosana-highquality.voice", "encoder": "wav/16000/8/1", "volume": 1.0, "rate": 0.8 }
Resposta do servidor:
{ "voice":"rosana-highquality.voice", "volume":1.0, "rate":0.8, "encoder":"wav/16000/8/1" }
Mensagem de leitura dos parâmetros da sessão
Mensagem:
{ "mType": "get-param" }
Resposta do servidor:
{ "voice":"rosana-highquality.voice", "volume":1.0, "rate":0.8, "encoder":"wav/16000/8/1" }
Mensagem de síntese de fala com configuração de parâmetros da sessão
Mensagem:
{ "mType": "text-to-speech" "text": "Alô mundo", "voice": "adriana-highquality.voice", "cache": true "autoclose": false }
Resposta do servidor: stream de áudio binário. O socket poderá fechar automaticamente ao final do stream caso o parâmetro autoclose
esteja definido como true
na mensagem de text-to-speech
.
Mensagem interrupção do *stream* de áudio
Mensagem:
{ "mType": "stop" }
Resposta do servidor: fim do stream.
SSML/XML: neste caso, o conteúdo deve ser um documento XML no padrão SSML (veja: https://www.w3.org/TR/speech-synthesis11 ). Exemplo:
<?xml version="1.0" encoding="UTF-8"?> <speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="pt-BR"> <expressive>Olá!</expressive> <expressive>Boa tarde!</expressive> Eu sou Rosana, a voz feminina do CPQD, para o português. Você pode mudar minha voz como quiser. Por exemplo: <prosody pitch="+30%"> Eu consigo falar mais fino, </prosody> <prosody pitch="-30%"> ou mais grosso. </prosody> <prosody rate="70%"> Consigo falar mais lento, </prosody> <prosody rate="180%"> ou mais rápido que o normal. </prosody> <prosody volume="+12dB"> Também consigo falar mais alto, </prosody> <prosody volume="-12dB"> e bem mais baixo. </prosody> Nessa nova versão de texto fala, podemos usar, por exemplo, <voice name="carlos-highquality.voice"> a voz do Carlos em português junto com a voz da Rosana. </voice> Bacana, <expressive>Não acha?</expressive> <expressive>Agradecemos sua visita! </expressive> <expressive>Até a próxima!</expressive> </speak>
Erros¶
Caso ocorra algum erro na requisição de síntese, o servidor irá enviar uma mensagem com os seguinte atributos:
code
código numérico indicando o erro.
message
mensagem descritiva
Exemplo:
{ "code": "3", "message": "No suitable plugin found" }