UDGAM LABS · Speech-to-text model · about 56M parameters · part of the Shruti family
Shruti Nepali
Nepali and English in one 29.7 MB file that runs on your device. Nepali comes out in Devanagari, and it keeps English words in English letters, as here: दिदी बफको मोमो एक plate र एउटा cold drink दिनु न. It runs on a phone, a laptop or in a browser, with no server and no internet connection. On a 2021 Samsung Galaxy F62 it transcribes about 10x faster than real time using 64 MB of memory.
We make no comparative claim for this model. IndicConformer Nepali is well ahead on read Nepali (FLEURS 29.9 vs 46.0), on IndicVoices valid (18.4 vs 27.1) and on DiarBench's native reference (28.6 vs 40.5). Set the language when you know it's Nepali. Left to choose on its own, the engine sent 20 of 200 FLEURS clips wholly to English letters; with Nepali set, none did, and FLEURS moves from 46.0 to 42.2. That helps and closes part of the gap, not all of it. The try box on udgamlabs.com sets the picked language and so does our demo on Hugging Face. What it offers is one small file that works offline. No Nepali reader has reviewed this output yet.
Shruti Nepali is part of the Shruti family, one small model per language, and is built on Cactus Whistle (Apache-2.0) via Shruti Hindi: we retrained all its weights on Nepali and English speech and added 400 Nepali vocabulary pieces.
Shruti (श्रुति) is Sanskrit for "that which is heard".
Try it: on udgamlabs.com, on your own device · demo on Hugging Face · Code and examples: github.com/udgamlabs/shruti
Lines read by AI voices, some from Nepali libraries and some labelled Hindi, written by Shruti Nepali on the phone (native engine, unedited):
दिदी बफको मोमो एक plate र एउटा cold drink दिनु न अचार अलिक पिरो राखिदिनु है
दसैँमा घरजाना काठमाडौँबाट पोखराको bus ticket online book गरिसकेँ तर seat चाहिँ पछाडिको मात्र पाएँ
(Where they differ from the spoken lines: अलि → अलिक; घर जान → घरजाना.)
| Developer | Udgam Labs |
| Base model | Shruti Hindi (Udgam Labs), built on Cactus Whistle (Cactus Compute); both Apache-2.0 |
| Parameters | About 56M (55,722,313; 8 encoder + 8 decoder layers, width 512) |
| File | shruti-nepali.cact, 29.7 MB (4-bit weights, 8-bit activations) for the Cactus needle engine |
| Input / output | 16 kHz audio of any length → text; Nepali in Devanagari, English words in lowercase Latin when it keeps them in English |
| Languages | Nepali, English, and Nepali mixed with English. Other languages have their own Shruti models |
| Runtime | Cactus needle engine (Apache-2.0), native and WebAssembly; we measured it on a Mac, an Android phone and that phone's Chrome |
| Licence | Apache-2.0 for this model; see the data section for the terms of its training data |
Quick start
pip install cactus-needle
hf download udgamlabs/shruti-nepali shruti-nepali.cact config.json --local-dir .
from needle import Whistle
model = Whistle("shruti-nepali.cact")
print(model.transcribe("clip.wav")) # Nepali or English is detected automatically
The engine can be told the language, which helps Nepali (see "Where it falls short"): model.transcribe("clip.wav", language="ne"), or --audio-language ne on the command line.
The cactus-needle Python package sends anonymous usage counts by default; set NEEDLE_TELEMETRY=0 to turn that off.
Command line: ./needle --model shruti-nepali.cact --audio clip.wav with the needle binary for your platform from
Cactus-Compute/needle3. In the browser, the wasm/ build of the same
engine runs it inside a web page; udgamlabs.com/models/shruti/nepali is a working page.
Results
Word error rate (%, lower is better), the same clips and scorer for every model; Shruti Nepali in its on-device engine on a Mac. Measured 3 November 2026. Size is the file as published by its makers (whisper.cpp q8_0 for Whisper).
| Model | File size | FLEURS (read) | IndicVoices valid | DiarBench, English in English | DiarBench, native |
|---|---|---|---|---|---|
| Shruti Nepali | 29.7 MB | 46.0 | 27.1 | 34.0 | 40.5 |
| Whisper tiny | 43.5 MB | 270.5 | 488.6 | 308.4 | 310.5 |
| Whisper base | 81.8 MB | 200.4 | 371.4 | 287.2 | 288.3 |
| IndicConformer Nepali (int8) | 137.7 MB | 29.9 | 18.4 | 37.4 | 28.6 |
| Whisper small | 264.5 MB | 126.7 | 226.5 | 238.0 | 237.6 |
How to read this. FLEURS is read speech we did not train on. DiarBench is real conversation from outside our training data. IndicVoices valid is IndicVoices' own held-out split: its speakers are kept out of training and its sentences blocked, but it is the same source as our training data, so it flatters us. DiarBench has 45 turns from 19 conversations, 874 reference words, 118 of them English. The "English in English" column scores against references that write English words in English (Latin script), and English words count only if written in English letters; the native column scores against references that write those English words in Devanagari. Whisper's rates pass 100% because it adds words and often writes the wrong script, so they say little about Whisper at its best.
Paired 95% intervals below are Shruti Nepali minus the other model, in word error points (1,000 resamples of clips; "by conversation" resamples whole conversations). A negative number means Shruti Nepali made fewer errors; an interval that includes 0 shows no lead either way.
- IndicConformer Nepali: FLEURS +13.60 to +19.38 by clip; IndicVoices valid +6.72 to +11.13 by clip; DiarBench native +8.07 to +16.62 by clip, +7.98 to +16.63 by conversation, +7.99 to +16.55 with script ignored; DiarBench English in English -8.67 to +2.66 by clip, -8.83 to +2.37 by conversation, -6.30 to +4.54 with script ignored.
- English words in English letters: 55.9% of DiarBench's 118 English words, on 45 turns. Stock IndicConformer Nepali writes none.
- One file for two languages: Shruti Nepali also transcribes English: LibriSpeech test-clean 6.01 (Shruti Hindi: 5.95).
- Silence: 0 words invented on 100 silent clips.
Other Nepali speech models exist that we have not measured, and these results cover only the models listed here.
Speed and memory (offline): Samsung Galaxy F62 (2021, 6 GB RAM), native engine, 9.7x faster than real time, 64 MB peak memory (20 clips, 113.5 s of audio; slowest clip 3.0x). In that phone's Chrome, on 5 lines played into the page, it took 3.1-4.8 s on the device for 7.8-10.0 s of speech.
Where it falls short
- Read Nepali is far behind. FLEURS 46.0 vs IndicConformer Nepali's 29.9 (+13.60 to +19.38); 42.2 with the language set. Character errors 24.94% vs 10.55%.
- The automatic language choice misfires. 20 of 200 FLEURS clips came out wholly in English letters with the engine's own choice. With Nepali set, none of the 200 did, and the set moves from 46.0 to 42.2, still behind. On the other Shruti languages where we measured it, plain English loses a little accuracy with the language set.
- The other tests favour IndicConformer Nepali too. IndicVoices valid 27.1 vs 18.4 (+6.72 to +11.13), DiarBench native 40.5 vs 28.6 (+8.07 to +16.62). DiarBench English in English shows no lead either way (34.0 vs 37.4; -8.67 to +2.66), on 45 turns and 118 English words, too few to say much.
- A code-mix rival exists that we have not measured.
ailabpvtltd/indicconformer-nepali-english-codemix-asr(513.5 MB, CC BY-NC 4.0) is built for exactly this mix and reports WER 19.9 on its own set, not comparable until measured. So what we say about IndicConformer Nepali writing no English holds for the stock model. - English words in Devanagari: about 22 of DiarBench's 118 by automatic alignment. DiarBench also glosses some local names in Latin, so a correct native spelling can score as an error.
- Browser: tested on 5 lines only, played into the page on one phone's Chrome with the language set. All 5 came out in Devanagari, and 4 kept some English letters. Not tested with a live microphone. On the other Shruti languages where we measured it, plain English loses a little accuracy with the language set.
- No Nepali reader has reviewed this output yet.
- Loud noise: Shruti models sometimes repeat a phrase over and over in loud noise (measured on Shruti Hindi-family models, not on Nepali).
- Not tested on Nepali: noise, music, far-away or speaker-played audio, Linux, Windows and iOS. No punctuation; numbers come out as words.
How it was trained
- Start: Shruti Hindi (itself a full fine-tune of Cactus Whistle). We added 400 Nepali vocabulary pieces and used Shruti Hindi's language tag for Nepali, then trained all weights with 4-bit quantisation-aware training.
- Data: Nepali speech, with English words kept in English where the dataset marks them, plus English from Shruti Hindi's own training data. Test sentences were removed.
| Source | Licence |
|---|---|
| AI4Bharat IndicVoices, Nepali | CC-BY-4.0 |
| ARTPARK-IISc Vaani, Nepali (transcribed part) | CC-BY-4.0 |
| English from Shruti Hindi's training data: LibriSpeech, Mozilla Common Voice 17 English, AI4Bharat NPTEL | CC-BY-4.0, CC0, CC-BY-4.0 |
Intended use and limitations
For transcribing Nepali and English on devices where privacy, cost or connectivity rule out a cloud service: voice notes, dictation, captions, field apps. If accuracy matters more than size, use a larger model. Not for high-stakes use without human review. Accuracy drops on noisy audio, strong accents, rare names, numbers and long technical English.
Licence
Apache-2.0 for this model. Shruti Nepali is a modified version of Shruti Hindi (Udgam Labs) and of Cactus Whistle by Cactus Compute (both Apache-2.0); see NOTICE. That licence covers this model, not its training data: the data section above gives each source's terms. Please credit the datasets if you build on it.
Citation
@misc{udgamlabs2026shrutinepali,
title = {Shruti Nepali: offline speech-to-text for Nepali and English in 29.7 MB},
author = {{Udgam Labs}},
year = {2026},
url = {https://huggingface.co/udgamlabs/shruti-nepali}
}
About Udgam Labs. Udgam Labs is an independent AI research lab. We work from first principles: before we build, we understand why things work, whether we are training a model, fine-tuning one or applying AI to a new problem. Udgam (उद्गम) is Sanskrit for origin. udgamlabs.com
- Downloads last month
- 1
