<?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: Vocloner</title>
    <description>The latest articles on DEV Community by Vocloner (@vocloner).</description>
    <link>https://dev.to/vocloner</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%2F4215495%2F21970c44-e196-4ab8-8865-b493c69cdb27.png</url>
      <title>DEV Community: Vocloner</title>
      <link>https://dev.to/vocloner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vocloner"/>
    <language>en</language>
    <item>
      <title>How inline emotion tags change text-to-speech output</title>
      <dc:creator>Vocloner</dc:creator>
      <pubDate>Thu, 29 Oct 2026 15:09:17 +0000</pubDate>
      <link>https://dev.to/vocloner/how-inline-emotion-tags-change-text-to-speech-output-19h8</link>
      <guid>https://dev.to/vocloner/how-inline-emotion-tags-change-text-to-speech-output-19h8</guid>
      <description>&lt;p&gt;Most text-to-speech integrations treat delivery as a settings problem. You pick a voice, then you set a speed value, a pitch value, and a style label from a fixed list. That works for a paragraph. It breaks the moment one paragraph needs two emotions.&lt;/p&gt;

&lt;p&gt;I build a voice tool, so I have spent a lot of time on this problem. Here is the design I ended up with, and what it costs to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tag lives in the text
&lt;/h2&gt;

&lt;p&gt;Instead of a global style, the direction sits inside the sentence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[excited] We shipped it.
[whispering] Nobody knows yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things follow from that choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Direction is local.&lt;/strong&gt; A tag changes the delivery of the next clause, not the whole take. One generation covers a paragraph that starts calm and ends loud, so you stop splicing five renderings together in an audio editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The script stays the source of truth.&lt;/strong&gt; A style label lives in a dropdown and disappears from the file. A tag lives in the text, so it survives a copy-paste, a review, and a diff. When a co-writer edits the sentence, the direction moves with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The tag list becomes a small language.&lt;/strong&gt; You need a fixed vocabulary: excited, whispering, sad, laughing, sighing. A free-text instruction such as "make it warmer" is not testable. A vocabulary of twelve tags is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model support is uneven.&lt;/strong&gt; A tag the model does not know is silently dropped, and the line reads flat. That failure is invisible in a waveform, so the tool has to show which tags the current model honours, and the writer has to listen to the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Counting characters gets harder.&lt;/strong&gt; Tags are not speech, so the text splitter must strip them before it counts, and the billing counter must ignore them. If you charge by character, a user who writes &lt;code&gt;[whispering]&lt;/code&gt; ten times must not pay for the extra characters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two systems edit the same string.&lt;/strong&gt; The editor highlights tags, the synthesiser consumes them, the export writes them back. Every one of those paths needs the same parser, or the tags drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multilingual is close, not exact
&lt;/h2&gt;

&lt;p&gt;One voice can read the same script in Spanish, English and Portuguese and keep its timbre. It is close, not identical: vowels carry accent, and a voice cloned in Spanish will read German with a trace of it. Say that in the product, not in the small print. People forgive an accent. They do not forgive a promise you did not keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consent belongs in the same flow
&lt;/h2&gt;

&lt;p&gt;In a cloning tool the risk is not the model, it is the use. Two rules are cheap to build and they change the product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new voice starts private, and publishing it needs an explicit consent step.&lt;/li&gt;
&lt;li&gt;Generated audio can carry a forensic mark before delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither rule makes the product safe by itself. Both make the careless case harder to reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to use tags
&lt;/h2&gt;

&lt;p&gt;If you need a stable, neutral read for a long narration, tags add nothing. Set the voice, write clean sentences, and leave the text alone. The feature earns its place only when the delivery changes inside the paragraph.&lt;/p&gt;




&lt;p&gt;I built this into &lt;a href="https://vocloner.org" rel="noopener noreferrer"&gt;Vocloner&lt;/a&gt;, a browser voice cloning and text-to-speech studio. There is a free plan, and the tags work the same way in the API and in the MCP server. If you have shipped a similar editor, I would like to know how you handled the splitter problem above.&lt;/p&gt;

</description>
      <category>code</category>
      <category>softwaredevelopment</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
