Construindo aplicações de voz em tempo real com vLLM-Omni no SageMaker AI – Parte 1

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.xlarge ou ml.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

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/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *