--- 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`.