3.5 KiB
Realtime Audio WebSocket API
As a companion to the vLLM-Omni-proprietary fullduplex /v1/realtime,
supported models also provide a /v1/realtime handler supporting
a substantial subset of the OpenAI /v1/realtime API supporting
audio streaming, client-driven VAD, and tool calling
Quick Start
The endpoint is currently only supported for Qwen3-Omni. To start:
Start vLLM-Omni with port 8000 bound to an address reachable from Docker:
vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8000 --host 0.0.0.0
Then start the docker compose:
cd examples/online_serving/qwen3_omni/fullduplex-livekit-frontend
VLLM_OMNI_HOST=$VLLM_OMNI_HOST docker compose up --build
Where VLLM_OMNI_HOST is a network address. If vLLM-Omni is running on localhost, use
host.docker.internal
Open http://localhost:3000 and begin chatting.
Protocol
Messages in both directions are JSON text frames. Audio carried inside an event is base64-encoded raw PCM16.
| Direction | Event | Purpose |
|---|---|---|
| Server to client | session.created |
Confirms that the WebSocket connection is ready |
| Client to server | session.update |
Selects and validates the served model. Configures system prompt and tools |
| Client to server | input_audio_buffer.append |
Appends base64 PCM16 audio |
| Client to server | input_audio_buffer.commit |
Starts generation over the incoming stream |
| Server to client | transcription.delta |
Carries incremental response text |
| Server to client | transcription.done |
Carries final text and token usage |
| Server to client | response.output_audio.delta |
Carries incremental PCM16 response audio |
| Server to client | response.output_audio.done |
Marks the end of response audio |
| Server to client | error |
Reports an invalid event, model, or audio payload |
A minimal client sends events in this order:
{"type":"input_audio_buffer.append","audio":"<base64-pcm16>"},
{"type":"input_audio_buffer.commit"}
This OpenAI-compatible streaming path is distinct from the vLLM-Omni-proprietary
lane and as such is reached via different configuration. The vLLM-Omni-proprietary
path must be specified explicitly via "duplex=1|true|on" as the WS query parameter
or via an explicit configuration in the deploy_config. The OpenAI path simply replaces
the default /v1/realtime handler in all supported models.
Audio Handling
- Input is mono PCM16 at 16 kHz for the Qwen3-Omni example.
response.output_audio.delta.audiocontains base64-encoded PCM16 bytes.- Read
sample_rate_hzfrom each audio event instead of assuming an output rate. Qwen3-Omni output is typically 24 kHz. - Concatenate audio deltas in receive order to construct the output waveform.
Availability and Limitations
The path is registered on the unified API server, but it is usable only when
the loaded pipeline implements realtime audio input and produces compatible
audio output. Unsupported deployments return an error event. The endpoint
does not provide duplex session resume, playback acknowledgement, overlap
policy, or barge-in controls internally. Those must be driven by the client application
via the relevant WS events (e.g. response.cancel, conversation.item.truncate)
See the Qwen3-Omni online serving example for concurrency options, chunk pacing, and per-delta audio debugging.