<?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>Forem: Elispeak</title>
    <description>The latest articles on Forem by Elispeak (@elispeak111).</description>
    <link>https://forem.com/elispeak111</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3896178%2F93425463-2411-445b-b8a6-09accb2352f0.png</url>
      <title>Forem: Elispeak</title>
      <link>https://forem.com/elispeak111</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/elispeak111"/>
    <language>en</language>
    <item>
      <title>I built an AI English speaking coach — what was technically hard</title>
      <dc:creator>Elispeak</dc:creator>
      <pubDate>Fri, 24 Apr 2026 14:24:57 +0000</pubDate>
      <link>https://forem.com/elispeak111/i-built-an-ai-english-speaking-coach-what-was-technically-hard-3m25</link>
      <guid>https://forem.com/elispeak111/i-built-an-ai-english-speaking-coach-what-was-technically-hard-3m25</guid>
      <description>&lt;p&gt;I spent the past year building &lt;a href="https://elispeak.com" rel="noopener noreferrer"&gt;Elispeak&lt;/a&gt;, an AI English speaking coach. The user-facing pitch is simple — talk to an AI tutor, get instant pronunciation and fluency feedback, practice TOEFL / IELTS / CELPIP speaking tasks on demand. Under the hood, a few things turned out to be much harder than I expected.&lt;/p&gt;

&lt;p&gt;This is a note to myself, and to anyone else building voice-first language tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Real-time ASR + scoring latency is the whole product
&lt;/h2&gt;

&lt;p&gt;The promise of "instant feedback" falls apart at 4 seconds of latency. At 1.5 seconds it feels like a person listening. At 3.5 it feels like a slow API. The user's confidence between "I spoke well" and "I messed up" is destroyed by the gap.&lt;/p&gt;

&lt;p&gt;Getting from end-of-utterance to a scored result — not just transcription, but pronunciation and fluency features — meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;streaming ASR instead of batch, with interim hypotheses used to start downstream work before the final transcript arrives&lt;/li&gt;
&lt;li&gt;precomputing a phoneme-alignment path so pronunciation scoring can start as soon as the audio chunk lands, not after the full sentence&lt;/li&gt;
&lt;li&gt;scoring features (pace, filler-word density, stress timing) computed on the audio stream, not derived post-hoc from the transcript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second-order effect: every piece of UI has to be reactive too. If feedback lands in 1.2s but the UI repaints every 500ms, the user perceives 1.7s. Shaving animation blocking time ended up mattering almost as much as the model pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Exam rubrics are not a prompt — they are a protocol
&lt;/h2&gt;

&lt;p&gt;TOEFL Independent Speaking, IELTS Part 2, CELPIP Task 4 each have published rubrics. It is tempting to drop the rubric into a system prompt and call it done. It is not done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timing windows matter more than content.&lt;/strong&gt; TOEFL gives 15 seconds to prepare and 45 to speak. A "perfect answer" that runs 38 seconds is actually worse at the exam than a B+ answer at 44 seconds. The coach has to grade with that tension in mind, not just on transcript quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exam-safe framing is a legal surface.&lt;/strong&gt; You cannot say "this is your TOEFL score." You can say "a tutor applying the public band descriptors might score this around 23-25 of 30." That framing has to be in every response, not just onboarding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample answers drift.&lt;/strong&gt; A stable system prompt with drifting base-model behavior produces drifting feedback. I had to pin model versions per exam mode and run weekly evals on held-out recordings to catch regression.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat each exam mode as its own small product with its own eval set, not one mode with a different prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. TTS voices that don't sound robotic are half the battle
&lt;/h2&gt;

&lt;p&gt;Students do not want to roleplay with a voice that sounds like a call-center IVR. The moment the voice feels synthetic, the emotional bar for opening their mouth goes up — and you just lost the session.&lt;/p&gt;

&lt;p&gt;What actually helped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;neural voices tuned for conversational English, not neutral narration&lt;/li&gt;
&lt;li&gt;varying pacing and pause patterns per scenario (airport interview is clipped and fast; therapy-style friend chat has longer pauses and more um / yeah / okay fillers)&lt;/li&gt;
&lt;li&gt;supporting accent diversity so the student practices comprehension, not just production&lt;/li&gt;
&lt;li&gt;lip-sync style micro-delays — the tutor reacts a beat late, like a human would, not instantly like a bot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the engineering side, this meant a voice persona config per AI tutor character (we ship multiple tutors) and keeping the latency budget from Section 1 intact while adding TTS synthesis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack and trade-offs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ASR&lt;/strong&gt;: streaming provider with word-level timestamps and phoneme probabilities. Interim hypotheses + confidence scores shaped more of the architecture than raw accuracy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoring&lt;/strong&gt;: pronunciation on phoneme-level features and edit distance vs. expected; fluency on stream-level features (pace, filler rate, pause distribution); content via an LLM pass scoped to rubric criteria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM&lt;/strong&gt;: one pinned model per exam mode, with eval regression suite before upgrading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTS&lt;/strong&gt;: neural conversational voices, persona config per tutor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: WebRTC for capture, progressive UI updates keyed to pipeline stages so partial results feel immediate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trade-offs that bit me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optimizing for end-to-end latency means giving up some scoring quality per step; I keep having to rebalance the two&lt;/li&gt;
&lt;li&gt;picking "one best voice" per tutor is false economy — students attach to specific voices and churn when you change them&lt;/li&gt;
&lt;li&gt;rubrics are a moving target; budget time to rerun evals after any provider upgrade&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I would build differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Invest in the eval loop before the product surface. Most debugging pain in months 4-8 traced back to missing eval coverage, not missing features.&lt;/li&gt;
&lt;li&gt;Do not ship more than two exam modes until the first two are clean. More modes means more eval sets means more drift surface.&lt;/li&gt;
&lt;li&gt;Pay for a proper observability stack earlier. Custom logging runs out of road faster than you expect on a voice pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you want to kick the tires, there is a free tier at &lt;a href="https://elispeak.com" rel="noopener noreferrer"&gt;elispeak.com&lt;/a&gt;. Paid plans are 50% off with code &lt;strong&gt;ELISPEAK50&lt;/strong&gt; — no minimum, works on any plan.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://app.elispeak.com/plan?promoId=promo_1TPkURDWds7e1FfDHk3YG84w&amp;amp;promoCode=ELISPEAK50&amp;amp;utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=ELISPEAK50_launch_2026_04" rel="noopener noreferrer"&gt;Start practicing — 50% off any plan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer questions in the comments — especially on ASR pipeline design and rubric evals.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
