Gere áudio em tempo real
Gere áudio em tempo real
Este guia mostra como gerar áudio em tempo real por uma conexão WebSocket.
O streaming por WebSocket é um método de envio e recebimento de dados em uma única conexão de longa duração. Esse método é útil para aplicações em tempo real nas quais você precisa transmitir dados de áudio assim que eles ficam disponíveis.
Se quiser testar rapidamente a latência (tempo até o primeiro byte) de uma conexão WebSocket com a API de conversão de texto em voz da ElevenLabs, você pode instalar elevenlabs-latency via npm e seguir as instruções aqui.
Os WebSockets estão disponíveis para Text to Speech e para a Plataforma de Agentes. Este guia aborda o WebSocket de Text
to Speech (/v1/text-to-speech/{voice_id}/stream-input). Esse endpoint não oferece suporte aos modelos
eleven_v3 nem eleven_v4. Para diálogos com Eleven v3 ou Eleven v4 por WebSocket, consulte Texto em Tempo Real para Diálogo
e WebSockets de Text to Speech vs. Texto para Diálogo.
Requisitos
- Uma conta ElevenLabs com uma chave de API (veja como encontrar sua chave de API).
- Python ou Node.js (ou outro ambiente de execução JavaScript) instalado na sua máquina
Configuração
Instale as dependências necessárias:
Em seguida, crie um arquivo .env no diretório do projeto e adicione sua chave de API:
Inicie a conexão WebSocket
Depois de escolher uma voz na Voice Library e o modelo de conversão de texto em voz que deseja usar, inicie uma conexão WebSocket com a API de conversão de texto em voz.
Envie o texto de entrada
Quando a conexão WebSocket estiver aberta, configure primeiro as definições de voz. Em seguida, envie a mensagem de texto para a API.
Salve o áudio em um arquivo
Leia a mensagem recebida da conexão WebSocket e grave os blocos de áudio em um arquivo local.
Execute o script
Você pode executar o script rodando o comando a seguir no terminal. Um arquivo de áudio mp3 será salvo no diretório output.
Configuração avançada
O uso de WebSockets oferece algumas configurações avançadas que você pode usar para ajustar a geração de áudio em tempo real.
Bufferização
Ao gerar áudio em tempo real, é importante considerar dois conceitos: Tempo Até o Primeiro Byte (TTFB) e bufferização. Para produzir áudio de alta qualidade e deduzir o contexto, o modelo exige uma determinada quantidade mínima de texto de entrada. Quanto mais texto for enviado em uma conexão WebSocket, melhor será a qualidade do áudio. Se essa quantidade mínima não for atingida, o modelo adicionará o texto a um buffer e gerará o áudio quando o buffer estiver cheio.
Em termos de latência, o TTFB é o tempo necessário para que o primeiro byte de áudio seja enviado ao cliente. Isso é importante porque afeta a latência percebida do áudio. Portanto, talvez você queira controlar o tamanho do buffer para equilibrar qualidade e latência.
Para gerenciar isso, você pode usar o parâmetro chunk_length_schedule ao inicializar a conexão WebSocket ou ao enviar texto. Esse parâmetro é uma matriz de números inteiros que representa a quantidade de caracteres que será enviada ao modelo antes da geração do áudio. Por exemplo, se você definir chunk_length_schedule como [120, 160, 250, 290], o modelo gerará áudio depois que 120, 160, 250 e 290 caracteres forem enviados, respectivamente.
Veja como isso funciona com as configurações padrão de chunk_length_schedule:
No diagrama acima, o áudio só é gerado após a segunda mensagem ser enviada ao servidor. Isso acontece porque a primeira mensagem está abaixo do limite de 120 caracteres, enquanto a segunda eleva o total de caracteres acima desse limite. A terceira mensagem está acima do limite de 160 caracteres, então o áudio é gerado imediatamente e retornado ao cliente.
Você pode especificar um valor personalizado para chunk_length_schedule ao inicializar a conexão WebSocket ou ao enviar texto.
Caso queira forçar o retorno imediato do áudio, você pode usar flush: true para limpar o buffer e forçar a geração de qualquer texto armazenado nele. Isso pode ser útil, por exemplo, quando você chega ao fim de um documento e quer gerar o áudio da seção final.
Isso pode ser especificado por mensagem ao definir flush: true na mensagem.
Além disso, fechar o websocket forçará automaticamente a geração de qualquer texto armazenado no buffer.
Definições de voz
Ao inicializar as conexões WebSocket, você pode especificar as definições de voz para as gerações subsequentes. Isso permite controlar a velocidade, a estabilidade e outras características de voz do áudio gerado.
Isso pode ser substituído por mensagem ao especificar voice_settings diferente na mensagem.
Dicionários de pronúncia
Você pode usar dicionários de pronúncia para controlar a pronúncia de palavras ou frases específicas. Isso pode ser útil para garantir que certas palavras sejam pronunciadas corretamente ou para dar ênfase a determinadas palavras ou frases.
Diferentemente de voice_settings e generation_config, os dicionários de pronúncia devem ser especificados na mensagem “Initialize Connection”. Consulte a referência da API para mais informações.
Ao usar dicionários de pronúncia baseados em fonemas com WebSockets, você deve adicionar enable_ssml_parsing=true como parâmetro de consulta ao URI do WebSocket. Por exemplo:
Boas práticas
- Sugerimos usar a configuração padrão de
chunk_length_scheduleemgeneration_config. - Ao desenvolver uma aplicação de agente conversacional em tempo real, recomendamos usar
flush: truejunto ao texto no fim de cada turno da conversa para garantir a geração de áudio no momento certo. - Se a configuração padrão não oferecer a latência ideal para seu caso de uso, você pode modificar
chunk_length_schedule. No entanto, lembre-se de que reduzir a latência com esse ajuste pode comprometer a qualidade.
Dicas
- A conexão WebSocket será fechada automaticamente após 20 segundos de inatividade. Para mantê-la aberta, você pode enviar um único caractere de espaço
" ". Observe que essa string deve incluir um espaço, pois enviar uma string totalmente vazia,"", fechará o WebSocket. - Envie uma string vazia para fechar a conexão WebSocket após enviar a última mensagem de texto.
- Você pode usar
alignmentpara obter os timestamps de cada palavra no texto. Isso pode ser útil para alinhar o áudio ao texto em um vídeo ou em outras aplicações que exigem temporização precisa. Consulte a referência da API para mais informações.