Shruti Urdu · Udgam Labs

UDGAM LABS · Speech-to-text model · about 56M parameters · part of the Shruti family

Shruti Urdu

Shruti Urdu turns Urdu and English speech into text, offline, from one 29.7 MB file. Urdu comes out in Perso-Arabic script and English words stay in English, the way people actually type:

میری bike کا tyre puncture ہو گیا

It runs on a phone, a laptop or inside a web page, 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.

The result below rests on English letters. On real Urdu conversations that mix in English (DiarBench, held out, 74 turns from 25 conversations), counting English words only when they are written in English letters, its word error rate is 22.9 and IndicConformer Urdu's is 29.1. Against the native reference on the same turns, IndicConformer Urdu is well ahead (19.5 vs 31.3), and it is ahead on read Urdu too (FLEURS 24.7 vs 33.5, Kathbath 13.4 vs 18.2). No Urdu reader has reviewed this output yet.

Shruti Urdu is the Urdu member of the Shruti family, next to Shruti Hindi, Shruti Marathi, Shruti Tamil, Shruti Bengali, Shruti Telugu, Shruti Gujarati, Shruti Odia and Shruti Kannada, and is built on Cactus Whistle (Apache-2.0) via Shruti Hindi: we retrained all its weights on openly licensed Urdu and English speech and added 700 Urdu vocabulary pieces.

Shruti is Sanskrit for "that which is heard".

Try it: in your browser, on your own device · demo on Hugging Face · Code and examples: github.com/udgamlabs/shruti

Two lines on the phone, native engine, unedited (Urdu with English, AI voices):

میری bike کا tyre puncture ہو گیا mechanic کو phone کیا ہے آدھے گھنٹے میں آ جائے گا
ابو doctor صاحب نے کل صبح نو بجے کا appointment دیا ہے ساری reports سات ہٹ لیجیے گا

The top line is word for word. The other shows a real error: the spoken ساتھ رکھ written as سات ہٹ. It also wrote ڈاکٹر as doctor, in English letters, which is the model's habit with loanwords.

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-urdu.cact, 29.7 MB (4-bit weights, 8-bit activations) for the Cactus needle engine
Input / output 16 kHz audio of any length → text; Urdu in Perso-Arabic script, English words in lowercase Latin. Show the text right to left
Languages Urdu, English, and Urdu 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

Quick start

pip install cactus-needle
hf download udgamlabs/shruti-urdu shruti-urdu.cact config.json --local-dir .
from needle import Whistle

model = Whistle("shruti-urdu.cact")
print(model.transcribe("clip.wav"))   # Urdu 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-urdu.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/urdu is a working page.

Results

Word error rate (%, lower is better), the same clips and scorer for every model; Shruti Urdu in its on-device engine on a Mac. Measured 2 November 2026. FLEURS and Kathbath have 200 clips each, DiarBench 74 turns. 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 (conversation, held out) DiarBench, native reference
Shruti Urdu 29.7 MB 33.5 18.2 22.9 31.3
Whisper tiny 43.5 MB 108.8 107.4 257.3 255.8
Whisper base 81.8 MB 55.6 55.3 111.7 111.0
Dolphin base (int8) 103.7 MB 63.0 57.5 98.5 99.0
IndicConformer Urdu (int8) 137.7 MB 24.7 13.4 29.1 19.5
Dolphin small (int8) 249.7 MB 75.3 51.3 98.5 99.0
Whisper small 264.5 MB 41.7 45.7 50.8 50.0

DiarBench is real conversation that mixes in English: 74 turns from 25 conversations, 1,704 reference words, 251 of them English. It is a small set. The "English in English" column scores against references that write English words in English (Latin script), as Shruti Urdu does; English words count only if they are written in English letters. The native column scores against references that write those English words in Urdu script. FLEURS and Kathbath are read Urdu. 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 Urdu minus the other model, in word error points (1,000 resamples of clips).

  • Conversations that mix in English: fewer errors than IndicConformer Urdu (22.9 vs 29.1; -10.22 to -1.64; with whole conversations resampled -9.99 to -1.51). The check that ignores script does not work for Perso-Arabic, so we cannot show a gain beyond writing English in English letters.
  • Other models on that test: Whisper small (50.8; -47.05 to -16.23), Whisper base (111.7; -146.67 to -45.88) and Dolphin base and small (98.5; -79.77 to -71.38 and -79.42 to -71.04).
  • English inside Urdu: Shruti Urdu writes 64.1% of DiarBench's English words in English; IndicConformer Urdu writes none (0%), Whisper small 10.8%, Whisper base 6.4%, Dolphin base and small 3.2%.
  • One file for two languages: Shruti Urdu also transcribes English: LibriSpeech test-clean 6.07 (Shruti Hindi: 5.95).
  • Silence: 0 words invented on 100 silent clips.
  • Held-out sets: we did not train on FLEURS or DiarBench, or on Kathbath's unseen-speaker test set.

Other Urdu speech models exist that we have not measured, and these results cover only the models listed here. A scan of Hugging Face on 6 November 2026 found, among others, Urdu-Streaming-Zipformer-20M (43.9 MB as int8 encoder plus decoder; gated, so we have not run it), and many Whisper-tiny Urdu fine-tunes.

Speed and memory (offline): Samsung Galaxy F62 (2021, 6 GB RAM), native engine, about 11x faster than real time, 64 MB peak memory (20 clips). In that phone's Chrome, the page reports 2.9-3.4 s on the device for 6.8-8.6 s of speech.

Where it falls short

  • The lead rests on English letters. Against the native reference, IndicConformer Urdu is well ahead on the same turns (19.5 vs 31.3; +8.26 to +16.02). We cannot show that Shruti Urdu does better beyond writing English in English letters.
  • Read Urdu accuracy. IndicConformer Urdu makes about 26% fewer errors on read speech (FLEURS 24.7 vs 33.5; +7.45 to +10.04. Kathbath 13.4 vs 18.2; +2.98 to +6.48).
  • Character errors. On DiarBench's native reference, 28.69% against IndicConformer Urdu's 7.40%, almost four times. On FLEURS 16.68% vs 8.17%, on Kathbath 5.38% vs 3.73%.
  • A small test. 74 turns is a small set; the interval of -10.22 to -1.64 does not pin down the size of the lead.
  • Who it was measured on. No test set here is checked to be speakers from Pakistan (FLEURS carries an ur_pk label, and that is all we know), and the training collections' cards don't document speakers from Pakistan. No Urdu reader has reviewed this output yet.
  • English words in Urdu script: about a third of DiarBench's English words don't come out in English letters; about 41 of 251 are written in Urdu script (delhi as دہلی). DiarBench also glosses some local names in Latin, so a correct native spelling can score as an error.
  • Real errors: real errors happen, in ordinary words too (ساتھ رکھ as سات ہٹ, mic as مائٹ in the phone's browser), and joins and spelling variants count as errors.
  • In a browser, set the language. In the phone's browser, with the language left to the engine, 1 of 8 lines we played in on 5 November came out as English words for the whole line; the native engine detected all of them correctly. Passing ur is what our try box does: 3 of 3 lines played in that way on 6 November stayed in Urdu script with English in Latin, and that line stayed in Urdu script in a Mac's browser, but has not been played again on the phone. On the other Shruti languages where we measured it, plain English loses a little accuracy this way. Not yet tested with a live microphone.
  • Loud noise: Shruti models sometimes repeat a phrase over and over in loud noise (9 of 3,400 clips at 5 dB on an everyday-speech test, measured on Shruti Hindi-family models, not on Urdu).
  • Not tested on Urdu: 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 Urdu vocabulary pieces and used Shruti Hindi's language tag for Urdu, then trained all weights with 4-bit quantisation-aware training.
  • Data: openly licensed Urdu 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, Urdu CC-BY-4.0
AI4Bharat Kathbath, Urdu CC-BY-4.0
ARTPARK-IISc Vaani, Urdu (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 Urdu and English speech on devices where privacy, cost or connectivity rule out a cloud service: voice notes, dictation, voice commands, captions, field apps. Not for high-stakes use (medical, legal) without human review. Accuracy drops on noisy audio, strong accents, rare names, numbers and long technical English.

Licence

Apache-2.0. Shruti Urdu is a modified version of Shruti Hindi (Udgam Labs) and of Cactus Whistle by Cactus Compute (both Apache-2.0); see NOTICE. The training data licences are listed above; please credit the datasets if you build on it.

Citation

@misc{udgamlabs2026shrutiurdu,
  title  = {Shruti Urdu: offline speech-to-text for Urdu and English in 29.7 MB},
  author = {{Udgam Labs}},
  year   = {2026},
  url    = {https://huggingface.co/udgamlabs/shruti-urdu}
}

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
6
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for udgamlabs/shruti-urdu

Finetuned
udgamlabs/Shruti
Finetuned
(22)
this model

Datasets used to train udgamlabs/shruti-urdu

Space using udgamlabs/shruti-urdu 1

Collection including udgamlabs/shruti-urdu