
OpenThai2.0-ASR-Streaming · ONNX
iApp's Thai speech-to-text model, OpenThai2.0-ASR-Streaming, exported from its NeMo checkpoint to ONNX so that it runs with ONNX Runtime alone: no Python, no PyTorch, on a CPU. This is the build ChindaBot downloads for dictation.
โมเดลถอดเสียงภาษาไทยของ iApp ในรูปแบบ ONNX รันด้วย ONNX Runtime ได้โดยไม่ต้องมี Python หรือ PyTorch เป็นไฟล์ที่ ChindaBot ดาวน์โหลดเพื่อใช้ปุ่มไมโครโฟน (พูดแทนการพิมพ์)
Accuracy
These numbers were measured on the NeMo model this export comes from, iapp/OpenThai2.0-ASR-Streaming, at 560 ms, the attention context this export uses. The full-precision ONNX files give the same text as that model token for token on the clips we checked (see Checked below); the int8 files have not been measured. That model card has every table, the test sets and the limits.
Decode a long recording in pieces cut at pauses. Decoded as one long stream, the model drops some of the words that follow a pause of near-silence; dictation, one utterance at a time, is not affected.
Files
| File | Size | What |
|---|---|---|
encoder.onnx.data |
2.45 GB | The encoder's weights, full precision (fp32) |
openthai2.0-asr-streaming-fp32.asr.zip |
149 MB | Beside them: encoder.onnx (the graph), decoder_joint.onnx, tokens.txt |
encoder.int8.onnx.data |
0.88 GB | The encoder's weights with its MatMuls quantized to int8 |
openthai2.0-asr-streaming-int8.asr.zip |
109 MB | Beside them: encoder.int8.onnx, decoder_joint.onnx, tokens.txt |
Unzip the .asr.zip into the folder that holds its .onnx.data file. The zips are stored, not compressed.
The model
- A cache-aware FastConformer encoder (24 layers, 1024 wide, 609 M parameters) with a language prompt, and an RNN-T decoder (2-layer LSTM of 640) over 14,988 SentencePiece pieces; 640 M parameters in all.
- Input: 16 kHz mono audio as 128 log-mel bands (25 ms Hann window, 10 ms hop, pre-emphasis 0.97, no
normalisation).
encoder.onnxtakesaudio_signal[1, 128, T],length[1]andprompt_index[1](32 for Thai, 63 for Thai mixed with English) and givesencoded[1, T/8, 1024], the prompt already applied. decoder_joint.onnxis one greedy RNN-T step:encoder_outputs[1, 1024, 1],targets[1, 1],target_length[1], and the LSTM's two states[2, 1, 640]; it gives the 14,989 scores (the last is the blank, id 14988) and the next states. Add a bias to the blank's score before the argmax: −1.0 as the model's service does in its standard mode (−2.5 for clips under two seconds).tokens.txt: one piece a line, a piece's id its line number less one;▁is a space.
Checked
Exported on 10 Nov 2026 (opset 17), with the encoder's attention context at [56, 6]. A numpy + ONNX Runtime reference and ChindaBot's Rust implementation give the same text as the NeMo model, token for token, on three clips of 3.5 s, 8 s and 26 s. On an Apple M3 Max CPU the full-precision model hears 3.5 s of speech in 0.16 s.
The int8 files gave the same text on the two shorter clips and differed in two small places on the longest; their accuracy on real speech has not been measured. Use the full-precision files when in doubt.
Licence
OpenMDW-1.1, as the model it is exported from (see LICENSE). The model is built on NVIDIA's Nemotron ASR
streaming model.
