canary-1b-v2-coreml / README.md
alexwengg's picture
Add canary-1b-v2 CoreML (int4 ANE + projection + preprocessor + vocab)
75c1b53 verified
|
Raw
History Blame Contribute Delete
2.7 kB
---
license: cc-by-4.0
language:
- en
- de
- es
- fr
library_name: coreml
tags:
- coreml
- apple-silicon
- ane
- automatic-speech-recognition
- canary
- attention-encoder-decoder
- aed
- fluidaudio
base_model: nvidia/canary-1b-v2
base_model_relation: quantized
pipeline_tag: automatic-speech-recognition
---
# Canary-1B-v2 — CoreML (ANE)
CoreML conversion of [`nvidia/canary-1b-v2`](https://huggingface.co/nvidia/canary-1b-v2)
for Apple Silicon / Neural Engine, packaged for [FluidAudio](https://github.com/FluidInference/FluidAudio).
Canary is a **FastConformer encoder + Transformer attention encoder-decoder (AED)**
ASR model (25 European languages, 16384-token SentencePiece BPE). It is decoded
autoregressively: the transformer decoder cross-attends to the encoder output and
emits tokens greedily until EOS (id 3), with a 1024→16384 projection head.
## Files
| File | Role | Precision |
|------|------|-----------|
| `Preprocessor.mlmodelc` | waveform `[1,240000]` → mel `[1,128,1501]` | fp32 (CPU) |
| `EncoderInt4.mlmodelc` | mel → encoder `[1,1024,188]` | int4 (ANE, iOS18) |
| `DecoderInt4.mlmodelc` | autoregressive transformer → hidden `[1,256,1024]` | int4 (ANE, iOS18) |
| `Projection.mlmodelc` | hidden `[1,1024]` → logits `[1,16384]` | fp16 (ANE) |
| `vocab.json` | 16384 SentencePiece pieces (`id → piece`) | — |
| `projection_weights.npz` | raw projection weights (for Python reference pipelines) | fp32 |
| `metadata.json` | shapes, sample rate, special token ids | — |
**Contract:** 15 s window (240000 samples @ 16 kHz), 256 decoder steps,
`eos=3`, `pad=2`, `bos=4`. int4 weight payloads require **iOS 18 / macOS 15**.
## Variants
- **int4** (this default): ANE-runnable, ~573 MB, fastest. Per-block-32 symmetric.
- **fp16**: exact parity with PyTorch, iOS 17, ~1.8 GB (not included here by default).
- int8 per-channel decodes correctly only on CPU (crashes the GPU/ANE MPSGraph
backend), so it is not recommended; use int4 for an ANE-resident small build.
## Accuracy / speed (LibriSpeech test-clean, ≤15 s, int4, M-series ANE)
| Metric | Value |
|--------|-------|
| WER | ~2.1% |
| RTFx | ~7x |
fp16 CoreML output is byte-identical to the NeMo PyTorch greedy decode.
## Usage (FluidAudio)
```swift
let manager = try await CanaryManager.load(precision: .int4)
let text = try await manager.transcribe(audioURL: url)
```
## Conversion
See the [mobius](https://github.com/FluidInference/mobius) conversion pipeline
(`models/stt/canary-1b-v2/coreml/`): `convert-coreml.py` (NeMo→CoreML),
`quantize_int4.py`, `build_projection.py`, `validate.py`, `stage_hf.py`.
## License
Inherits `cc-by-4.0` from the base model `nvidia/canary-1b-v2`.