QwenCleo-ASR GGUF
Egyptian Arabic & code-switching speech recognition for audio.cpp: 3–4× faster than PyTorch on the same GPU, no Python
These are standalone GGUF packages of QwenCleo-ASR,
a Qwen3-ASR-1.7B fine-tune for Egyptian Arabic and Arabic↔English code-switching
(فبتديك كل ال soft skills بشكل indirect). On the author's 3,699-utterance Egyptian test set it
reaches 19.85% WER, against 41.51% for base Qwen3-ASR-1.7B. Full results are on the
original model card.
In audio.cpp it runs through the existing qwen3_asr family, the same C++ runtime and options as
Qwen3-ASR: offline and streaming modes, long-audio chunking, word timestamps with Qwen3 Forced Aligner,
and the OpenAI-compatible server.
📦 Files
| File | Type | Size | Notes |
|---|---|---|---|
qwencleo-asr-q8_0.gguf |
Q8_0 | 2.31 GiB | Recommended. Fastest, ~3.4 GB VRAM |
qwencleo-asr-f16.gguf |
F16 | 3.81 GiB | ~5.0 GB VRAM |
Each file embeds the tokenizer, processor, config files and the audio.cpp model spec, so one file is all you need.
🚀 Usage
Build audio.cpp (Linux · Windows · macOS), then:
# install through the audio.cpp model manager (or download the .gguf directly)
audiocpp_model_manager install qwencleo_asr_q8_0 --models-dir models
audiocpp_cli --task asr --family qwen3_asr --model models/QwenCleo-ASR-GGUF --backend cuda \
--audio speech.wav --language Arabic --text "" --text-out transcript.txt
- Pass
--language Arabic. Quantized packages are less reliable at automatic language detection. - Any sample rate works, because audio is resampled internally. Long recordings are chunked automatically.
- Streaming:
--mode streaming --request-option audio_chunk_seconds=5.
OpenAI-compatible server:
{ "models": [{ "id": "qwencleo", "family": "qwen3_asr",
"path": "models/QwenCleo-ASR-GGUF/qwencleo-asr-q8_0.gguf", "task": "asr" }] }
curl http://127.0.0.1:8080/v1/audio/transcriptions -F model=qwencleo -F language=Arabic -F file=@speech.wav
⚡ Speed: original PyTorch vs. audio.cpp
Same model, same GPU, same 16 Egyptian Arabic clips (75 s of audio: short lines, questions, code-switching, numbers, and a 22 s paragraph). Each runtime first loaded the model and ran one warm-up, then timed every clip.
- PyTorch: the official
qwencleo-asrpackage (transformers backend), torch 2.11 + CUDA 12.6. - audio.cpp: a long-lived
audiocpp_serversession. - Hardware: GTX 1660 Ti Laptop 6 GB (Turing, no tensor cores), WSL2.
RTF is processing time divided by audio length; lower is faster.
| Runtime | Precision | RTF | Mean latency / clip | Speed-up | Peak VRAM |
|---|---|---|---|---|---|
PyTorch qwencleo-asr |
bf16 (package default) | 0.557 | 2.62 s | 1.0× | ~4.4 GB |
PyTorch qwencleo-asr |
fp16 | 0.810 | 3.81 s | 0.7× | ~4.4 GB |
| audio.cpp | F16 GGUF | 0.301 | 1.42 s | 1.8× | ~5.0 GB |
| audio.cpp | Q8_0 GGUF | 0.177 | 0.84 s | 3.1× | ~3.4 GB |
| audio.cpp, GTX 16xx MMQ build ¹ | Q8_0 GGUF | 0.143 | 0.68 s | 3.9× | ~3.4 GB |
- Cold start on this machine, with both runtimes reading from the same Windows drive: audio.cpp was ready in ~40 s, while PyTorch took 12–18 min to load the 4 GB safetensors in a 7.6 GB WSL VM.
- Speed and memory stay flat across a long-lived session: 33 consecutive requests ran at the same speed with identical output.
- ¹
-DCMAKE_CUDA_ARCHITECTURES="61-virtual;80-virtual" -DGGML_CUDA_FORCE_MMQ=ON. This is what ggml recommends for GTX 16xx cards. On GPUs with tensor cores, both runtimes are faster.
🎯 Output parity with PyTorch
These are transcripts of the same 16 clips, scored against the spoken text with Egyptian-aware normalization (diacritics and أ/إ/آ, ى/ي, ة/ه spelling variants ignored):
| Runtime | WER | CER |
|---|---|---|
| PyTorch bf16 | 8.8% | 3.8% |
| PyTorch fp16 | 9.3% | 4.4% |
| audio.cpp F16 | 10.6% | 4.7% |
| audio.cpp Q8_0 | 10.2% | 4.8% |
audio.cpp F16 and PyTorch bf16 give identical transcripts on 10 of 16 clips. The other six differ by
one or two words at near-tied tokens, which is normal floating-point drift between runtimes, and the
differences go both ways. For example, audio.cpp gets بيتعبني right where PyTorch wrote بيعبدي,
while PyTorch is right on ملوخية. A 16-clip set is small, so treat differences under ~2 points as noise.
⚠️ Limitations
- Tuned for Egyptian Arabic and code-switching. Other dialects and noisy far-field audio may degrade.
- Numbers are usually written as digits (
3:30,20), as in the training transcripts.
📜 License & credits
- QwenCleo-ASR: Apache-2.0, by Mohammed Aly. Base model: Qwen/Qwen3-ASR-1.7B (Apache-2.0).
- Runtime: audio.cpp by @0xShug0.
Conversion:
audiocpp_gguf --type q8_0|f16 --family qwen3_asr.
@misc{qwencleo_asr_2026,
title = {QwenCleo-ASR: Egyptian Arabic and Code-Switching Speech Recognition},
author = {Mohammed Aly},
year = {2026},
url = {https://huggingface.co/mohammedaly22/QwenCleo-ASR}
}