IndicConformer per-language ONNX packs (int8, external data)
Nine per-language speech-recognition packs for the Indian languages, prepared for on-device use: 131 MB each, against 622 MB for the 22-language multilingual model they replace.
Derived from AI4Bharat IndicConformer via the ONNX exports published by OpenVoiceOS. Two changes were applied to each, both necessary to run on ONNX Runtime's CPU provider on a phone:
- Re-quantized from QInt8 to QUInt8. The upstream
model.int8.onnxfails to create a session withCould not find an implementation for ConvInteger(10): ORT's CPUConvIntegerkernel is uint8-only, and a Conformer's pre-encode is convolutional. The fp32 model was quantized here instead. - Initializers moved to an external file. The single-file build copies its weights into the arena โ 202 MiB resident on an iPhone. As mapped external data that is ~30 MiB, because the pages stay clean and file-backed.
Each pack is model.int8.opt.onnx (graph) + model.int8.opt.onnx.data (weights)
vocab.txt, plus the filterbank and window the featurizer needs (mel_filters.json,hanning_window.json), which the upstream exports do not include.
Shape
Single fused graph โ the CTC output is already the language's own vocabulary, so no column masking is needed:
audio_signal [batch, 80, frames] + length [batch] -> logprobs [batch, frames, vocab]
80 log-mel filters at 16 kHz, subsampling factor 4. <blk> is the last vocabulary
entry.
Accuracy
Measured on one held-out clip per language (61 words total): 80.3% exact word match, against 86.9% for the 22-language model on the same clips. Smaller and several times faster, for a few points of accuracy.
| te | bn | pa | gu | kn | hi | mr | ml | ta |
|---|---|---|---|---|---|---|---|---|
| 6/6 | 6/6 | 7/9 | 6/7 | 5/6 | 5/7 | 5/7 | 5/7 | 4/6 |