Application · Developer Relations Engineer
Hi, I’m Reet. I’ve been building with Sarvam, and I’d love to do it full time.
One small fix in your repos, now merged. It isn’t a big change, but it was the kind of thing you only find by actually building something.
I found it building kya bola, where I scored Saaras district by district across all 64 languages in Project Vaani, because I wanted to understand it properly before I said anything about it.
None of it was asked for. I just enjoyed doing it, and it seemed like a better way to introduce myself than a cover letter.
If you would rather watch than read
I edited this video with your speech-to-text
The video on this page is seven minutes long and I needed to cut it. Specifically I needed the second it stops being about code and starts being about community, so the screen share could drop and my face could take the frame. Scrubbing a timeline to find that by ear is the slowest way to do it.
So I used your speech-to-text on my own application video. Split the audio into twenty-second chunks, sent each to saaras:v3, and stitched the results back with the chunk offset as the timestamp. That gave me a transcript I could search.
ffmpeg -i audio.wav -f segment -segment_time 20 c%03d.wav
for f in c*.wav; do
curl -s https://api.sarvam.ai/speech-to-text -H "api-subscription-key: $SARVAM_API_KEY" -F "file=@$f" -F "model=saaras:v3" -F "language_code=en-IN" -F "mode=transcribe"
doneIt found the line in one pass. "Now that's the code half" lands at 3 minutes 56 seconds, and everything after it is narration over a page that had stopped earning its place on screen. That is the cut. Twenty-two requests, about ninety seconds of work, on a file I would otherwise have scrubbed through four times.
What it got wrong, which is the useful part
Read the transcript rather than the accuracy number and a small pattern shows up. Saaras handled my sentences really well and struggled with Sarvam's own vocabulary. Every proper noun that matters to you came back slightly off, in a recording made specifically to be sent to you, which I thought was worth passing on.
| I said | it heard |
|---|---|
| Sarvam | Sarva |
| Project Vaani | Project Wani |
| Khariboli | Kharipoli |
| sarvam.reetbatra.com | sarvam.review |
None of that is a model failure. It's a missing dictionary. Bulbul ships a pronunciation dictionary for exactly this shape of problem and the docs point at it for TTS. A published dictionary of Sarvam's own vocabulary, the product names, the model names, the dataset names, would fix all four of these for every developer who transcribes a meeting, a demo or a support call that mentions you by name. That is a docs artifact and a one-afternoon job, and it is the kind of thing I would want to own.
A parameter got renamed, and the examples had not caught up
text-to-speech: use language_code for TTS convert and convert_stream
The text-to-speech parameter was renamed back in August and the examples hadn't caught up yet, so every sample on that page raised a TypeError on the first call. It matters a bit more here than usual, because agents install this skill to get your signatures right, so a stale name doesn't produce a typo. It produces confident, broken code, at scale.
The part I'd want you to read
The quick fix would have been find and replace, but I left line 89 alone. ws.configure() still takes the old name, so REST and WebSocket genuinely disagree inside the same SDK right now. Rename all four and the next agent to read the file breaks the WebSocket example trying to make it consistent. So the old name stays where it's still correct, with a Gotchas row explaining why.
The rename is hard in both directions. 0.1.28 takes only the old name, 0.1.29 and later only the new one, and the JSON body key moved too. No alias, so one side always breaks. Rather than fork the skill per version, the callout names the SDK floor and the old parameter. That's enough for an agent to recover when it hits the error on a pinned project.
This dataset has 64 Indian languages. Most speech APIs cover 19 of them.
Every speech vendor publishes one number per language. One for Hindi, one for Tamil. It's a tidy way to report it, but it hides a lot, because Hindi in Delhi and Hindi in Araria aren't the same problem. So I measured it district by district to see how much.
"kya bola?" is what you ask when you didn't catch it. Also, it turns out, what most speech APIs are thinking once you leave the metros.
Mine, start to finish, across 29 commits. I wrote the shard-walking sampler, the district crosswalk, the Indic normalization rules, the three provider adapters, the scoring and the map. The fix above turned up while I was building it. That’s the only reason I found it.
The support list barely predicts anything
I sent the 45 unsupported languages anyway, with language detection on, because that’s what a developer building for those speakers would actually do. Rates above 100% aren’t a bug. Word error rate counts insertions, so a model returning more words than were spoken can run past the length of the reference. It means the model isn’t declining. It’s confidently producing fluent text in the wrong language.
| language | on your support list | word error rate |
|---|---|---|
| Garo | no | 133.0% |
| Tagin | no | 122.7% |
| Nyishi | no | 120.2% |
| Santali | yes | 84.2% |
| Kashmiri | yes | 35.7% |
| Magahi | no | 29.3% |
| Bundeli | no | 25.3% |
| Khariboli | no | 24.3% |
| Hindi | yes | 22.2% |
| English | yes | 11.4% |
Three systems, and the open one holds up
On the 19 languages all three support. Green marks the winner in each row.
| language | IndicConformer | Saaras v3 | Saaras v4 |
|---|---|---|---|
| Hindi | 19.5% | 22.2% | 21.0% |
| Urdu | 36.5% | 48.8% | 47.8% |
| Manipuri | 21.4% | 26.7% | 26.7% |
| Tamil | 27.0% | 32.0% | 22.7% |
| Odia | 56.3% | 60.5% | 41.9% |
| Santali | 83.2% | 84.2% | 58.6% |
Why you should believe any of it
The Vaani team benchmarked 21 systems on their own Hindi set across 104 districts, in arXiv 2606.21408. That map is theirs and repeating it would add nothing. This extends the idea to the other 63 languages and keeps it current as new models ship.
| this harness | published | |
|---|---|---|
| district mean WER | 17.6% | 18.3% |
| approach 1 | 18.7% | 20.3% |
| approach 2 | 15.9% | 16.9% |
| two humans, same audio | 9.4% | 10–15% (stated) |
Three things in there that are useful to you
Whatever happens with the role.
- 01
The support list turns out to predict less than you might expect. Khariboli isn't on it and scores 24.3%. Odia is on it and scores 60.5%, on samples of 103 and 120 clips. Every unlisted language with a comparable sample does better than the weakest listed one, which feels like useful information to have.
- 02
Kashmiri measures 63.9% with standard normalization and 35.7% once you strip Arabic short-vowel marks from both sides. Anyone benchmarking your Kashmiri without that step will publish a number about 28 points worse than reality, so it seemed worth writing down somewhere public.
- 03
For the 45 languages outside the documented list, auto-detect returns confident output in the wrong language rather than declining. Several score above 100%, which means insertions. A simple "we don't support this yet" signal would probably help a developer more than fluent Hindi does for a Garo speaker.
Five ways I nearly published something false
Each of these gave me numbers that looked completely reasonable and were wrong. Three of the five made the story better, which is exactly why I’d have kept them. I’m including them because I think how someone checks their own work says more than the result does. Each one is pinned by a test now.
- 01
I deleted the vowels
16.6% → 7.69%The normalizer everyone copies strips Indic vowel signs, and the score gets better.
What actually happened
The Whisper text normalizer most evaluation code copies strips Unicode categories M, S and P together. In every Brahmic script the vowel signs and the virama are category M. Applied to Indic text it deletes the vowels, and because it deletes them from both sides, the error rate improves. There's a documented case of Malayalam going from 16.6% to 7.69% purely from this. The score gets better because the comparison gets emptier.
- 02
I scored the annotations
+18.4 pointsTranscriber markup counted as though somebody had said it out loud.
What actually happened
Vaani transcripts carry markup: paired <noise> and <pause> tags in 56.3% of them, {english} glosses in 35.5%, [event] notes in 10.1%, truncation markers in 15.3%. Scored raw, that inflated word error rate by 18.4 points. The tags wrap real speech, so stripping tag and content would have emptied the reference for more than half the Garo clips. The braces are the opposite problem: साइड {side} is one spoken word written twice, natively then glossed, so the whole group has to go.
- 03
The same bug in a wig
9.4% → 32.9%One tag name with a space in it left two phantom words in every reference.
What actually happened
The benchmark set writes <static noise>, with a space in the tag name. My pattern assumed one word, so "static noise" sat in the reference as two words no model could ever say. That alone moved measured human-versus-human disagreement from 9.4% to 32.9%. It would have wrecked the one number every other number gets judged against.
- 04
I billed a model for my empty wallet
a fake 91.3%A provider ran out of credit and I scored it as a bad model.
What actually happened
A run against a second provider ate its quota after 11 clips. The other 70 came back empty and scored as total failures, which gave me a very tidy 91.3% error rate describing my billing status rather than anything about the model. Refusals and infrastructure failures go in separate buckets now. An API that rejects an unsupported language has genuinely failed the clip. An API out of credit never got to try, so the clip drops out and the run aborts instead of quietly averaging it in.
- 05
I counted diacritic order as errors
63.9% → 35.7%Same word, same letters, one optional vowel mark in a different order.
What actually happened
Kashmiri looked broken at 63.9%, so I opened the transcripts. Reference چُھ, hypothesis چھُ. Same letters, same word, different order for an optional vowel mark that Unicode doesn't reorder. Kashmiri is 35.7%. I was one commit from publishing a claim about your Kashmiri support that was off by 28 points.
I have done the community half before, for a technology nobody had heard of
I've built a developer community from nothing once already. Zero to 4,800 developers in India, in under a year, for zero-knowledge proofs, back when nobody here had heard of them. Four things did the work. None of them are clever. All of them are unglamorous, and the last one is the one most companies skip.
- 01
Be in the room
You don't build a developer community in India from a Discord.
What I didOffline, in colleges, constantly. Either a one-day hackathon or a three-hour lecture where I took the technology apart until everyone in the room understood it. Not a talk. A lesson. With real rewards, so there was a reason to stay to the end.
What it looks like hereYou already run campus outreach, so this isn't about starting something new, more about what the events produce. In my experience, running hackathons without a specific brief tends to give you the same five projects back: a chatbot, a translator, a transcriber. So I'd tie every event to something real. Build for a district where the numbers are weak. Build for a language outside the documented list and see what happens. And open every event with a Colab that already runs, because two hours lost to setup is two hours nobody spends building.
- 02
Pay for contribution, not attendance
Showing up isn't the thing. Shipping is.
What I didAn online bootcamp where the reward wasn't for turning up. Finish the lectures, land an open source contribution, then you get paid.
What it looks like hereThe targets already exist and they're yours: the Python SDK, the TypeScript adapter, the skills repo, the cookbook, the LiveKit and LangChain and Vercel AI SDK integrations. I found two small things in those repos in about a week, just poking around on my own. A hundred developers with a reason to look would find more, and every one they find is one your users never hit.
- 03
Send something real
Never underestimate an actual object turning up at somebody's door.
What I didEveryone who finished, lectures and assignments and quiz, got a physical swag box posted to them. It sounds small. It was the most talked-about thing we did. People finished a whole bootcamp for a box.
What it looks like hereCompletion, not registration. Nothing goes out for signing up. It also quietly builds the only list worth having: the postal address of every developer in the country who finished something hard using your API. That list is who you call first when the next model ships.
- 04
Grants that expect a business
The goal was never to fund projects. It was to get founders.
What I didI ran a $21,000 grants programme. Nothing went out as a lump sum. Milestones, a checklist I could actually hold a team to, and a call with every team every week to see what they were stuck on.
What it looks like hereThe bar isn't 'built something with Sarvam'. It's 'built something a stranger would pay for'. Milestones, weekly calls, and the teams that clear the last one get a warm handoff to the Startup Program rather than being dropped. It's the unglamorous half, and I think it's the half that decides whether a grants budget produces companies or screenshots.
One more thing
Some of this measures your product and finds places a free MIT-licensed model does better, and I'd much rather you saw that from me first than read it somewhere else. If something in it is wrong I want to fix it before it goes further, and if any of it is useful to you, please just take it, whatever happens with the role.
I'm applying for both, honestly because I'd be happy doing either. The first half of this page is the Developer Advocate work. The second half is the Community Manager work, which I've done once already, with 4,800 developers. Take whichever half is more useful to you right now.
Fastest way to judge me: read the merged PR, then open the kya bola map.
Thank you for reading this far. I hope you like it, and I hope we can chat soon.
The player at the bottom reads this page aloud in five voices. That is your Bulbul v3, generated ahead of time by a build script rather than an API route, so there is no key in the browser and nothing to pay per visit. Press space, or click any paragraph to start there.
Built on Project Vaani by ARTPARK and IISc, used under CC-BY-4.0. Benchmark methodology follows Pulikodan et al., Vaani Benchmark V1.0, arXiv 2606.21408. Boundary data is geoBoundaries under ODbL 1.0.