Qwen3-ASR speech-to-text inference on Apple Silicon via MLX
Project description
qwen3-asr-mlx
Qwen3-ASR speech-to-text inference on Apple Silicon via MLX.
An MLX implementation of the Qwen3-ASR 1.7B pipeline, with no PyTorch or transformers dependency.
This package provides inference code only. Model weights are developed by Qwen Team, Alibaba Cloud under the Apache 2.0 license and downloaded separately from HuggingFace Hub on first use.
Quick Start
Apple Silicon required. Python 3.10–3.13, MLX 0.31+.
pip install qwen3-asr-mlx
from qwen3_asr_mlx import Qwen3ASR
model = Qwen3ASR.from_pretrained("mlx-community/Qwen3-ASR-1.7B-bf16")
result = model.transcribe("audio.wav")
print(result.text) # "Hello, world."
print(result.language) # "English"
print(result.duration) # 3.2
Model weights download automatically from HuggingFace Hub on first use.
Features
- On-device via MLX. No server, no network during inference.
- No PyTorch or transformers dependency.
- Audio formats via soundfile (WAV, FLAC, MP3, etc.)
- Automatic language detection from model output.
- Greedy and sampling-based decoding with repetition penalty, top-k, and nucleus sampling.
- Thread-safe with internal lock for concurrent callers.
- Long audio support with automatic chunking at low-energy boundaries (up to 20 minutes).
- Context manager for resource cleanup.
API
Qwen3ASR.from_pretrained(model_id_or_path, **kwargs)
Load a model from a local directory or the HuggingFace Hub.
model = Qwen3ASR.from_pretrained("mlx-community/Qwen3-ASR-1.7B-bf16")
# or from a local path
model = Qwen3ASR.from_pretrained("/path/to/model")
model.transcribe(audio, **kwargs) -> TranscriptionResult
Transcribe audio to text.
| Parameter | Type | Default | Description |
|---|---|---|---|
audio |
str, Path, or np.ndarray |
required | File path or float32 numpy array at 16 kHz mono |
language |
str or None |
None |
Optional language hint (ISO 639-1 code or full name). None lets the model detect the language. |
temperature |
float |
0.0 |
Sampling temperature; 0.0 = greedy |
top_p |
float |
1.0 |
Nucleus sampling threshold |
top_k |
int |
0 |
Top-k cutoff (0 = disabled) |
repetition_penalty |
float |
1.2 |
Penalty for repeated tokens |
max_tokens |
int or None |
None |
Max output tokens; auto-computed from duration when None |
chunk_duration |
float |
1200.0 |
Max seconds per chunk; longer audio is split automatically |
model.warm_up()
Run a short dummy inference to pre-compile the MLX compute graph. Eliminates the latency spike on the first real transcription.
model.close()
Release model weights and free memory. Called automatically when using the context manager.
with Qwen3ASR.from_pretrained("mlx-community/Qwen3-ASR-1.7B-bf16") as model:
result = model.transcribe("audio.wav")
TranscriptionResult
@dataclass
class TranscriptionResult:
text: str # clean transcription
language: str # detected language (e.g. "English")
duration: float # audio duration in seconds
Architecture
Audio (WAV/FLAC/MP3/ndarray)
│
▼
Mel Spectrogram (128-bin, numpy STFT, Slaney filterbank)
│
▼
Audio Encoder (Conv2D stem → 24-layer transformer → projection)
│
▼
Text Decoder (28-layer Qwen3, GQA 16Q/8KV, QK-norm, SwiGLU, RoPE)
│
▼
TranscriptionResult { text, language, duration }
Requirements
- Apple Silicon Mac (M1 or later)
- macOS 13+
- Python 3.10–3.13
- MLX 0.31+
Development
git clone https://github.com/gabrimatic/qwen3-asr-mlx.git
cd qwen3-asr-mlx
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
python -m pytest tests/ -v
Skip model-loading tests with -m "not slow".
Credits
Qwen3-ASR by Qwen Team, Alibaba Cloud · MLX by Apple · Model weights from mlx-community
Legal notices
Model License
This package provides inference code only. It does not include model weights.
The Qwen3-ASR model weights are developed by Qwen Team, Alibaba Cloud and released under the Apache License 2.0. The bf16 MLX conversion is hosted by mlx-community under the same license. By downloading and using the model weights, you agree to the terms of the Apache 2.0 license.
Trademarks
"Qwen" and "Tongyi Qianwen" are trademarks of Alibaba Cloud. "MLX" is a trademark of Apple Inc. "HuggingFace" is a trademark of Hugging Face, Inc.
This project is not affiliated with, endorsed by, or sponsored by Alibaba Cloud, Apple, Hugging Face, or any other trademark holder. All trademark names are used solely to describe compatibility with their respective technologies.
Third-Party Licenses
This project depends on:
| Package | License |
|---|---|
| mlx | MIT |
| numpy | BSD-3-Clause |
| tokenizers | Apache-2.0 |
| huggingface-hub | Apache-2.0 |
| soundfile | BSD-3-Clause |
License
This inference code is released under the MIT License. See LICENSE for details.
The model weights have their own license (Apache 2.0). See Model License above.
Created by Soroush Yousefpour
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qwen3_asr_mlx-0.1.1.tar.gz.
File metadata
- Download URL: qwen3_asr_mlx-0.1.1.tar.gz
- Upload date:
- Size: 40.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
112afce78d303d32c801ede0fcea7cd0824bb25ef216bad755c6b3dadbcaaed4
|
|
| MD5 |
c9004031a0369e5a80324113e8bfdef1
|
|
| BLAKE2b-256 |
051a5ebdb2a95a257967804c310fc5bbf951f4deef63117f16671b4e87130d83
|
Provenance
The following attestation bundles were made for qwen3_asr_mlx-0.1.1.tar.gz:
Publisher:
publish.yml on gabrimatic/qwen3-asr-mlx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qwen3_asr_mlx-0.1.1.tar.gz -
Subject digest:
112afce78d303d32c801ede0fcea7cd0824bb25ef216bad755c6b3dadbcaaed4 - Sigstore transparency entry: 1520663770
- Sigstore integration time:
-
Permalink:
gabrimatic/qwen3-asr-mlx@429730f1e2bfa0f5d213bc298e29c2a5ac1c6640 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/gabrimatic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@429730f1e2bfa0f5d213bc298e29c2a5ac1c6640 -
Trigger Event:
release
-
Statement type:
File details
Details for the file qwen3_asr_mlx-0.1.1-py3-none-any.whl.
File metadata
- Download URL: qwen3_asr_mlx-0.1.1-py3-none-any.whl
- Upload date:
- Size: 27.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e962e99dba1fc27d6fc12e64be52632ea6502dce82b761f00a852975c9391e32
|
|
| MD5 |
22dc984010b49fd90237ce5883442597
|
|
| BLAKE2b-256 |
adeb50b76eedf6afdc62749e16b51b090518ca6b5e846c62c82b7c447671846b
|
Provenance
The following attestation bundles were made for qwen3_asr_mlx-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on gabrimatic/qwen3-asr-mlx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qwen3_asr_mlx-0.1.1-py3-none-any.whl -
Subject digest:
e962e99dba1fc27d6fc12e64be52632ea6502dce82b761f00a852975c9391e32 - Sigstore transparency entry: 1520663846
- Sigstore integration time:
-
Permalink:
gabrimatic/qwen3-asr-mlx@429730f1e2bfa0f5d213bc298e29c2a5ac1c6640 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/gabrimatic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@429730f1e2bfa0f5d213bc298e29c2a5ac1c6640 -
Trigger Event:
release
-
Statement type: