--- license: other license_name: lfm1.0 license_link: LICENSE base_model: LiquidAI/LFM3-Audio-2B library_name: fluidaudio pipeline_tag: automatic-speech-recognition tags: - coreai - apple-silicon - asr - tts - text-to-speech - on-device --- # LFM3-Audio-2B language model for Core AI The language model of [LiquidAI/LFM3-Audio-2B](https://huggingface.co/LiquidAI/LFM3-Audio-2B) as a Core AI bundle (`.aimodel`, macOS 27 / iOS 27) for [FluidAudio](https://github.com/FluidInference/FluidAudio)'s `LFM3AudioManager` with `backend: .coreAI`, plus the TTS depth decoder. The audio encoder and the codec come from [FluidInference/lfm3-audio-2b-coreml](https://huggingface.co/FluidInference/lfm3-audio-2b-coreml) and stay on Core ML (the codec and the LiveASR encoder run on the Neural Engine there; Core AI has no Neural Engine path on macOS 27.0). This is a modified version of the original model: the backbone was exported to Core AI and quantized (see below). ## Files | File | What | |---|---| | `coreai/LFM3-Audio-u8b32-f16L20-23.aimodel` | LFM3 backbone (2048 x 24) taking `inputs_embeds`; entrypoints `prefill` (state update), `main` (logits of the last row), `hidden` (final-norm hidden of the last row, for speech frames); states `keyCache` / `valueCache` / `convStates`. 2.16 GB | | `coreai/DepthDecoder-fp16-gpu.aimodel` | MaskGIT depth decoder, fp16. FluidAudio runs `depth_frame`: 3 passes + presence penalty, temperature, top-k 128 and Gumbel-max in one call per speech frame (inputs `h`, `sched` [3, 12], `noise` / `present` [12, 2017], `params`; output `codes` [12]). Also has `depth_in`, `depth_pass`, `depth_frame_f32s`. 208 MB | Quantization: asymmetric uint8 weights with block size 32, decoder layers 20-23 kept in fp16. Plain int8 (per channel or per block) is fine for ASR but flips too many speech codes in TTS; the last layers carry most of that error. ## Use (Swift) ```swift import FluidAudio let manager = try await LFM3AudioManager.downloadAndLoad(backend: .coreAI) // macOS 27 / iOS 27 let text = try await manager.transcribe(samples).text let speech = try await manager.synthesize("Hello from Core AI.") ``` FluidAudio loads one `AIModel` per entrypoint, all bound to the same host-owned states: with a single shared `AIModel`, macOS 27.0 aborts in `GPUMemrefOps` ("Failed to resolve dynamic dimensions for memref.alloc") when one function runs twice at consecutive positions with the same row count and another function is then called with the next shape (the first `main` after speech frames in TTS). The first load specializes the graph for the GPU and caches it (~3.3 GB under `~/Library/Caches/coreai-cache`); the system purges the entry under storage pressure or when the bundle changes, and `LFM3AudioModels.clearCoreAICache()` deletes it. ## Parity (vs the original fp32 model) | Check | Result | |---|---| | ASR, 20 golden LibriSpeech clips (greedy) | 18/20 token-identical (2 differ by a comma), WER 1.46% = original | | TTS, 319 teacher-forced speech frames | LM hidden cosine min 0.99988 / mean 0.999985; codes 98.35% identical (fp32 reference depth decoder) | | Depth decoder `depth_frame`, 319 golden frames (injected order and noise) | codes 99.40% identical; 3.24 ms per frame on the GPU | ## Speed and accuracy Apple M5 Pro (24 GB), macOS 27.0, FluidAudio release build; wall time includes warm-up after load. | Task | Data | Result | |---|---|---| | Offline ASR | LibriSpeech test-clean, first 100 utterances (901 s) | WER 1.32%, RTFx 24.6 (Core ML LM: 18.4); 98/100 transcripts identical to the original model | | LiveASR (160 ms pieces) | LibriSpeech test-clean, first 20 utterances | WER 1.46%, RTFx 13.3 (Core ML LM: 10.4) | | TTS (Core AI depth decoder) | 20 phrases (71 s of speech) | RTFx 5.07, first audio 37 ms (median), Parakeet round-trip WER 2.5% (Core ML backend: RTFx 4.3-4.5) | ASR peak memory footprint: 1.9 GB. ## License [LFM Open License v1.0](LICENSE) (Liquid AI). Commercial use by organizations with annual revenue of USD 10 million or more requires a separate license from Liquid AI; see the license for the full terms. ## Changelog | Date | Files | Change | Issue | FluidAudio PR | HF commit | |---|---|---|---|---|---| | 2026-10-29 | `coreai/LFM3-Audio-u8b32-f16L20-23.aimodel` | Initial release: Core AI LM bundle (uint8 b32, layers 20-23 fp16) | [FluidAudio #49](https://github.com/FluidInference/FluidAudio/issues/49#issuecomment-6501658263) | [#1076](https://github.com/FluidInference/FluidAudio/pull/1076) | [e89ebdab](https://huggingface.co/FluidInference/lfm3-audio-2b-coreai/commit/e89ebdabaf2bd52044d753e8c87f9579d5520b72) | | 2026-10-29 | `coreai/DepthDecoder-fp16-gpu.aimodel` | Added the Core AI depth decoder (fused `depth_frame`, TTS RTFx 4.28 -> 5.07) | [FluidAudio #49](https://github.com/FluidInference/FluidAudio/issues/49#issuecomment-6501658263) | [#1076](https://github.com/FluidInference/FluidAudio/pull/1076) | [6dc374f3](https://huggingface.co/FluidInference/lfm3-audio-2b-coreai/commit/6dc374f303e5f04cc6bbc4bd044cdd800b065818) |