UDGAM LABS · Speech-to-text model · about 56M parameters · part of the Shruti family
Shruti Punjabi
Punjabi and English in one 29.7 MB file that runs on your device. Punjabi comes out in Gurmukhi, and more than half of the English words stay in English letters: ਯਾਰੋ ਮੇਰਾ canada ਦਾ study visa ਆ ਗਿਆ ਹੈ. 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 11x faster than real time using 64 MB of memory.
On Punjabi conversations we found it level with IndicConformer Punjabi and SraVaani-1.0, not ahead. On DiarBench (held out, 200 turns from 44 conversations), counting English words only in English letters: 32.6 vs 34.6 and 31.9, and both paired intervals include 0. It writes 58.7% of the English words in English letters, where those two write none. Against the native reference on the same turns they are well ahead (28.4 and 23.9 vs 38.3), and on read Punjabi too (FLEURS 16.9 and 15.1 vs 29.3). No Punjabi reader has reviewed this output yet.
Shruti Punjabi 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 Punjabi and English speech and added 700 Punjabi 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, not checked by a Punjabi speaker, written by Shruti Punjabi on the phone (native engine, unedited):
ਯਾਰੋ ਮੇਰਾ canada ਦਾ study visa ਆ ਗਿਆ ਹੈ ਅਗਲੇ ਮਹੀਨੇ toronto ਦੀ flight ਹੈ
ਗੱਡੀ ਦੀ service ਕਰਵਾਉਣੀ ਆ break ਤੇ engine oil check ਕਰ ਲਿਓ bill ਸ਼ਾਮ ਨੂੰ ਦੇ ਦਿਆਂਗੇ
(Where they differ from the spoken lines: ਕੈਨੇਡਾ → canada; ਟੋਰਾਂਟੋ → toronto; ਕਰਾਉਣੀ → ਕਰਵਾਉਣੀ; brake → break.)
| Developer | Udgam Labs |
| Base model | Shruti Hindi (Udgam Labs), built on Cactus Whistle (Cactus Compute); both Apache-2.0 |
| Parameters | About 56M (55,875,913; 8 encoder + 8 decoder layers, width 512) |
| File | shruti-punjabi.cact, 29.7 MB (4-bit weights, 8-bit activations) for the Cactus needle engine |
| Input / output | 16 kHz audio of any length → text; Punjabi in Gurmukhi, English words in lowercase Latin when it keeps them in English |
| Languages | Punjabi, English, and Punjabi 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-punjabi shruti-punjabi.cact config.json --local-dir .
from needle import Whistle
model = Whistle("shruti-punjabi.cact")
print(model.transcribe("clip.wav")) # Punjabi or English is detected automatically
The cactus-needle Python package sends anonymous usage counts by default; set NEEDLE_TELEMETRY=0 to turn that off.
Command line: ./needle --model shruti-punjabi.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/punjabi is a working page.
Results
Word error rate (%, lower is better), the same clips and scorer for every model; Shruti Punjabi in its on-device engine on a Mac. Measured 2 November 2026. Size is the file as published by its makers (whisper.cpp q8_0 for Whisper).
| Model | File size | FLEURS (read) | Kathbath test-unknown (read) | DiarBench, English in English | DiarBench, native |
|---|---|---|---|---|---|
| Shruti Punjabi | 29.7 MB | 29.3 | 18.6 | 32.6 | 38.3 |
| Whisper tiny | 43.5 MB | 311.5 | 337.8 | 468.7 | 467.7 |
| Whisper base | 81.8 MB | 201.6 | 207.9 | 275.9 | 275.3 |
| Dolphin base | 103.7 MB | 83.6 | 71.6 | 98.5 | 99.4 |
| IndicConformer Punjabi (int8) | 137.7 MB | 16.9 | 13.7 | 34.6 | 28.4 |
| Dolphin small | 249.7 MB | 62.2 | 51.0 | 99.2 | 99.2 |
| Whisper small | 264.5 MB | 129.4 | 123.4 | 145.1 | 144.7 |
| SraVaani-1.0 | 908.8 MB | 15.1 | 12.7 | 31.9 | 23.9 |
How to read this. FLEURS is read speech we did not train on. Kathbath test-unknown has unseen speakers, but Kathbath's train split is in our training data and very likely the others'. DiarBench is real conversation from outside our training data. DiarBench has 200 turns from 44 conversations, 5,881 reference words, 659 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 Gurmukhi. 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 Punjabi minus the other model, in word error points (1,000 resamples of clips; "by conversation" resamples whole conversations). A negative number means Shruti Punjabi made fewer errors; an interval that includes 0 shows no lead either way.
- Dolphin base: FLEURS -57.30 to -50.97 by clip; Kathbath test-unknown -56.58 to -49.66 by clip; DiarBench native -63.82 to -58.09 by clip, -65.38 to -56.09 by conversation, -59.94 to -54.14 with script ignored; DiarBench English in English -68.65 to -62.72 by clip, -70.47 to -60.74 by conversation, -65.06 to -58.97 with script ignored.
- IndicConformer Punjabi: FLEURS +10.77 to +14.14 by clip; Kathbath test-unknown +3.33 to +6.42 by clip; DiarBench native +7.50 to +12.17 by clip, +5.53 to +13.10 by conversation, +9.81 to +13.89 with script ignored; DiarBench English in English -4.44 to +0.15 by clip, -6.37 to +0.68 by conversation, -2.69 to +1.53 with script ignored.
- Dolphin small: FLEURS -36.57 to -29.21 by clip; Kathbath test-unknown -36.49 to -28.76 by clip; DiarBench native -63.75 to -58.01 by clip, -65.47 to -55.92 by conversation, -64.75 to -59.14 with script ignored; DiarBench English in English -69.40 to -63.60 by clip, -71.21 to -61.45 by conversation, -70.53 to -64.75 with script ignored.
- SraVaani-1.0: FLEURS +12.35 to +16.34 by clip; Kathbath test-unknown +4.27 to +7.45 by clip; DiarBench native +12.20 to +16.45 by clip, +11.42 to +16.45 by conversation, +13.32 to +17.47 with script ignored; DiarBench English in English -1.34 to +2.78 by clip, -2.30 to +3.06 by conversation, -0.70 to +3.33 with script ignored.
- English words in English letters: 58.7% of DiarBench's 659 English words, on 200 turns. IndicConformer Punjabi and SraVaani-1.0 write none.
- About a third of Dolphin's errors on those conversations: 32.6, against 98.5 for Dolphin base and 99.3 for Dolphin small.
- One file for two languages: Shruti Punjabi also transcribes English: LibriSpeech test-clean 6.24 (Shruti Hindi: 5.95).
- Silence: 0 words invented on 100 silent clips.
Other Punjabi 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, 10.7x faster than real time, 64 MB peak memory (20 clips, 251.2 s of audio; slowest clip 7.6x). In that phone's Chrome, on 9 lines played into the page, it took 1.1-1.3 s on the device for 6.7-8.3 s of speech.
Where it falls short
- It leads no serious rival. Its strongest result is a level one: the interval against IndicConformer Punjabi only just includes 0 (-4.44 to +0.15), and with script ignored it is fully level (-2.69 to +1.53).
- Read Punjabi is far behind. FLEURS 29.3, against 16.9 and 15.1; Kathbath test-unknown 18.6, against 13.7 and 12.7.
- The native reference shows the gap. DiarBench native 38.3, against 28.4 and 23.9. Character errors there 28.26%, against 13.84% and 13.42%.
- Less English in this test. 659 of 5,881 reference words, so English helps less here. Local names glossed in Latin often come out in Gurmukhi and count as errors (chandigarh as ਚੰਡੀਗੜ੍ਹ).
- English words in Gurmukhi: about 168 of DiarBench's 659 by automatic alignment (punjabi as ਪੰਜਾਬੀ). DiarBench also glosses some local names in Latin, so a correct native spelling can score as an error.
- Browser: tested on 9 lines only, played into the page on one phone's Chrome with the language set. All 9 came out in Gurmukhi, and 6 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 Punjabi 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 Punjabi).
- Not tested on Punjabi: 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 700 Punjabi vocabulary pieces and used Shruti Hindi's language tag for Punjabi, then trained all weights with 4-bit quantisation-aware training.
- Data: Punjabi 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, Punjabi | CC-BY-4.0 |
| AI4Bharat Kathbath, Punjabi | CC-BY-4.0 |
| SPRING-INX Punjabi R1 and R2 (SPRING Lab, IIT Madras) | CC-BY-4.0 on AIKosh, which lists them as spring_lab_punjabi; the Hugging Face copies state none |
| ARTPARK-IISc Vaani, Punjabi (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 |
The Hugging Face copies of SPRING-INX Punjabi R1 and R2 that we trained on state no licence of their own (checked 6 November 2026). The official AIKosh listing names CC BY 4.0. We read AIKosh as governing, as for the other SPRING-INX languages, and we did not verify that the two hold the same files. Apache-2.0 on this model doesn't set or change their terms.
Intended use and limitations
For transcribing Punjabi 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 Punjabi 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{udgamlabs2026shrutipunjabi,
title = {Shruti Punjabi: offline speech-to-text for Punjabi and English in 29.7 MB},
author = {{Udgam Labs}},
year = {2026},
url = {https://huggingface.co/udgamlabs/shruti-punjabi}
}
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
