Voz em tempo real sem pausas longas: o desafio por trás da solução
Agentes de voz, ferramentas de acessibilidade, assistentes de atendimento ao cliente e aplicações educativas interativas têm um requisito em comum: precisam responder rapidamente, sem silêncios longos que quebram a experiência do usuário. Para isso, o ideal é que o sistema comece a reproduzir o áudio antes mesmo de terminar de gerar toda a resposta — uma técnica conhecida como streaming de áudio.
A AWS publicou um tutorial técnico que mostra exatamente como fazer isso no Amazon SageMaker AI, usando o Container de Aprendizado Profundo (DLC) vLLM-Omni para implantar o modelo Qwen3-TTS. O fluxo envia texto de entrada e recebe chunks de áudio de saída por uma única conexão bidirecional persistente, com a experiência sendo demonstrada por meio de uma aplicação Gradio.
Este é o Parte 1 de uma série sobre DLCs especializados — incluindo vLLM-Omni, WhisperX e llama.cpp. Esta primeira parte foca em fala em streaming para aplicações de voz em tempo real. A Parte 2 aplica o mesmo DLC vLLM-Omni para geração de imagens e vídeos.
O que são os AWS Deep Learning Containers especializados
Os AWS Deep Learning Containers são imagens Docker pré-configuradas com frameworks de aprendizado profundo e todas as dependências necessárias para treinamento e inferência na AWS. A empresa fornece orientações de implantação para frameworks amplamente adotados como vLLM e SGLang.
Runtimes de inferência especializados suportam arquiteturas de modelos e pipelines de mídia que diferem da geração de texto convencional. Os DLCs da AWS empacotam esses runtimes com suas dependências de framework e configuração de implantação, oferecendo um caminho padronizado baseado em imagem para computação AWS e serviços gerenciados de inferência.
O projeto vLLM-Omni expande o vLLM além da geração de texto, permitindo servir modelos que processam ou geram texto, áudio, imagens e vídeo. O DLC vLLM-Omni da AWS empacota as releases rastreadas do vLLM-Omni em imagens AWS e adiciona um middleware de roteamento para o SageMaker AI.
A abstração de pipeline heterogêneo do vLLM-Omni coordena fluxos de trabalho de modelos em múltiplos estágios, incluindo estágios autoregressivos e de difusão. Ele também fornece saídas em streaming e APIs compatíveis com o padrão OpenAI. O runtime não se limita a Texto para Fala (TTS): os modelos suportados incluem modelos omni unificados, Reconhecimento Automático de Fala (ASR), TTS, geração de áudio, geração de imagens e geração de vídeo.
Contexto: o lado da entrada já foi coberto
Um artigo anterior da AWS demonstrou o lado da entrada de um pipeline de voz: ele transmite áudio do microfone para o modelo Voxtral-Mini-4B Realtime de Fala para Texto (STT) e retorna eventos de transcrição. O tutorial atual adiciona o lado da saída — enviando texto para o Qwen3-TTS e transmitindo o áudio gerado de volta pelo DLC vLLM-Omni.
Com as duas peças combinadas, é possível montar um pipeline completo: o áudio do microfone entra no modelo de transcrição, o texto resultante passa pela lógica de conversa da aplicação, e a resposta em texto é convertida em fala em streaming para o usuário. A orquestração entre os dois endpoints, no entanto, fica fora do escopo deste tutorial.
Visão geral da solução
O exemplo completo está disponível no repositório 03-features/bidirectional-streaming-vLLM-Omni. O clone do repositório fornece o script de implantação, o transporte de streaming compartilhado e o cliente Gradio juntos.
O streaming bidirecional do SageMaker expõe um WebSocket full-duplex transportado sobre HTTP/2. O cliente conecta ao endpoint do SageMaker Runtime na porta 8443. O sidecar de inferência do SageMaker encaminha a conexão para a rota WebSocket nativa do vLLM-Omni dentro do container.
O cliente envia eventos de configuração de sessão e de texto. O Qwen3-TTS retorna eventos de ciclo de vida de áudio e chunks de áudio pela mesma conexão. O DLC vLLM-Omni v1.5 adiciona o rótulo de capacidade de streaming bidirecional e o middleware de roteamento exigidos pelo SageMaker AI. O exemplo usa a rota v1/audio/speech/stream, uma das rotas WebSocket nativas expostas pelo vLLM-Omni.
A configuração do endpoint também utiliza pools de instâncias do SageMaker. Um pool de instâncias define uma lista priorizada de tipos de instâncias compatíveis para uma variante de produção. O SageMaker tenta primeiro o ml.g6.xlarge e, se não houver capacidade disponível, recorre ao ml.g6e.xlarge, ml.g5.xlarge ou ml.g4dn.xlarge. Ainda assim, apenas uma instância é provisionada — não uma por entrada no pool.
O SageMaker valida a cota para cada entrada configurada no pool ao criar o endpoint, portanto é necessário ter cota disponível para cada tipo incluído. O custo por hora também pode variar se o SageMaker selecionar um tipo diferente. Use o parâmetro --instance-types para restringir o pool aos tipos que atendem aos requisitos de cota, preço e desempenho.
Pré-requisitos
Antes de começar, são necessários:
- Uma conta AWS com credenciais configuradas para a Interface de Linha de Comando (CLI) da AWS ou um SDK AWS
- Git
- Python 3.12 ou mais recente
- Uma role de execução do SageMaker AI
- Permissão para criar e invocar endpoints do SageMaker AI
- Cota de endpoint para pelo menos um tipo de instância do pool:
ml.g6.xlarge,ml.g6e.xlarge,ml.g5.xlargeouml.g4dn.xlarge - Boto3 versão 1.40.0 ou mais recente
- O cliente Python HTTP/2 do SageMaker Runtime versão 0.4.0
O tutorial usa a região US East (N. Virginia). O exemplo constrói o URI da imagem DLC e o endpoint de runtime a partir da variável AWS_REGION.
Implantando o endpoint de fala em streaming
Clonando o repositório e instalando dependências
O primeiro passo é clonar o repositório de exemplos de hospedagem e entrar no diretório do exemplo de streaming bidirecional vLLM-Omni:
git clone https://github.com/aws-samples/sagemaker-genai-hosting-examples.git
cd sagemaker-genai-hosting-examples/03-features/bidirectional-streaming-vLLM-Omni
Em seguida, crie um ambiente virtual e instale as versões definidas pelo exemplo:
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
Configurando o exemplo
Defina a role de execução do SageMaker AI. O exemplo usa us-east-1 como padrão. Passe --region para usar outra região suportada:
export SAGEMAKER_EXECUTION_ROLE_ARN="arn:aws:iam::<account-id>:role/<sagemaker-execution-role>"
A configuração do AMI de inferência é necessária para o sidecar do SageMaker que lida com o WebSocket HTTP/2. O caminho de invocação do modelo deve omitir a barra inicial, pois o SageMaker a adiciona antes de encaminhar a requisição.
Implantando e mantendo o endpoint
O script cria um modelo SageMaker a partir do DLC, uma configuração de endpoint e um endpoint em tempo real. A variável de ambiente SM_VLLM_MODEL informa ao container qual modelo carregar. O script também executa um teste de smoke de streaming e salva o resultado como validation-output.wav:
python deploy_bidi_stream.py \
--endpoint-name vllm-omni-bidi \
--region us-east-1 \
--keep-endpoint
Aguarde até que o endpoint atinja o status InService. A primeira implantação leva mais tempo porque a instância precisa baixar a imagem DLC e os artefatos do modelo.
Iniciando a aplicação Gradio
Execute o cliente Gradio contra o endpoint:
python sagemaker_bidi_tts_client.py \
--endpoint-name vllm-omni-bidi \
--region us-east-1
Abra http://127.0.0.1:6006 no navegador. A opção --share cria um link público do Gradio — mantenha-a desabilitada a menos que esse comportamento seja necessário.
Gerando fala em streaming
Insira um texto, escolha uma voz e um idioma, e clique em Generate speech. O cliente compartilhado abre o stream bidirecional, configura a saída em Modulação por Código de Pulso (PCM) e envia o texto:
await send_json(
stream,
{
"type": "session.config",
"voice": voice,
"language": language,
"response_format": "pcm",
"stream_audio": True,
},
)
await send_json(stream, {"type": "input.text", "text": text})
await send_json(stream, {"type": "input.done"})
O componente de áudio do Gradio reproduz cada chunk de PCM a 24 kHz à medida que o cliente o recebe. O campo de status reporta a contagem de chunks e o total de bytes de áudio.
Removendo os recursos do exemplo
Para evitar cobranças contínuas, interrompa o processo do Gradio e então exclua o endpoint, a configuração do endpoint e o modelo:
python deploy_bidi_stream.py \
--endpoint-name vllm-omni-bidi \
--region us-east-1 \
--delete-endpoint
Confirme que o comando de limpeza reporta a exclusão do endpoint, da configuração do endpoint e do modelo. Se o processo for interrompido antes de a limpeza ser concluída, exclua os recursos pelo console do SageMaker AI ou pela API. Um endpoint de GPU em execução continua gerando cobranças.
O que este exemplo demonstra
Ao implantar um modelo de Texto para Fala (TTS), este tutorial mostra como o DLC vLLM-Omni da AWS no SageMaker AI transmite áudio enquanto o modelo ainda está gerando a resposta. Isso ilustra como os DLCs especializados da AWS suportam modelos multimodais cujos padrões de execução e streaming diferem da geração de texto convencional.
Combinado com o exemplo anterior de fala para texto com vLLM, os dois exemplos mostram caminhos complementares: transmitir áudio do microfone para transcrição e, em seguida, transmitir a resposta em texto da aplicação de volta como fala. A Parte 2 mostrará como usar a mesma família de DLC para geração de imagens e vídeos.
Recursos adicionais
- Guia do desenvolvedor de streaming bidirecional do SageMaker AI
- Documentação do DLC vLLM-Omni
- Repositório AWS Deep Learning Containers
- Exemplos de hospedagem de IA generativa no SageMaker
- Gerar imagens e vídeo com vLLM-Omni no SageMaker AI – Parte 2
Fonte
Build real-time voice applications with vLLM-Omni on SageMaker AI – Part 1 (https://aws.amazon.com/blogs/machine-learning/build-real-time-voice-applications-with-vllm-omni-on-sagemaker-ai-part-1/)
Leave a Reply