Integre um modelo TTS próprio a um fluxo de trabalho em tempo real implantando um endpoint de streaming HTTPS que aceita texto e retorna áudio.
Como funciona
Configure o nó TTS no console com sua URL HTTPS, token e taxa de amostragem.
Inicie o fluxo de trabalho em tempo real. A cada solicitação TTS, o fluxo envia uma requisição POST com o texto, a voz, a taxa de amostragem e os metadados da sessão para seu endpoint.
O servidor TTS gera o áudio e o transmite como resposta HTTP.
O fluxo de trabalho encaminha os blocos de áudio aos nós subsequentes em tempo real.
Pré-requisitos
Antes de começar:
O modelo TTS deve estar acessível pela Internet via HTTPS.
O servidor HTTP deve oferecer suporte a respostas em streaming.
Um modelo de fluxo de trabalho com um nó TTS criado.
Configure o nó TTS
Defina os seguintes parâmetros no nó TTS:
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
Exemplo |
|
Request URL |
String |
Sim |
URL HTTPS do endpoint do modelo TTS. |
|
|
Token |
String |
Não |
Token de autorização enviado com cada solicitação. |
|
|
Sample rate |
Integer |
Sim |
Taxa de amostragem de áudio em Hz. Valores válidos: |
|
Somente áudio mono S16LE (Signed 16-bit Little-Endian) é suportado. Se o modelo usar outro formato, reamostre a saída para S16LE.
Parâmetros da solicitação
Durante a execução, o fluxo de trabalho envia uma requisição POST ao endpoint com o seguinte corpo JSON:
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
Exemplo |
|
Text |
String |
Sim |
Texto para sintetizar em fala. |
|
|
VoiceId |
String |
Não |
Identificador de voz do modelo TTS. |
|
|
SampleRate |
Integer |
Sim |
Taxa de amostragem em Hz. Corresponde ao valor configurado no console. |
|
|
Token |
String |
Não |
Token de autorização. Corresponde ao valor configurado no console. |
|
|
ExtendData |
String |
Sim |
String JSON com metadados da sessão e dados comerciais personalizados. Consulte Campos de ExtendData. |
Veja abaixo |
Campos de ExtendData
O campo ExtendData contém as seguintes informações:
|
Campo |
Tipo |
Obrigatório |
Descrição |
Exemplo |
|
InstanceId |
String |
Sim |
ID da instância do agente inteligente. |
|
|
ChannelId |
String |
Sim |
ID do canal de comunicação. |
|
|
SentenceId |
Int |
Sim |
ID da sessão de perguntas e respostas. Todas as respostas a uma única consulta do usuário compartilham o mesmo |
|
|
Emotion |
String |
Não |
Emoção da fala sintetizada. Valores válidos: |
|
|
UserData |
String |
Não |
Dados comerciais personalizados transmitidos na inicialização da instância do agente inteligente. |
|
**Exemplo de valor para ExtendData:**
{
"InstanceId": "68e00b6640e*****3e943332fee7",
"ChannelId": "123",
"SentenceId": "3",
"Emotion": "happy",
"UserData": "{\"aaaa\":\"bbbb\"}"
}
Requisitos de resposta
O servidor TTS deve retornar áudio correspondente ao tom e à taxa de amostragem solicitados como resposta HTTP em streaming. Menor latência de streaming melhora diretamente o desempenho de ponta a ponta.
Exemplo de servidor TTS
Python
Utiliza aiohttp para implementar um servidor TTS com streaming no endpoint /stream-audio.
from aiohttp import web
async def stream_audio(request):
data = await request.json()
text = data.get('Text', "")
token = data.get('Token', None)
sample_rate = data.get('SampleRate', 48000)
extend_data = data.get('ExtendData', "")
print(f"text:{text}, token:{token}, sample_rate:{sample_rate}, extend_data:{extend_data}")
# Validate the token here.
response = web.StreamResponse(
status=200,
reason='OK',
headers={'Content-Type': 'audio/mpeg'}
)
# Start the streaming response.
await response.prepare(request)
# generate_tts_data is a coroutine that yields audio chunks.
async for chunk in generate_tts_data(text, sample_rate):
await response.write(chunk)
# Signal the end of the response.
await response.write_eof()
return response
async def generate_tts_data(text: str, sample_rate: int):
# Replace this with your TTS model inference logic.
# This example reads audio data from a local PCM file.
file_path = '/your_dir/sample.pcm'
with open(file_path, 'rb') as f:
while True:
chunk = f.read(4096) # Read 4 KB per chunk.
if not chunk:
break
yield chunk
app = web.Application()
app.add_routes([web.post('/stream-audio', stream_audio)])
if __name__ == '__main__':
web.run_app(app)
Em produção, substitua generate_tts_data pela lógica de inferência do modelo e atualize /your_dir/sample.pcm para o caminho real do arquivo de áudio.