--- license: cc-by-4.0 language: [en] tags: [automatic-speech-recognition, onnx, onnx-asr, speech-llm, salm, fastconformer, canary, qwen3] base_model: nvidia/canary-qwen-2.5b library_name: onnx-asr --- # Canary-Qwen-2.5B — ONNX (speech-llm) ONNX export of [nvidia/canary-qwen-2.5b](https://huggingface.co/nvidia/canary-qwen-2.5b) for [onnx-asr](https://github.com/istupakov/onnx-asr) with the `speech-llm` model type. The source model is a NeMo SALM: a FastConformer encoder (32 layers, `d_model` 1024, 8x subsampling) with a linear projection into the embedding space of an unmodified Qwen3-1.7B decoder. It tops the Open ASR Leaderboard for English. Model and weights are by NVIDIA, released under CC-BY-4.0. ## Requirements This export needs the `speech-llm` model family, which is not in upstream onnx-asr yet: * branch [`feat/speech-llm-canary`](https://github.com/TigreGotico/onnx-asr/tree/feat/speech-llm-canary) of the TigreGotico fork. The stock code of [PR #3](https://github.com/TigreGotico/onnx-asr/pull/3) is **not** enough: the NeMo encoder graph takes the feature length and returns the embedding length, which PR #3 does not pass. ```sh pip install "onnx-asr @ git+https://github.com/TigreGotico/onnx-asr@feat/speech-llm-canary" ``` ## Usage ```python import onnx_asr model = onnx_asr.load_model("speech-llm", "path/to/this/repo") # or quantization="int8" print(model.recognize("audio_16khz.wav")) ``` ## Graph layout | Graph | Inputs | Outputs | | --- | --- | --- | | `encoder.onnx` | `input_features` `(1, 128, T)`, `input_features_lens` `(1,)` | `audio_embeds` `(1, L, 2048)`, `audio_embeds_lens` `(1,)` | | `embed_tokens.onnx` | `input_ids` `(1, S)` | `inputs_embeds` `(1, S, 2048)` | | `decoder.onnx` | `inputs_embeds`, `attn_bias`, `position_ids`, `past_key_values.{0..27}.{key,value}` `(1, 8, P, 128)` | `logits`, `present.{0..27}.{key,value}` | `decoder.onnx` is a merged prefill and decode graph; a zero-length past is valid, so there is no `use_cache_branch`. The chat-template prompt token ids (`Transcribe the following: