Indic-Transcribe Flex β experimental CoreML port
Built with Indic-Transcribe-flex from Bodhan AI / AI4Bharat.
Derived from NVIDIA Canary-1B-v2. FP16 format conversion; no fine-tuning.
Pinned upstream revision: b16c801cd024215039281b3d79d346ba0a9f57e5.
Flex is a separate checkpoint from Core. It offers native, mixed-script and romanized output. This port's Swift runtime exposes native and mixed-script prompts; Muesli selects mixed script with inverse text normalization for Flex. Hindi words remain in Devanagari and English words can stay in Latin letters. Core instead renders embedded English words in the surrounding native script. Both have automatic language identification and explicit language selection. Flex covers 27 languages, including Chhattisgarhi and Haryanvi.
Validation and limitations
Exported on JarvisLabs and executed locally through native Swift CoreML. Three runs of one 30-second synthetic workplace Hinglish sample exactly matched the upstream FP32 mixed-script transcript. Native inference took 6.54, 5.72 and 5.78 seconds, excluding model load/compilation, on the development Mac. These are smoke-test observations, not multilingual accuracy or latency guarantees. The upstream transcript still made word errors; format conversion preserves those. Untested languages, noisy microphone input and long recordings need evaluation. Automatic language selection may choose the wrong language or script.
Files and runtime
coreml/encoder.mlpackage: acoustic encoder, 101β3001 mel frames.coreml/cross.mlpackage: cached cross-attention projection.coreml/decoder.mlpackage: stateful decoder, 512 cached positions.native-assets/frontend.bin: exact upstream window/filterbank constants.native-assets/tokenizer.json: pieces, native prompts and mixed/ITN prompts.artifacts.json: byte sizes and SHA-256 hashes for downloadable assets.
Requires macOS 15+ and Apple Silicon. The tested configuration uses CPU+GPU.
The Swift frontend consumes 16 kHz mono float32 samples. Runtime calls accept up
to 30 seconds and fail if generation does not finish within 256 new tokens.
Muesli uses 28-second chunks with one-second overlap for longer recordings;
boundary merging remains experimental. A fresh decoder state is created for each
utterance and after automatic language probing. Compiled .mlmodelc files are
created locally and are not distributed. First-use compilation/warmup can be slow.
In Muesli, choose Models β Experimental β Bodhan Flex. Standard cache:
~/.cache/muesli/models/indic-transcribe-flex-coreml. Developer override:
MUESLI_BODHAN_FLEX_MODEL_DIR.
Native harness (supply your own 16 kHz float32 audio and create reports/):
swiftc -O BodhanFrontend.swift BodhanCoreML.swift native_bench.swift -o native_bench
mkdir -p reports
./native_bench "$PWD" your-audio.f32 hi native_flex --mixed
Use auto in place of hi for language identification; omit --mixed for native
script. Export scripts expect the pinned upstream snapshot and a source parity
fixture. Export environment: PyTorch 2.11.0+cu130, transformers 4.57.6,
coremltools 9.0. Evaluation recordings and private fixtures are not distributed.
Attribution
The converted weights retain the unmodified Indic Open Model License v1.0.
The NVIDIA Canary-1B-v2 base is CC BY 4.0. See the included license and NOTICE.md.
Sources: Bodhan Flex, NVIDIA base, companion Core port.
Experimental CoreML + MLX prototype
A standalone MLX decoder variant can reuse this CoreML encoder. It includes decoder weights and a Python benchmark runner; it is not yet the Muesli native backend. See the variant README for measurements and limitations.
- Downloads last month
- -