> This page is for version 26.07 · v1.3.0.
> For other versions, use one of these documentation indexes:
> - Latest · v1.4.0 (26.09) (default): https://docs.nvidia.com/nemo/curator/latest/llms.txt
> - Main · preview: https://docs.nvidia.com/nemo/curator/main/llms.txt
> - 26.09 · v1.4.0: https://docs.nvidia.com/nemo/curator/v26.09/llms.txt
> - 26.07 · v1.3.0: https://docs.nvidia.com/nemo/curator/v26.07/llms.txt
> - 26.04 · v1.2.0: https://docs.nvidia.com/nemo/curator/v26.04/llms.txt
> - 26.02 · v1.1.0: https://docs.nvidia.com/nemo/curator/v26.02/llms.txt
> - 25.09 · v1.0.0: https://docs.nvidia.com/nemo/curator/v25.09/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/curator/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/curator/_mcp/server.

# nemo_curator.models.asr.qwen_omni

Qwen3-Omni ASR adapter using in-process vLLM.

## Module Contents

### Classes

| Name                                                                          | Description                                             |
| ----------------------------------------------------------------------------- | ------------------------------------------------------- |
| [`QwenOmniASRAdapter`](#nemo_curator-models-asr-qwen_omni-QwenOmniASRAdapter) | Qwen3-Omni in-process vLLM adapter (thinker-only path). |

### Functions

| Name                                                                                      | Description                                                          |
| ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| [`_default_sampling_kwargs`](#nemo_curator-models-asr-qwen_omni-_default_sampling_kwargs) | Return Qwen-Omni defaults forwarded to vLLM `SamplingParams`.        |
| [`_default_vllm_kwargs`](#nemo_curator-models-asr-qwen_omni-_default_vllm_kwargs)         | Return Qwen-Omni defaults forwarded to Curator's shared vLLM helper. |
| [`_require_qwen_omni_stack`](#nemo_curator-models-asr-qwen_omni-_require_qwen_omni_stack) | Raise a single ImportError listing missing Qwen-Omni dependencies.   |

### Data

[`_MIN_QWEN_AUDIO_SAMPLES`](#nemo_curator-models-asr-qwen_omni-_MIN_QWEN_AUDIO_SAMPLES)

[`_PROMPT_CONTENT_ORDERS`](#nemo_curator-models-asr-qwen_omni-_PROMPT_CONTENT_ORDERS)

[`_QWEN3_OMNI_MODEL_ID`](#nemo_curator-models-asr-qwen_omni-_QWEN3_OMNI_MODEL_ID)

[`_QWEN_OMNI_SAMPLE_RATE`](#nemo_curator-models-asr-qwen_omni-_QWEN_OMNI_SAMPLE_RATE)

### API

```python
class nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter(
    model_id: str = _QWEN3_OMNI_MODEL_ID,
    revision: str | None = None,
    prompt_text: str = 'Transcribe the audio.',
    prompt_file: str | None = None,
    en_prompt_text: str | None = None,
    en_prompt_file: str | None = None,
    system_prompt: str | None = None,
    system_prompt_file: str | None = None,
    prompt_content_order: str = 'text_audio',
    max_output_tokens: int = 256,
    vllm_kwargs: dict[str, typing.Any] = _default_vllm_kwargs(),
    sampling_kwargs: dict[str, typing.Any] = _default_sampling_kwargs()
)
```

Dataclass

Qwen3-Omni in-process vLLM adapter (thinker-only path).

`ASRStage` supplies `model_id` plus this adapter's explicitly configured
`adapter_kwargs`. Hugging Face `revision` pinning therefore remains a
Qwen adapter capability rather than part of the shared ASR stage contract.

Notable Args:
prompt\_text / \*\_file: User prompt; `&#123;language&#125;` is interpolated
per-item when the stage supplies a language. `*_file` variants
load text from a UTF-8 file at `__post_init__` time.
en\_prompt\_text / en\_prompt\_file: override used when language is
`"English"`.
system\_prompt / \*\_file: optional system message.
prompt\_content\_order: order of text and audio blocks in each user
message. `audio_text` matches Qwen's official ASR cookbook.
max\_output\_tokens: maximum transcription tokens. Kept separate so the
adapter remains the only source of `SamplingParams.max_tokens`.
vllm\_kwargs: engine settings forwarded to Curator's shared
`create_vllm_llm` helper. `model` and `revision` have
dedicated adapter fields, while `tensor_parallel_size` comes
from the stage's GPU allocation; none can be overridden here.
sampling\_kwargs: settings forwarded to vLLM `SamplingParams`.
`max_tokens` is adapter-owned and cannot be overridden.

**`en_prompt_file`** `str | None = None`

---

**`en_prompt_text`** `str | None = None`

---

**`max_output_tokens`** `int = 256`

---

**`model_id`** `str = _QWEN3_OMNI_MODEL_ID`

---

**`prompt_content_order`** `str = 'text_audio'`

---

**`prompt_file`** `str | None = None`

---

**`prompt_text`** `str = 'Transcribe the audio.'`

---

**`revision`** `str | None = None`

---

**`sampling_kwargs`** `dict[str, Any] = field(default_factory=_default_sampling_kwargs)`

---

**`system_prompt`** `str | None = None`

---

**`system_prompt_file`** `str | None = None`

---

**`vllm_kwargs`** `dict[str, Any] = field(default_factory=_default_vllm_kwargs)`

---

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter.__post_init__() -> None
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._adapter_owned_vllm_kwargs(
    num_gpus: int | None
) -> dict[str, typing.Any]
```

Return vLLM arguments controlled by adapter fields and the allocated GPU count.

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._build_audio_prompt_messages(
    waveform: numpy.ndarray,
    language: str | None = None
) -> list[dict[str, typing.Any]]
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._build_messages(
    waveform: numpy.ndarray,
    language: str | None = None
) -> list[dict[str, typing.Any]]
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._first_output_text(
    output: typing.Any
) -> str
```

staticmethod

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._generate(
    prompts: list[typing.Any]
) -> list[typing.Any]
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._get_prompt_text(
    language: str | None
) -> str
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._infer_batch(
    inputs: list[dict[str, typing.Any]],
    indices: list[int],
    n: int
) -> list[str]
```

Run one vLLM batch and scatter its texts back to input order.

`indices[k]` is the position in the length-`n` batch that
`inputs[k]` came from.

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._load_text(
    text: str | None,
    file_path: str | None
) -> str | None
```

staticmethod

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._pack_vllm_inputs(
    messages: list[dict[str, typing.Any]]
) -> dict[str, typing.Any]
```

Render chat `messages` into a vLLM request dict.

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._prepare_batch(
    waveforms: list[numpy.ndarray],
    languages: list[str | None] | None = None
) -> list[dict[str, typing.Any] | None]
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._prepare_single(
    waveform: numpy.ndarray,
    language: str | None = None
) -> dict[str, typing.Any] | None
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._resolve_prompt(
    template: str,
    language: str | None
) -> str
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter._run_inference(
    waveforms: list[numpy.ndarray],
    languages: list[str | None] | None = None
) -> tuple[list[str], set[int]]
```

Run batched inference on in-memory waveforms.

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter.download_weights_on_node() -> None
```

Cache the model snapshot on local disk without touching the GPU.

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter.load_model(
    num_gpus: int
) -> None
```

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter.transcribe_batch(
    items: list[dict[str, typing.Any]]
) -> list[nemo_curator.models.asr.base.ASRResult]
```

Run batched inference over per-task dicts.

Skipped items (empty / unprocessable waveforms) round-trip as
`ASRResult(text="", skipped=True)` to preserve ordering.

```python
nemo_curator.models.asr.qwen_omni.QwenOmniASRAdapter.unload_model() -> None
```

```python
nemo_curator.models.asr.qwen_omni._default_sampling_kwargs() -> dict[str, typing.Any]
```

Return Qwen-Omni defaults forwarded to vLLM `SamplingParams`.

```python
nemo_curator.models.asr.qwen_omni._default_vllm_kwargs() -> dict[str, typing.Any]
```

Return Qwen-Omni defaults forwarded to Curator's shared vLLM helper.

```python
nemo_curator.models.asr.qwen_omni._require_qwen_omni_stack(
    context: str
) -> None
```

Raise a single ImportError listing missing Qwen-Omni dependencies.

```python
nemo_curator.models.asr.qwen_omni._MIN_QWEN_AUDIO_SAMPLES = 1600
```

```python
nemo_curator.models.asr.qwen_omni._PROMPT_CONTENT_ORDERS = frozenset({'text_audio', 'audio_text'})
```

```python
nemo_curator.models.asr.qwen_omni._QWEN3_OMNI_MODEL_ID = 'Qwen/Qwen3-Omni-30B-A3B-Instruct'
```

```python
nemo_curator.models.asr.qwen_omni._QWEN_OMNI_SAMPLE_RATE = 16000
```