| --- |
| license: mit |
| license_link: https://huggingface.co/microsoft/Phi-4-multimodal-instruct/resolve/main/LICENSE |
| base_model: |
| - microsoft/Phi-4-multimodal-instruct |
| tags: |
| - automatic-speech-recognition |
| - onnx |
| - onnx-asr |
| - speech-llm |
| - phi-4 |
| language: |
| - en |
| - zh |
| - de |
| - fr |
| - it |
| - ja |
| - es |
| - pt |
| library_name: onnx-asr |
| pipeline_tag: automatic-speech-recognition |
| --- |
| |
| # Phi-4-multimodal-instruct, audio-to-text carve-out, ONNX |
|
|
| This repository holds **only the speech transcription path** of |
| [`microsoft/Phi-4-multimodal-instruct`](https://huggingface.co/microsoft/Phi-4-multimodal-instruct), |
| exported to ONNX for [onnx-asr](https://github.com/TigreGotico/onnx-asr). |
|
|
| The source model is a full multimodal LLM: a conformer audio encoder and a |
| SigLIP vision tower share one Phi-4-mini language model, which is specialised |
| at run time by a vision LoRA adapter or a speech LoRA adapter. This export |
| takes the audio branch only: |
|
|
| * the **speech LoRA adapter is merged** into the language model, proven |
| character-identical to the adapter path on four FLEURS clips before export; |
| * the **vision tower, the vision LoRA adapter and the vision audio projector |
| are dropped entirely**. |
|
|
| This is an audio-only carve-out. It transcribes speech. It cannot see images, |
| answer questions, translate or hold a conversation. |
|
|
| Original model by **Microsoft**, MIT licence. This export keeps that licence. |
| See [`REPORT.md`](REPORT.md) for the full export record, the merge proof, the |
| numerical error bounds and the deviations. |
|
|
| ## Usage |
|
|
| The model loads on the `feat/speech-llm-qwen3-asr` branch of the TigreGotico |
| onnx-asr fork. **No runtime changes were needed**: the export is entirely |
| config-driven. |
|
|
| ```bash |
| pip install "onnx-asr @ git+https://github.com/TigreGotico/onnx-asr@feat/speech-llm-qwen3-asr" |
| ``` |
|
|
| ```python |
| import onnx_asr |
| |
| model = onnx_asr.load_model("OpenVoiceOS/phi-4-multimodal-asr-onnx") |
| print(model.recognize("clip.wav")) |
| |
| # roughly 3x faster and 4x smaller |
| model = onnx_asr.load_model("OpenVoiceOS/phi-4-multimodal-asr-onnx", quantization="int8") |
| ``` |
|
|
| ## Languages |
|
|
| Phi-4-multimodal supports eight languages for audio: English, Chinese, German, |
| French, Italian, Japanese, Spanish and Portuguese. Other languages are out of |
| domain. |
|
|
| ## Graphs |
|
|
| | graph | inputs | outputs | |
| | --- | --- | --- | |
| | `encoder.onnx` | `input_features` `(1, N)` f32, raw 16 kHz waveform | `audio_embeds` `(1, L, 3072)` f32 | |
| | `embed_tokens.onnx` | `input_ids` `(1, S)` i64 | `inputs_embeds` `(1, S, 3072)` f32 | |
| | `decoder.onnx` | `inputs_embeds`, `attn_bias`, `position_ids`, 32 KV pairs | `logits`, 32 KV pairs | |
|
|
| The Phi-4-multimodal feature extractor is the nonstandard SpeechLib |
| log-filterbank, so it is **baked into the encoder graph** and the model declares |
| `"preprocessor": "identity"`. The runtime passes the raw waveform straight |
| through. |
|
|
| ## Two things to know |
|
|
| **Roughly 40 s of audio per call.** The upstream conformer switches to a |
| chunked attention path above 500 post-CNN frames, and that branch cannot be |
| expressed in a single ONNX graph. The exported encoder reproduces the unchunked |
| path exactly, which is upstream's own stated design range. Use VAD segmentation |
| for longer audio. |
|
|
| **int8 excludes the encoder.** Quantizing the conformer breaks transcription |
| badly, so `encoder_int8.onnx` is a full-precision copy of `encoder.onnx`. Only |
| `embed_tokens` and `decoder` are actually quantized. The graph-swap evidence is |
| in `REPORT.md`. |
|
|
| ## Parity |
|
|
| ONNX fp32 is character-identical to native transformers on all four FLEURS |
| clips (two English, two Portuguese). The int8 variant is faithful, with small |
| punctuation and article differences on three of the four clips. |
|
|