Instructions to use fornace-ml/metal-auk with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use fornace-ml/metal-auk with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] hf download fornace-ml/metal-auk --local-dir metal-auk
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
metal-auk: AuK on Apple Silicon
How to run Tencent AuK on a Mac, with the tuning measured on an M5 Max and the quirk list that comes with it.
AuK is a 1.5B speech foundation model for generation and editing, MIT licensed,
released 2026-09-09. Upstream ships an official MLX backend on the
feat/mlx-apple-silicon branch. What is missing upstream is not the backend but the
runner: 21 task presets, length arithmetic, value handling, verification, and the MLX
settings that keep the machine from swapping.
The runner is Fornace/metal-auk, a Python CLI plus a pi skill. It runs standalone, with no pi dependency.
Run it
Fastest route: paste the prompt in docs/INSTALL-PROMPT.md into an agent on the Mac you want to run on. It installs the model, runner, weights and verifier, then proves the install by generating and transcribing a clip. By hand:
git clone https://github.com/Fornace/metal-auk ~/works/repos/metal-auk
git clone -b feat/mlx-apple-silicon https://github.com/Tencent-Hunyuan/AuK.git ~/works/repos/AuK
cd ~/works/repos/AuK
hf download smcleod/AuK-MLX-8bit --local-dir ckpts/mlx-8bit # 7.7 GB, complete bundle
uv venv --python 3.12 && uv pip install --python .venv/bin/python -e ".[mlx]"
uv pip install --python .venv/bin/python jinja2 audioread av mlx-whisper openai \
tencentcloud-sdk-python-asr # undeclared upstream deps
.venv/bin/python ~/works/repos/metal-auk/skills/auk/scripts/auk.py doctor
.venv/bin/python ~/works/repos/metal-auk/skills/auk/scripts/auk.py env
.venv/bin/python ~/works/repos/metal-auk/skills/auk/scripts/auk.py \
say --text "Hello there." --ref voice.wav -o out.wav
Python 3.10 fails on macOS 27: the newest scipy wheel for 3.10 is Mach-O invalid there. Use 3.12.
What was measured
Bound MLX's allocator cache, it is the one real lever
MLX keeps freed buffers and grows that cache without limit. On one 14 s enhancement the cache passed 27 GB and macOS compressed and swapped. Interleaved runs in a single process, four runs each:
| MLX cache | 14 s enhance | memory swapped |
|---|---|---|
| unbounded | 26.2, 28.2, 28.1, 28.7 s | 13.5 GB |
| 2 GB | 8.4, 21.4, 23.5, 26.6 s | 0.9 GB |
| 4 GB, the default | 7.4, 7.7, 7.7, 7.5 s | 0.04 GB |
3.7x faster, and the spread collapses from 2.5 s to 0.04 s. Process footprint drops from
about 30 GB to 2 to 5 GB. Set it with --cache-limit GB or AUK_MLX_CACHE_LIMIT.
Cold kernels, warm jobs
Warm steady state for a 2.2 s voice clone is 0.7 to 0.8 s. The first jobs in a fresh process measured 5.6, 5.2 and 3.2 s, because Metal compiles kernels per shape on first use. Warm per stage: Thinker 0.28 s, layer fusion 6 ms, DiT 0.24 s, VAE decode 0.18 s. The VAE decode is the long-clip cost, roughly RTF 0.09 at 2 s against 0.33 at 14 s.
A DiT step costs 61 ms for 1.75B parameters at 288 text tokens, which matches the 39 TFLOPS this GPU sustains on a 4096 cubed bf16 matmul. The DiT is not the bottleneck.
Checked and already optimal
- The port already uses
mx.fast.scaled_dot_product_attention,mx.fast.rms_norm,mx.fast.ropeandmx.fast.layer_norm. - The audio tower slices the 30000 frame padded mel to the 995 real frames before the GPU.
- bf16 is not the lever: 0.71 ms against 0.66 ms for a quantized 128x4096x4096 matmul, and 22.9 ms against 22.7 ms for a whole DiT step.
mx.compileon the VAE decode is slower, 6.8 s against 4.7 s for 14 s.- bf16 VAE weights and latents: 1.1x at 2 s, nothing at 14 s, correlation 0.996.
Quantization
8-bit group 64 is the right default. The 32-step base variant correlates 0.92 with the
4-step flash distill on the same input at 4 times the cost, so flash is the default and
--variant base is for the restoration family, where it measurably helps. Upstream
measured 8-bit against fp32 at a waveform correlation of 0.989 with identical
transcripts, and 4-bit degrades Chinese.
Restoring bad audio
enhance is the instruction for the common case, a recording with room and noise. On a
clean 14 s clip degraded with a 0.6 s convolution reverb, pink noise and a 6.5 kHz low
pass:
| input | after enhance |
|
|---|---|---|
| noise floor | -89 dBFS | -120 dBFS |
| room after speech stops | 11 dB below the voice | 43 dB below, exact digital silence |
| transcript | 100% | 100% |
Cleaning instructions gate 33 to 39% of output frames to exact digital silence, so file
RMS is a misleading way to compare input and output. They are also not idempotent: on
audio that was already clean, enhance returned the voice 21.3 dB quieter and 7 times
brighter above 4 kHz. Run it on audio that needs it and pass --match-level.
The instruction names promise more specialization than exists: enhance and
enhance --cleanup dereverb returned identical audio (correlation 0.999), and
--cleanup denoise matched quality (0.997) while differing from both (0.06).
Verification
auk verify transcribes with Orukeet (Parakeet TDT 0.6B v3 finetune, q8 GGUF on Metal,
0.15 s per clip against about 2 s for whisper-large-v3-turbo) and reports what a
transcript cannot show: noise floor, room level after each speech offset, voiced frame
fraction for separation, and energy above 4 kHz for bandwidth extension. Chinese keeps a
whisper fallback.
Two upstream bugs
pe.config.yamlshipswhisper.to_normal_target_rms: 0.000707945784384138, which is exactly 10^(-63/20), a dBFS value pasted into an RMS field. Every whisper-to-normal job through the Prompt Enhancer rendered at -63 dBFS. The runner detects it, compensates, and prints the correction.- A content replace should not change clip length. Scaling the target by the phrase ratio made the model repeat the new phrase at 1.19x and garble the tail at 0.96x on a real 13.3 s clip. At the source length the same edits came back clean.
Weights
This repo hosts no tensors. The complete runnable bundles today:
| bundle | precision | complete |
|---|---|---|
smcleod/AuK-MLX-8bit |
8-bit, both variants, plus fusion and processor files | yes |
tencent/AuK, tencent/AuK-Flash |
source, needs the MLX conversion step | yes |
vanch007/AuK-Base-MLX, AuK-Flash-MLX |
full precision DiT and VAE | no Thinker, no fusion files |
A complete full-precision MLX bundle, which would make the quality path practical without a source conversion, is not published. Ask in the GitHub repo if you want it.
License
The runner and these measurements are MIT. AuK and its MLX backend are Tencent's, MIT. The Thinker and audio tower derive from Qwen2.5-Omni-3B, which carries Qwen's research license. Orukeet, used for verification, is its own project.
Model tree for fornace-ml/metal-auk
Base model
tencent/AuK