> This page is for version dev.
> For other versions, use one of these documentation indexes:
> - Latest (v1.6.1) (default): https://docs.dynamo.nvidia.com/dynamo/latest/llms.txt
> - dev: https://docs.dynamo.nvidia.com/dynamo/dev/llms.txt
> - v1.6.1: https://docs.dynamo.nvidia.com/dynamo/v1.6.1/llms.txt
> - v1.6.0: https://docs.dynamo.nvidia.com/dynamo/v1.6.0/llms.txt
> - v1.5.1: https://docs.dynamo.nvidia.com/dynamo/v1.5.1/llms.txt
> - v1.5.0: https://docs.dynamo.nvidia.com/dynamo/v1.5.0/llms.txt
> - v1.4.2: https://docs.dynamo.nvidia.com/dynamo/v1.4.2/llms.txt
> - v1.4.1: https://docs.dynamo.nvidia.com/dynamo/v1.4.1/llms.txt
> - v1.4.0: https://docs.dynamo.nvidia.com/dynamo/v1.4.0/llms.txt
> - v1.3.0: https://docs.dynamo.nvidia.com/dynamo/v1.3.0/llms.txt
> - v1.2.1: https://docs.dynamo.nvidia.com/dynamo/v1.2.1/llms.txt
> - v1.2.0: https://docs.dynamo.nvidia.com/dynamo/v1.2.0/llms.txt
> - v1.1.1: https://docs.dynamo.nvidia.com/dynamo/v1.1.1/llms.txt
> - v1.1.0: https://docs.dynamo.nvidia.com/dynamo/v1.1.0/llms.txt
> - v1.0.2: https://docs.dynamo.nvidia.com/dynamo/v1.0.2/llms.txt
> - v1.0.1: https://docs.dynamo.nvidia.com/dynamo/v1.0.1/llms.txt
> - v1.0.0: https://docs.dynamo.nvidia.com/dynamo/v1.0.0/llms.txt
> - v0.9.1: https://docs.dynamo.nvidia.com/dynamo/v-0-9-1/llms.txt
> - v0.9.0: https://docs.dynamo.nvidia.com/dynamo/v-0-9-0/llms.txt
> - v0.8.1: https://docs.dynamo.nvidia.com/dynamo/v-0-8-1/llms.txt
> - v0.8.0: https://docs.dynamo.nvidia.com/dynamo/v-0-8-0/llms.txt
> - v0.7.1: https://docs.dynamo.nvidia.com/dynamo/v-0-7-1/llms.txt
> - v0.7.0: https://docs.dynamo.nvidia.com/dynamo/v-0-7-0/llms.txt

> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.nvidia.com/dynamo/llms.txt. For full content including API reference and SDK examples, see https://docs.nvidia.com/dynamo/llms-full.txt.

# Speech-to-Speech

A vLLM-Omni model such as Qwen3-Omni can take spoken input and answer with
synthesized speech in one model, instead of a cascaded ASR, LLM, and TTS
pipeline. Clients stream audio over the `/v1/realtime` WebSocket with
`session.type="realtime"` and receive both the response transcript and the
response audio.

<Note>
Before you begin, set up vLLM-Omni as described in
[Voice Pipelines › Set up the backend](/dynamo/dev/speech/voice-pipelines#set-up-the-backend).
</Note>

## Launch

```bash
bash examples/backends/vllm/launch/agg_omni_realtime.sh
```

The launcher serves `Qwen/Qwen3-Omni-30B-A3B-Instruct` with
`python -m dynamo.vllm.omni --realtime --output-modalities audio`. Pass `--model`
to serve a different Omni model.

## Stream Audio

In another terminal, stream an audio file and save the spoken response:

```bash
python examples/backends/vllm/launch/realtime_audio_client.py \
  --session-type realtime \
  --url ws://localhost:8000/v1/realtime \
  --model Qwen/Qwen3-Omni-30B-A3B-Instruct \
  --input-audio question.wav \
  --output-dir dynamo-realtime
```

Omit `--input-audio` to send a short sample clip. The client sends 16 kHz PCM16
audio, prints `response.output_audio_transcript.delta` text as it arrives, and
writes each `response.output_audio.delta` chunk as a WAV file in `--output-dir`.

## Limitations

- Each committed utterance is handled independently. This path does not keep
  multi-turn conversation history; your application must manage it.
- Session recovery across worker failures is not provided.

## Next Steps

- [Voice Pipelines](/dynamo/dev/speech/voice-pipelines): build a cascaded ASR, LLM, and TTS pipeline instead.
- [Text-to-Speech](/dynamo/dev/speech/text-to-speech): synthesize speech from text.