<?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: Om Deglurkar</title>
    <description>The latest articles on DEV Community by Om Deglurkar (@ominator).</description>
    <link>https://dev.to/ominator</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%2F4129638%2Fe04905db-bea1-4e23-9a1d-db55eb91d020.jpg</url>
      <title>DEV Community: Om Deglurkar</title>
      <link>https://dev.to/ominator</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ominator"/>
    <language>en</language>
    <item>
      <title>I Built an AI Agent That Talks Like Me. Here's What Actually Broke.</title>
      <dc:creator>Om Deglurkar</dc:creator>
      <pubDate>Thu, 17 Sep 2026 10:27:12 +0000</pubDate>
      <link>https://dev.to/ominator/i-built-an-ai-agent-that-talks-like-me-heres-what-actually-broke-5apl</link>
      <guid>https://dev.to/ominator/i-built-an-ai-agent-that-talks-like-me-heres-what-actually-broke-5apl</guid>
      <description>&lt;p&gt;I wanted to find out how far I could go in testing a voice agent before it ceased to seem like a demo and began to seem like &lt;em&gt;me&lt;/em&gt;. Not something that has a human-sounding voice — I mean an agent that talks, thinks, and arranges things the way I actually do, using my own way of speaking, my own catchphrases, and my own method of hedging a sentence.&lt;/p&gt;

&lt;p&gt;It's a lot more difficult than it appears, and the main source of the difficulty is not in the place one would anticipate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;For the stack, I recorded around 40 minutes of my own voice—comprising scripted statements to ensure coverage of all phonemes and unscripted, loose remarks to achieve a natural speaking rhythm and to include filler words—then fed this material into a voice model that had been finely tuned on Cartesia, with Vapi being used to orchestrate the process and Twilio taking care of the phone functionality. Additionally, I created a prompt pipeline using my resume and project history so that the agent would be able to talk knowledgeably about my background rather than inventing a version of me that doesn't exist.&lt;/p&gt;

&lt;p&gt;Putting the 80% together was a matter of wiring the various components together. The agent framework provided by Vapi deals with a lot of the call orchestration right from the start—such as detecting when a call is being made, feeding the speech recognition output continuously into the LLM, and then sending the response back out to Cartesia for synthesis. The framework, however, does not deal with anything that has to do with &lt;em&gt;sounding like a specific person&lt;/em&gt;, and it is in this area that the bulk of my actual work consisted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it actually got hard
&lt;/h2&gt;

&lt;p&gt;No one ever tells you this about voice agents, namely that it's not difficult to get the model to be correct. What is difficult instead is achieving the right rhythm in a conversation—knowing when to speak and when to remain silent, and how to deal with an interruption without sounding as if you're operating like a faulty IVR system. Some of the specific problems I encountered were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent would interrupt by speaking before I had actually finished my sentence. Vapi's default method of detecting when to end a turn (which is based on silence) regards any pause of more than a few hundred milliseconds as a signal that 'your turn has ended' — this works all right in the case of brief exchanges but is不利 for people who pause while thinking.
– The cloned voice had a most unnaturally flat tone when giving longer answers. Although Cartesia's model did a good job of reproducing my timbre, it failed to replicate my real cadence, since it read out multi-sentence replies in a monotone that didn't match the way I actually delivered them, particularly when using filler phrases and asides.
– The language model always provided excessive explanations by default. When left unimpeded, it responded to every question in the manner of a formal biography rather than as I would when having a casual conversation. It continuously included qualifiers and reservations that I wouldn't actually make when speaking casually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I decided to set the endpointing thresholds on a per-context basis (increasing the tolerance for longer pauses when generating 'thinking' responses), to divide longer answers into shorter, more conversational segments with natural pauses between them rather than using a single long TTS pass, and I modified the system prompt to clearly advise the use of brief and informal language, including examples of the way I actually speak, rather than giving the generic instruction to 'be conversational'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Simplified&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;example&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;endpointing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;override&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Vapi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"responseDelaySeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"llmRequestDelaySeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numWordsToInterruptAssistant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpointing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"silenceTimeoutSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The part I'm still not happy with
&lt;/h2&gt;

&lt;p&gt;I am not entirely satisfied with the way interruption handling has been implemented. Although it works fine in a straightforward conversation where only one person speaks at a time, it still sometimes cuts itself off in the middle of a sentence when I make a minor acknowledgent such as 'mm' or 'yeah' while it is speaking — the system interprets any sound as an interruption signal and does not manage to tell the difference between backchannel noises and a real attempt by someone to take over the floor. To fix this properly would require training a lightweight classifier on the input audio rather than depending on raw voice-activity detection, even though I haven't yet built that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this mattered to me
&lt;/h2&gt;

&lt;p&gt;Most demonstrations of 'AI clones' are just gimmicks—theming a voice filter onto a standard chatbot. I wanted to find out whether a truly personalised, real-time voice agent could be built by a single person using off-the-shelf tools (Vapi, Cartesia, Twilio) rather than by a team employing custom TTS infrastructure. The straightforward answer is that mostly yes, but the final 20 per cent—getting it to feel like a &lt;em&gt;person&lt;/em&gt; rather than just a &lt;em&gt;feature&lt;/em&gt;—accounted for most of the actual work.&lt;/p&gt;

&lt;p&gt;The final 20% when you're developing something which involves an AI having a real-time conversation is what makes the difference.&lt;/p&gt;




&lt;p&gt;When constructing something similar, focus on the conversational rhythm before you deal with the voice model since it's the element that really decides whether it comes across as alive.&lt;/p&gt;

&lt;p&gt;If you're planning to build something similar, please feel free to exchange ideas — you can get in touch with me at &lt;a href="mailto:deglurkarom@gmail.com"&gt;deglurkarom@gmail.com&lt;/a&gt; or at github.com/deglurkarom-dev.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>voiceai</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
