<?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: Pranesh Nikhar</title>
    <description>The latest articles on DEV Community by Pranesh Nikhar (@praneshnikhar).</description>
    <link>https://dev.to/praneshnikhar</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%2F4157339%2Fb72a24f1-1600-4e46-8e3d-56bcfeb9485b.jpg</url>
      <title>DEV Community: Pranesh Nikhar</title>
      <link>https://dev.to/praneshnikhar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/praneshnikhar"/>
    <language>en</language>
    <item>
      <title>I built a voice language tutor that lives on my friend's laptop</title>
      <dc:creator>Pranesh Nikhar</dc:creator>
      <pubDate>Sat, 03 Oct 2026 21:11:51 +0000</pubDate>
      <link>https://dev.to/praneshnikhar/i-built-a-voice-language-tutor-that-lives-on-my-friends-laptop-5g2m</link>
      <guid>https://dev.to/praneshnikhar/i-built-a-voice-language-tutor-that-lives-on-my-friends-laptop-5g2m</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;A friend of mine is learning Spanish. They're not bad at it — they're &lt;em&gt;scared&lt;/em&gt; of it. Practicing with a real person means being wrong out loud, in front of another human, and that freezes them. Language apps feel like flashcards with a timer, not a conversation. And a tutor costs money they don't have.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Habla Conmigo&lt;/strong&gt; — a patient voice tutor that lives on their own laptop. You talk to it like a person: tap the mic, say whatever you want in Spanish (or half-Spanish, half-English, or completely stuck English), and it replies &lt;strong&gt;out loud&lt;/strong&gt;, gently correcting mistakes and keeping the conversation going.&lt;/p&gt;

&lt;p&gt;It solves the exact problem my friend had: a practice partner with zero judgment, infinite patience, and a memory that follows the conversation across turns.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/rMEPxz6QT_8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Live (deployed, UI + API — the model itself runs locally, by design): &lt;a href="https://habla-conmigo-sxfq.onrender.com/" rel="noopener noreferrer"&gt;habla-conmigo.onrender.com&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/praneshnikhar/hacktoberfest" rel="noopener noreferrer"&gt;github.com/praneshnikhar/hacktoberfest&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Three layers, one conversation loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Browser mic → ffmpeg&lt;/strong&gt; — the frontend records a webm blob; the server converts it to mp3 with ffmpeg.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs Scribe (STT)&lt;/strong&gt; — transcribes the audio, auto-detecting language so a stuck student can fall back to English mid-sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight model via Ollama (the tutor brain)&lt;/strong&gt; — the reply comes from a model running locally on the laptop (Llama 3.2 / Gemma 3), with a system prompt that makes it a &lt;em&gt;tutor&lt;/em&gt;: reply in the target language, keep it to 1–3 sentences, correct one mistake at a time, always end with a follow-up question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs TTS&lt;/strong&gt; — speaks the reply back in a warm multilingual voice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Conversation memory (last 8 turns) lives in the server, so the tutor follows topics across turns instead of starting fresh every sentence.&lt;/p&gt;

&lt;p&gt;The whole thing is ~700 lines of plain Node.js + Express + vanilla JS. No framework, no database, no cloud AI.&lt;/p&gt;

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

&lt;p&gt;This is the part I care about most, because the open pieces are &lt;em&gt;why the app exists at all&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A nervous learner's words never leave their machine.&lt;/strong&gt; The core of this app — the part that understands and replies — is an open-weight model running locally. A closed API would ship every halting, half-grammatical sentence of a shy person to a third-party server, and bill per message. Here it's free and private, and it even works offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in, swap any model in one line.&lt;/strong&gt; Because the brain is Ollama, changing the teacher is a one-line &lt;code&gt;.env&lt;/code&gt; change: Llama → Gemma → Qwen → whatever ships next. Try doing that with a closed model. This also means the tutor can be fine-tuned later for my friend's specific mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open where it matters, closed only where it adds value.&lt;/strong&gt; The one closed service (ElevenLabs) does one narrow thing — voice — and even that degrades gracefully: remove the API key and the app still works as a text tutor. The product doesn't collapse when the proprietary part is taken away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; The model is free, the runtime is free, the voice tier has a free plan. "Practicing a language" shouldn't have a subscription.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The counterfactual is what convinced me: with a closed model, I would have needed a paid API, an account per user, a data policy, and a conversation my friend couldn't afford to have.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Built end-to-end with the opencode agent harness (open-source CLI coding agent) driving the implementation, debugging, and this write-up.&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt; — an open-source agent given a voice: Scribe STT + multilingual TTS power the full conversational loop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — deployed via the included &lt;code&gt;render.yaml&lt;/code&gt; blueprint&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Tags: #devchallenge #weekendchallenge #hf26challenge&lt;/em&gt;&lt;/p&gt;

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