<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tamajit-005</title>
    <description>The latest articles on DEV Community by Tamajit-005 (@tamajit005).</description>
    <link>https://dev.to/tamajit005</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4156677%2F9b0b6046-04d3-466b-beb2-626dccd46083.png</url>
      <title>DEV Community: Tamajit-005</title>
      <link>https://dev.to/tamajit005</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tamajit005"/>
    <language>en</language>
    <item>
      <title>56 messages, 4 voice notes, 48 seconds: the briefing that reads my family's WhatsApp while I sleep</title>
      <dc:creator>Tamajit-005</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:04:05 +0000</pubDate>
      <link>https://dev.to/tamajit005/56-messages-4-voice-notes-48-seconds-the-briefing-that-reads-my-familys-whatsapp-while-i-sleep-3nmp</link>
      <guid>https://dev.to/tamajit005/56-messages-4-voice-notes-48-seconds-the-briefing-that-reads-my-familys-whatsapp-while-i-sleep-3nmp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  You slept. It listened. Here's what you missed.
&lt;/h1&gt;

&lt;p&gt;Last night, my father sent four voice notes to our family WhatsApp group. He was planning a trip to Shantiniketan, setting a budget, and — most importantly — updating us on my grandfather's health after a scare that initially sounded like a heart problem.&lt;/p&gt;

&lt;p&gt;I was asleep.&lt;/p&gt;

&lt;p&gt;By morning, I would have had to play all four notes, remember who said what, and mentally assemble a to-do list. Instead, I played a 48-second audio briefing that caught me up on all of it — in a warm voice, with a receipt for every claim.&lt;/p&gt;

&lt;p&gt;This is the story of &lt;strong&gt;Amar Khobor (আমার খবর)&lt;/strong&gt; — a briefing tool born the night a speech-to-text model mistook "heart problem" for "trouble at the market."&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amar Khobor&lt;/strong&gt; turns a WhatsApp group export into a warm, sub-minute audio briefing plus structured, verifiable show notes.&lt;/p&gt;

&lt;p&gt;The digest arrives as two things at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A spoken script&lt;/strong&gt; — warm and conversational, like a family member catching you up. No timestamps, no citations read aloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show notes&lt;/strong&gt; — structured cards below the player, mapping every claim to its sender and timestamp: &lt;code&gt;Baba → Dadu's gastric issue, not heart → health → urgent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what it produced from my family's actual messages that night:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Shobai kemon acho? Amar Khobor is here with a little update from Baba. Baba is already dreaming about our next trip! He's suggesting Shantiniketan—staying in a nice lodge and visiting the Sonajhuri Haat. He also mentioned a budget of around 2000, though he says we might spend a bit more if we enjoy some shopping there. So do think about it, okay? On a more serious note, there was a little scare with Dadu. Baba thought it might be a heart issue, but Dadu mentioned it's just gas. Edkat went to check on him, and Baba is also heading there. Thankfully, Dadu is doing much better now and has already had some khichdi. Baba will be taking him to see Dr. Sen tomorrow morning. So please, don't tension too much and everyone get some good sleep. We'll catch up in the morning. Shuvo ratri!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F14hxkd2n2crsdar2eing.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F14hxkd2n2crsdar2eing.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Tamajit-005/Amar-Khobor/blob/main/demo/sample_briefing.mp3" rel="noopener noreferrer"&gt;▶ Listen to the sample briefing&lt;/a&gt;&lt;/strong&gt; — generated from my family's real overnight voice notes, narrated with ElevenLabs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://amar-khobor.vercel.app" rel="noopener noreferrer"&gt;▶ Try the live app&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Tamajit-005/Amar-Khobor" rel="noopener noreferrer"&gt;View the source code on GitHub →&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Tamajit-005" rel="noopener noreferrer"&gt;
        Tamajit-005
      &lt;/a&gt; / &lt;a href="https://github.com/Tamajit-005/Amar-Khobor" rel="noopener noreferrer"&gt;
        Amar-Khobor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Turn overnight WhatsApp voice notes (Bengali/Hindi/English/Benglish) into a warm 2-minute audio briefing. Dual-STT bake-off: Sarvam Saaras vs Whisper-large-v3 · Gemma 4 digest · ElevenLabs narration.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Amar Khobor (আমার খবর)&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"You slept. It listened. Here's what you missed."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Amar Khobor turns a chaotic overnight WhatsApp group — dozens of voice notes in Bengali, Hindi, English, Benglish, and Hinglish — into one warm, two-minute audio briefing you can play while making morning tea. No more scrolling through 40 voice notes to find out who needs what by when.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Tamajit-005/Amar-Khobor/demo/sample_briefing.mp3" rel="noopener noreferrer"&gt;▶ Listen to a sample briefing&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/Tamajit-005/Amar-Khobor/YOUR_DEVTO_POST_URL" rel="noopener noreferrer"&gt;Read the build story&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Family WhatsApp groups don't sleep. While you were asleep, someone asked for a medicine refill, someone's flight got delayed, a school form needs signing by noon, and three people argued about dinner plans — all in voice notes, half of them in Benglish that autocorrect can't parse.&lt;/p&gt;
&lt;p&gt;Catching up means playing every note, remembering who said what, and mentally assembling a to-do list. Every morning. For every family member who doesn't have time for that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amar&lt;/strong&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Tamajit-005/Amar-Khobor" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Here is what Whisper-large-v3 produced from my father's voice note about Dadu:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;আমি হেবে ছিলাম হাটে সমসা কিন্তু দাদু ভললো গ্যাসে সমসা&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here is what Sarvam's Saaras produced from the exact same audio:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;আমি ভেবেছিলাম হার্টের সমস্যা, কিন্তু দাদু বলল গ্যাসের সমস্যা।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whisper wrote &lt;strong&gt;"trouble at the market"&lt;/strong&gt; (হাটে সমসা). My father said &lt;strong&gt;"heart problem"&lt;/strong&gt; (হার্টের সমস্যা). One is wordplay. The other is a family medical emergency.&lt;/p&gt;

&lt;p&gt;That single mistranscription is why Amar Khobor exists. Family WhatsApp groups don't sleep. Overnight, voice notes pile up in Bengali, Hindi, English, Benglish, and Hinglish — and catching up means playing every note, remembering who said what, and mentally assembling a to-do list. Every morning. Every family member. Nobody has time for that.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bake-off: what survived a human check
&lt;/h3&gt;

&lt;p&gt;I didn't want to pick a transcription provider based on someone else's benchmark table. So I built a bake-off harness that scores &lt;strong&gt;Saaras&lt;/strong&gt; and &lt;strong&gt;Whisper-large-v3&lt;/strong&gt; on &lt;em&gt;my own family's audio&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One honest caveat first:&lt;/strong&gt; the WER ground truth in &lt;a href="https://github.com/Tamajit-005/Amar-Khobor/blob/main/test_data/manifest.yaml" rel="noopener noreferrer"&gt;&lt;code&gt;test_data/manifest.yaml&lt;/code&gt;&lt;/a&gt; is the Saaras transcript. So Saaras's 0.00% WER is an &lt;strong&gt;floor, not an independent accuracy score&lt;/strong&gt; — Saaras agrees with itself by construction. The evidence that survived a human check is the diff below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The clip that matters — bn_003, verified by ear:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Transcript&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What my father said&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;আমি ভেবেছিলাম &lt;strong&gt;হার্টের সমস্যা&lt;/strong&gt;... ("I thought it was a &lt;strong&gt;heart problem&lt;/strong&gt;...")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What Saaras wrote&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;আমি ভেবেছিলাম &lt;strong&gt;হার্টের সমস্যা&lt;/strong&gt;... ✓ correct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What Whisper wrote&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;আমি হেবে ছিলাম &lt;strong&gt;হাটে সমসা&lt;/strong&gt;... ✗ "trouble at the market"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full per-clip results, including the noise-guard test: &lt;a href="https://github.com/Tamajit-005/Amar-Khobor/blob/main/test_data/eval_results.json" rel="noopener noreferrer"&gt;&lt;code&gt;test_data/eval_results.json&lt;/code&gt;&lt;/a&gt; · &lt;a href="https://github.com/Tamajit-005/Amar-Khobor/blob/main/demo/stt_comparison.md" rel="noopener noreferrer"&gt;&lt;code&gt;demo/stt_comparison.md&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Sarvam Saaras (&lt;code&gt;saaras:v4&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Groq Whisper (&lt;code&gt;whisper-large-v3&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monolingual WER ↓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.00% (floor — see caveat)&lt;/td&gt;
&lt;td&gt;67.13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Noise hallucinations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average latency ↓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;499 ms&lt;/td&gt;
&lt;td&gt;814 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That Whisper hallucination is real: on a one-second clip of near-silence, it produced the word &lt;em&gt;"you"&lt;/em&gt; from nothing. Saaras produced nothing — correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters for the product:&lt;/strong&gt; Saaras is purpose-built for Indic languages and code-mixed speech, and it's what runs in production. Whisper is the open-weights baseline I benchmark against — inspectable, reproducible, and swappable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bug I shipped and fixed
&lt;/h3&gt;

&lt;p&gt;Gemma 4 did something I didn't expect: it occasionally emitted its entire chain-of-thought — planning, drafting, self-correcting — &lt;em&gt;before&lt;/em&gt; the JSON digest. Sometimes it wrapped the JSON in an array instead of returning a bare object.&lt;/p&gt;

&lt;p&gt;My first extractor took the first &lt;code&gt;{&lt;/code&gt; to the last &lt;code&gt;}&lt;/code&gt;. That grabbed a &lt;code&gt;{&lt;/code&gt; from mid-reasoning and produced invalid JSON. The pipeline crashed on a response that contained a perfectly good digest — just buried in chatter.&lt;/p&gt;

&lt;p&gt;The fix was a &lt;strong&gt;tolerant backward extractor&lt;/strong&gt;: find the &lt;em&gt;last&lt;/em&gt; occurrence of &lt;code&gt;"spoken_script"&lt;/code&gt;, backtrack to the &lt;code&gt;{&lt;/code&gt; that opens that object, and slice to the closing &lt;code&gt;}&lt;/code&gt;. Now the parse succeeds even when Gemma rambles — and the prompt is hardened to discourage the rambling in the first place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="s"&gt;spoken_script&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turned a flaky LLM response into a deterministic parse — committed, with tests, in &lt;a href="https://github.com/Tamajit-005/Amar-Khobor/blob/main/pipeline/summarize.py" rel="noopener noreferrer"&gt;&lt;code&gt;pipeline/summarize.py&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The engineering decisions worth explaining
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why filter audio before STT?&lt;/strong&gt; Voice notes are the expensive part. An energy-based VAD pass tags silence and background noise &lt;em&gt;before&lt;/em&gt; any API call, so a forwarded chain of muted clips costs nothing. Forwarded messages are also excluded from summarization — nobody needs a briefing about a chain-forwarded good-morning graphic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why one LLM call for both outputs?&lt;/strong&gt; The spoken script and the show notes describe the same events. Generating them in a single structured Gemma call keeps them consistent — if the script says Dadu needs a doctor, the show-notes card for it exists too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why a 202-and-poll architecture?&lt;/strong&gt; A real overnight export takes a minute to process. &lt;code&gt;POST /digests/run&lt;/code&gt; returns &lt;code&gt;202 Accepted&lt;/code&gt; immediately, FastAPI &lt;code&gt;BackgroundTasks&lt;/code&gt; does the work, and the frontend polls every 2 seconds. No Celery, no Redis, no message broker — this is a family tool, not a distributed system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why ephemeral memory by default?&lt;/strong&gt; Family voice notes are some of the most private audio that exists. Audio and briefings live strictly in-memory during the session and vanish on server restart. MongoDB Atlas is an opt-in adapter, never a requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Honest limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gemma output formatting — the model sometimes emitted reasoning-like text before the JSON or wrapped the digest in an array. Prompt hardening and a tolerant extractor address the observed cases, but do not guarantee valid output for every response.&lt;/li&gt;
&lt;li&gt;Saaras-derived references — the evaluation references were taken from Saaras's transcripts. Its reported 0.00% WER therefore measures agreement with those references, not independently established transcription accuracy. Independent human transcription is the next evaluation step.&lt;/li&gt;
&lt;li&gt;Energy-based VAD — the filter detects audio energy, not speech itself. Loud background noise can pass through, and quiet speech can be missed.&lt;/li&gt;
&lt;li&gt;No API authentication — the current demo does not provide authenticated, per-user access. Authentication and rate limiting are needed before broader public use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;This is a tool for &lt;strong&gt;family voice notes&lt;/strong&gt; — some of the most private audio that exists. That constraint shaped every choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4&lt;/strong&gt; summarizes the digest because it's an open-weight model I can swap, self-host, or point at any provider without rewriting the pipeline. The provider is switched with one environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whisper-large-v3 via Groq&lt;/strong&gt; is the open-weights baseline, so the STT comparison is between two models whose behavior I can inspect — not a black box I have to trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge-TTS&lt;/strong&gt; keeps development free and local-first; &lt;strong&gt;ElevenLabs&lt;/strong&gt; is the production voice for the live deployment, opt-in and never a hard dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral in-memory storage&lt;/strong&gt; means zero infrastructure setup and zero database footprint by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The honest asymmetry:&lt;/strong&gt; Saaras — the model that wins my bake-off — is closed. I can't inspect or self-host it. I picked it for Bengali accuracy and kept the provider swap one environment variable away, which is the only honest position for a model you don't own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Fifty-six messages. Four voice notes. Forty-five seconds of audio you cannot skim.&lt;/p&gt;

&lt;p&gt;Morning-me would replay all four notes to find the budget and the health update, then scroll the chat to check who said what. The briefing is 48 seconds, and the receipts are already attached.&lt;/p&gt;

&lt;p&gt;The saving isn't the seconds — it's that &lt;strong&gt;audio has no Ctrl-F&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sloths don't catch up faster. They let the night do the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 4 powers the single-pass dual-output digest (spoken script + show notes), with a hardened prompt and a tolerant backward JSON extractor that turns flaky LLM output into a deterministic parse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt; — ElevenLabs narrates the production briefing in a warm Bengali-speaking voice; it's the voice in the committed sample MP3 and the live deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the backend deploys as a containerized FastAPI service via a committed &lt;code&gt;Dockerfile&lt;/code&gt; and &lt;code&gt;render.yaml&lt;/code&gt; Blueprint, with a root health route and Vercel-aware CORS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sarvam's Saaras isn't a prize track, but it's the reason the comparison exists: it's the production STT that made the "trouble at the market" vs "heart problem" comparison possible in the first place.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19/"&gt;Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady&lt;/a&gt;. Speech-to-text by &lt;a href="https://sarvam.ai/" rel="noopener noreferrer"&gt;Sarvam AI&lt;/a&gt; and &lt;a href="https://groq.com/" rel="noopener noreferrer"&gt;Groq&lt;/a&gt;; briefing voice by &lt;a href="https://elevenlabs.io/" rel="noopener noreferrer"&gt;ElevenLabs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>gemmachallenge</category>
      <category>devchallenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Amar Voice — Giving My Friend Their Voice Back (EN / हिंदी / বাংলা)</title>
      <dc:creator>Tamajit-005</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:19:55 +0000</pubDate>
      <link>https://dev.to/tamajit005/amar-voice-giving-my-friend-their-voice-back-en-hindii-baanlaa-21f7</link>
      <guid>https://dev.to/tamajit005/amar-voice-giving-my-friend-their-voice-back-en-hindii-baanlaa-21f7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Amar Voice — A Voice That Stays Theirs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built for a friend who has lost their voice, but still has old voice recordings.&lt;/p&gt;

&lt;p&gt;Amar Voice turns those recordings back into a voice they can use every day. Upload a few of their old voice notes → the app clones their voice → they tap a big button and the phone speaks &lt;strong&gt;as them&lt;/strong&gt; again, in English, हिंदी, or বাংলা. Anything beyond the daily phrases can be typed into the custom-message box (up to 1000 chars).&lt;/p&gt;

&lt;p&gt;Built for tired eyes and shaky hands: giant high-contrast cards, three language pills, one speaker menu, zero settings pages. It installs like an app (PWA), quick cards play instantly from cache, and family can add / rename / delete voice profiles right from the phone — no login, each device gets its own private space.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 quick cards (every tap speaks in their voice)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tap the feeling&lt;/th&gt;
&lt;th&gt;English&lt;/th&gt;
&lt;th&gt;हिंदी&lt;/th&gt;
&lt;th&gt;বাংলা&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;💧 Water — pleading, thirsty&lt;/td&gt;
&lt;td&gt;I need some water, please...&lt;/td&gt;
&lt;td&gt;मुझे थोड़ा पानी चाहिए...&lt;/td&gt;
&lt;td&gt;আমার একটু জল দরকার, দয়া করে...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💊 Medicine — routine, calm&lt;/td&gt;
&lt;td&gt;Time for my medicine...&lt;/td&gt;
&lt;td&gt;मेरी दवाई का समय हो गया है...&lt;/td&gt;
&lt;td&gt;আমার ওষুধ খাওয়ার সময় হয়েছে...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📞 Call — insistent, needs someone&lt;/td&gt;
&lt;td&gt;Please call my family member right now!&lt;/td&gt;
&lt;td&gt;कृपया मेरे परिवार के किसी सदस्य को बुलाओ!&lt;/td&gt;
&lt;td&gt;দয়া করে এখনই আমার পরিবারের কাউকে ডাকো!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☕ Tea — comfort, warmth&lt;/td&gt;
&lt;td&gt;I would like some warm tea.&lt;/td&gt;
&lt;td&gt;मुझे थोड़ी गर्म चाय चाहिए।&lt;/td&gt;
&lt;td&gt;আমাকে একটু গরম চা দাও।&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;😊 I'm fine — happy, reassuring&lt;/td&gt;
&lt;td&gt;I am doing fine, do not worry.&lt;/td&gt;
&lt;td&gt;मैं बिल्कुल ठीक हूँ, चिंता मत करो।&lt;/td&gt;
&lt;td&gt;আমি ভালো আছি, চিন্তা কোরো না।&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚨 Help — urgent, distressed&lt;/td&gt;
&lt;td&gt;I need help, please come here!&lt;/td&gt;
&lt;td&gt;मुझे मदद चाहिए, कृपया यहाँ आओ!&lt;/td&gt;
&lt;td&gt;আমার সাহায্য দরকার, দয়া করে এখানে এসো!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The emojis aren't decoration — they &lt;em&gt;are&lt;/em&gt; the interface. 😊 means happy, 🚨 means urgent, 💧 means pleading. No reading needed: tap the feeling and the phone says the matching phrase in their own voice, with the feeling carried in the words themselves (&lt;code&gt;...&lt;/code&gt; vs &lt;code&gt;!&lt;/code&gt;) as rendered by the clone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live app: &lt;a href="https://amar-voice.onrender.com" rel="noopener noreferrer"&gt;https://amar-voice.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video demo: &lt;a href="https://youtu.be/DQC13FPReB4?si=tfCekrNp80R67fji" rel="noopener noreferrer"&gt;https://youtu.be/DQC13FPReB4?si=tfCekrNp80R67fji&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tip for judges: open the link on your phone → Add to Homescreen → tap 💧 water → switch हिंदी / বাংলা pills → try custom text → open Upload to clone a voice from old recordings (max 10 clips, 800 KB each).&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Tamajit-005/Amar-voice" rel="noopener noreferrer"&gt;https://github.com/Tamajit-005/Amar-voice&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;backend/main.py&lt;/code&gt; — routes, upload caps, rate limits&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;backend/engine.py&lt;/code&gt; — voice-ID map, clone / rename / delete&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;backend/eleven.py&lt;/code&gt; — ElevenLabs client&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;frontend/index.html&lt;/code&gt; — PWA UI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;frontend/sw.js&lt;/code&gt; — offline cache&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;render.yaml&lt;/code&gt; + &lt;code&gt;Dockerfile&lt;/code&gt; — deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;FastAPI backend + single-file PWA frontend, deployed on Render free tier via Docker.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Voice: ElevenLabs v4 Instant Voice Cloning. Upload a few 10–25s clips from their old recordings → backend clones once, reuses that voice ID for all 3 languages. 18 presets pre-generated per speaker, cached on server + service worker for instant taps. Custom text synthesizes in a few seconds when warm (longer on a cold free-tier start), MP3 download capped at 350 KB.&lt;/li&gt;
&lt;li&gt;Privacy without login: random &lt;code&gt;amar_uid&lt;/code&gt; in &lt;code&gt;localStorage&lt;/code&gt;, clips + voice-ID map + presets namespaced per device. &lt;code&gt;default&lt;/code&gt; is shared, everything else is device-private.&lt;/li&gt;
&lt;li&gt;Guardrails: 10 clips / 800 KB per clip / 2-min caps, per-IP rate limits on paid endpoints, atomic cache writes, honest 404s (never serves another voice on failure).&lt;/li&gt;
&lt;li&gt;Open pieces: FastAPI, Pydantic, Uvicorn, pydub + ffmpeg, vanilla JS PWA with service worker, Docker — all open-source, and the repo is open for anyone to self-host with their own API key.&lt;/li&gt;
&lt;li&gt;Problems faced: local models sounded distant from the real voice → moved to cloud, kept offline cache for presets; built for one friend but shipped per-device spaces so other families can reuse it; Render free idle wipes server voices (phone keeps ID, sees only &lt;code&gt;default&lt;/code&gt;) — needs paid disk or external store.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The parts that make this shippable and forkable are open: anyone can clone the repo, &lt;code&gt;cp .env.example .env&lt;/code&gt;, deploy the same Dockerfile to Render, and have it running for their own family in minutes — no app-store review, no proprietary client, no accounts to manage.&lt;/p&gt;

&lt;p&gt;That mattered practically: I swapped the entire voice backend (local → ElevenLabs) without touching the PWA, added per-device spaces with no auth service, and kept it runnable on a 512 MB free tier because ffmpeg/pydub/FastAPI are hackable. What I'd open next: a local-model fallback so custom speech works fully offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;li&gt;Best Use of ElevenLabs&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
