# canary-1b-flash → Hexagon NPU (v81) — encoder + AED decoder + recipe NeMo Canary-1B-flash AED ASR ([nvidia/canary-1b-flash](https://huggingface.co/nvidia/canary-1b-flash)) on the Qualcomm Hexagon NPU (**v81 / SM8850 / soc_model 87**). ## Device validation (Samsung S25, Hexagon v81) Both networks self-replicated from the NeMo weights + validated exact offline, compiled to v81 bins: - **`v81/canary_conformer.bin`** (32-layer FastConformer encoder, fp32, 1.65 GB) — on-device raw-I/O parity **cos 0.999029** vs offline. - **`v81/canary_decoder.bin`** (4-layer MBart-like AED transformer decoder, 146 MB) — teacher-forced argmax == gold. - **Full autoregressive device decode** (encoder mem → decoder loop, `canary2` EN-ASR prompt seed) → **" Hey Jarvis." — exact gold match.** ## What's in this bundle - `v81/canary_conformer.bin`, `v81/canary_decoder.bin` — the two QNN context binaries. - `recipe/` — `conformer.py` (encoder), `decoder.py` (AED decoder), `oracle.py` (full pipeline + canary2 multitask prompt + greedy decode). ## Pipeline (NPU vs host) host log-mel(128) → **conformer.bin [NPU]** → host `canary2` prompt seed → **canary_decoder.bin [NPU]** autoregressive AED loop (self+cross-attn KV cache) → detok. A one-command `qhx_asr` AED host-op (adapting `src/hostop/asr_whisper.cpp` to this KV convention) is the productization follow-up; `oracle.py` is the reference decode. Arch-pinned v81. License: nvidia-open-model-license.