<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://wwoss.ru/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>worldwide open-source software - local_silero_tts</title>
        <description></description>
        <link>https://wwoss.ru/</link>
        <lastBuildDate>Thu, 30 Jul 2026 20:29:41 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>https://wwoss.ru/lib/exe/fetch.php?media=wiki:logo.png</url>
            <title>worldwide open-source software</title>
            <link>https://wwoss.ru/</link>
        </image>
        <item>
            <title>config.json</title>
            <link>https://wwoss.ru/doku.php?id=local_silero_tts:config.json&amp;rev=1785320357</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;configjson&quot;&gt;config.json&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;https://wwoss.ru/doku.php?do=export_code&amp;amp;id=local_silero_tts:config.json&amp;amp;codeblock=0&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_json&quot;&gt;config.json&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code css&quot;&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span class=&quot;st0&quot;&gt;&amp;quot;voice_settings&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;speaker&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;baya&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;speed&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;volume_multiplier&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1.0&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;st0&quot;&gt;&amp;quot;custom_punctuation&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot; - &amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;!!!&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;!&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;??&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;?&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;st0&quot;&gt;&amp;quot;word_replacements&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;дверной замок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;дверной зам+ок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;каменный замок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;каменный з+амок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;древний замок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;древний з+амок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;веб&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;вэб&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;web&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;вэб&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;замок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;зам+ок&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;на двери&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;на две+ри&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;у двери&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;у дв+ери&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;st0&quot;&gt;&amp;quot;тестирую&amp;quot;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st0&quot;&gt;&amp;quot;тэст+ирую&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 29 Jul 2026 10:19:17 +0000</pubDate>
        </item>
        <item>
            <title>index.html</title>
            <link>https://wwoss.ru/doku.php?id=local_silero_tts:index.html&amp;rev=1785320124</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;indexhtml&quot;&gt;index.html&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;https://wwoss.ru/doku.php?do=export_code&amp;amp;id=local_silero_tts:index.html&amp;amp;codeblock=0&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_html&quot;&gt;index.html&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code html4strict&quot;&gt;&lt;span class=&quot;sc0&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/html.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;html&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;ru&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/head.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;head&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/meta.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;meta&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/title.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;Локальный Silero TTS&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/title.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/style.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;style&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
        body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; background: #f4f4f9; }
        textarea { width: 100%; height: 250px; padding: 10px; font-size: 16px; border-radius: 5px; border: 1px solid #ccc; box-sizing: border-box; }
        select, button { padding: 10px 20px; font-size: 16px; margin-top: 15px; border-radius: 5px; border: none; cursor: pointer; }
        button { background: #28a745; color: white; font-weight: bold; }
        button:disabled { background: #ccc; }
        #status { margin-top: 15px; color: #555; font-style: italic; }
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/style.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;style&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/head.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;head&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/body.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;body&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/h1.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;h1&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;Локальный русский голос (Silero v5)&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/h1.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;h1&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/textarea.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;textarea&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;text-input&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Привет! На двери висит дверной замок, а в поле стоит каменный замок. Озвучь это.&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/textarea.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;textarea&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/label.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;label&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;speaker-select&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Голос:&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/label.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;label&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/select.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;select&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;speaker-select&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;baya&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Зая (Женский унизительный)&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;kseniya&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Ксения (Женский стандарт)&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;eugene&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Евгений (Мужской диктор)&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;aidar&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Айдар (Мужской мягкий)&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/option.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;option&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/select.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;select&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;
&amp;nbsp;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/button.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;button&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;say-btn&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Озвучить текст&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/button.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;button&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/br.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;br&lt;/span&gt;&lt;/a&gt;&amp;gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/br.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;br&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;audio &lt;span class=&quot;kw3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;audio-player&amp;quot;&lt;/span&gt; controls &lt;span class=&quot;kw3&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;width: 100%;&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;audio&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;div&lt;/span&gt;&lt;/a&gt; &lt;span class=&quot;kw3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;Готов к работе&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/div.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;div&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;a href=&quot;http://december.com/html/4/element/script.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;script&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
        const btn = document.getElementById(&#039;say-btn&#039;);
        const status = document.getElementById(&#039;status&#039;);
        const player = document.getElementById(&#039;audio-player&#039;);
&amp;nbsp;
        btn.addEventListener(&#039;click&#039;, () =&amp;gt; {
            const text = encodeURIComponent(document.getElementById(&#039;text-input&#039;).value);
            const speaker = document.getElementById(&#039;speaker-select&#039;).value;
&amp;nbsp;
            btn.disabled = true;
            status.innerText = &amp;quot;Воспроизведение звука...&amp;quot;;
&amp;nbsp;
            // Прямая трансляция потока байт в плеер без создания файлов на диске!
            player.src = `http://localhost:3000/api/stream-audio?text=${text}&lt;span class=&quot;sc1&quot;&gt;&amp;amp;speaker=${speaker}&amp;amp;t=${Date.now()}`;&lt;/span&gt;
            player.play();
&amp;nbsp;
            player.onended = () =&amp;gt; {
                status.innerText = &amp;quot;Готово!&amp;quot;;
                btn.disabled = false;
            };
        });
    &lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/script.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;script&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/body.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;body&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc2&quot;&gt;&amp;lt;&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;a href=&quot;http://december.com/html/4/element/html.html&quot;&gt;&lt;span class=&quot;kw2&quot;&gt;html&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 29 Jul 2026 10:15:24 +0000</pubDate>
        </item>
        <item>
            <title>server.js</title>
            <link>https://wwoss.ru/doku.php?id=local_silero_tts:server.js&amp;rev=1785320186</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;serverjs&quot;&gt;server.js&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;https://wwoss.ru/doku.php?do=export_code&amp;amp;id=local_silero_tts:server.js&amp;amp;codeblock=0&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_js&quot;&gt;server.js&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code js&quot;&gt;const express = require(&#039;express&#039;);
const cors = require(&#039;cors&#039;);
const { spawn } = require(&#039;child_process&#039;);
const path = require(&#039;path&#039;);
const fs = require(&#039;fs&#039;);
const axios = require(&#039;axios&#039;);
&amp;nbsp;
const app = express();
app.use(cors());
app.use(express.json());
&amp;nbsp;
app.get(&#039;/&#039;, (req, res) =&amp;gt; {
    res.sendFile(path.join(__dirname, &#039;index.html&#039;));
});
&amp;nbsp;
const pythonProcess = spawn(&#039;python&#039;, [&#039;tts.py&#039;]);
pythonProcess.stdout.on(&#039;data&#039;, (data) =&amp;gt; console.log(`Python: ${data}`));
pythonProcess.stderr.on(&#039;data&#039;, (data) =&amp;gt; console.log(`Python System: ${data}`));
&amp;nbsp;
app.get(&#039;/api/stream-audio&#039;, async (req, res) =&amp;gt; {
    const text = req.query.text || &amp;quot;Привет&amp;quot;;
    const speaker = req.query.speaker || &amp;quot;baya&amp;quot;;
&amp;nbsp;
    try {
        await axios.post(&#039;http://127.0.0.1:5000&#039;, { text, speaker });
        const filePath = path.join(__dirname, &#039;test.wav&#039;);
&amp;nbsp;
        if (fs.existsSync(filePath)) {
            res.set(&#039;Content-Type&#039;, &#039;audio/wav&#039;);
            const stream = fs.createReadStream(filePath);
            stream.pipe(res);
        } else {
            res.status(404).send(&#039;Файл не найден&#039;);
        }
    } catch (error) {
        console.error(error);
        res.status(500).send(&#039;Ошибка генерации&#039;);
    }
});
&amp;nbsp;
app.listen(3000, () =&amp;gt; console.log(&#039;Сервер запущен на http://localhost:3000&#039;));&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 29 Jul 2026 10:16:26 +0000</pubDate>
        </item>
        <item>
            <title>tts.py</title>
            <link>https://wwoss.ru/doku.php?id=local_silero_tts:tts.py&amp;rev=1785320465</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;ttspy&quot;&gt;tts.py&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;dl class=&quot;code&quot;&gt;
&lt;dt&gt;&lt;a href=&quot;https://wwoss.ru/doku.php?do=export_code&amp;amp;id=local_silero_tts:tts.py&amp;amp;codeblock=0&quot; title=&quot;Скачать фрагмент кода&quot; class=&quot;mediafile mf_py&quot;&gt;tts.py&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;pre class=&quot;code py&quot;&gt;import warnings
warnings.filterwarnings(&amp;quot;ignore&amp;quot;, category=UserWarning)
&amp;nbsp;
import os
import sys
import torch
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import re
from num2words import num2words
&amp;nbsp;
language = &#039;ru&#039;
device = torch.device(&#039;cpu&#039;)
model_path = &amp;quot;./v5_ru.pt&amp;quot;
&amp;nbsp;
print(&amp;quot;Инициализация стабильной локальной модели Silero...&amp;quot;)
if not os.path.exists(model_path):
    print(&amp;quot;КРИТИЧЕСКАЯ ОШИБКА: Файл v5_ru.pt не найден!&amp;quot;)
    sys.exit(1)
&amp;nbsp;
model = torch.package.PackageImporter(model_path).load_pickle(&amp;quot;tts_models&amp;quot;, &amp;quot;model&amp;quot;)
model.to(device)
print(&amp;quot;ИИ-процессор звука полностью готов к работе!&amp;quot;)
&amp;nbsp;
# Расширенная база для чтения латиницы
# Умный словарь частых слов (чтобы читались красиво, а не просто побуквенно)
ENG_PHONETIC = {
    &#039;hello&#039;: &#039;хэллоу&#039;, &#039;hi&#039;: &#039;хай&#039;, &#039;ai&#039;: &#039;эай&#039;, &#039;js&#039;: &#039;джей эс&#039;, &#039;php&#039;: &#039;пи эйч пи&#039;,
    &#039;python&#039;: &#039;пайтон&#039;, &#039;google&#039;: &#039;гугл&#039;, &#039;ok&#039;: &#039;окей&#039;, &#039;yes&#039;: &#039;йес&#039;, &#039;no&#039;: &#039;ноу&#039;,
    &#039;javascript&#039;: &#039;джаваскрипт&#039;, &#039;node.js&#039;: &#039;ноуд джей эс&#039;, &#039;node&#039;: &#039;ноуд&#039;,
    &#039;apple&#039;: &#039;эпл&#039;, &#039;microsoft&#039;: &#039;майкрософт&#039;, &#039;windows&#039;: &#039;виндоус&#039;, &#039;server&#039;: &#039;сервер&#039;,
    &#039;code&#039;: &#039;код&#039;, &#039;project&#039;: &#039;проджект&#039;, &#039;file&#039;: &#039;файл&#039;, &#039;text&#039;: &#039;текст&#039;
}
&amp;nbsp;
# Карта перевода отдельных английских букв и буквосочетаний в русские слоги
ENGLISH_TO_RUSSIAN_ABC = {
    &#039;ch&#039;: &#039;ч&#039;, &#039;sh&#039;: &#039;ш&#039;, &#039;th&#039;: &#039;ф&#039;, &#039;ph&#039;: &#039;ф&#039;, &#039;ee&#039;: &#039;и&#039;, &#039;oo&#039;: &#039;у&#039;, &#039;ea&#039;: &#039;и&#039;,
    &#039;a&#039;: &#039;э&#039;, &#039;b&#039;: &#039;б&#039;, &#039;c&#039;: &#039;к&#039;, &#039;d&#039;: &#039;д&#039;, &#039;e&#039;: &#039;е&#039;, &#039;f&#039;: &#039;ф&#039;, &#039;g&#039;: &#039;г&#039;, &#039;h&#039;: &#039;х&#039;,
    &#039;i&#039;: &#039;ай&#039;, &#039;j&#039;: &#039;дж&#039;, &#039;k&#039;: &#039;к&#039;, &#039;l&#039;: &#039;л&#039;, &#039;m&#039;: &#039;м&#039;, &#039;n&#039;: &#039;н&#039;, &#039;o&#039;: &#039;о&#039;, &#039;p&#039;: &#039;п&#039;,
    &#039;q&#039;: &#039;кь&#039;, &#039;r&#039;: &#039;р&#039;, &#039;s&#039;: &#039;с&#039;, &#039;t&#039;: &#039;т&#039;, &#039;u&#039;: &#039;ю&#039;, &#039;v&#039;: &#039;в&#039;, &#039;w&#039;: &#039;в&#039;, &#039;x&#039;: &#039;икс&#039;,
    &#039;y&#039;: &#039;ай&#039;, &#039;z&#039;: &#039;з&#039;
}
&amp;nbsp;
def load_config():
    default_config = {&amp;quot;voice_settings&amp;quot;: {&amp;quot;speaker&amp;quot;: &amp;quot;baya&amp;quot;, &amp;quot;speed&amp;quot;: 1.0}, &amp;quot;word_replacements&amp;quot;: {}}
    if os.path.exists(&#039;config.json&#039;):
        try:
            with open(&#039;config.json&#039;, &#039;r&#039;, encoding=&#039;utf-8&#039;) as f: return json.load(f)
        except: return default_config
    return default_config
&amp;nbsp;
def clean_and_normalize_text(text, config):
    text_clean = text.strip()
&amp;nbsp;
    # 1. Применяем замену пунктуации
    for old_punc, new_punc in config.get(&amp;quot;custom_punctuation&amp;quot;, {}).items():
        text_clean = text_clean.replace(old_punc, new_punc)
&amp;nbsp;
    # 2. Применяем контекстный словарь из config.json (ищем БЕЗ учета регистра)
    replacements = config.get(&amp;quot;word_replacements&amp;quot;, {})
    for phrase in sorted(replacements.keys(), key=len, reverse=True):
        pattern = re.compile(re.escape(phrase.strip()), re.IGNORECASE)
        # Подставляем точную строку из конфига (с сохранением ЗАГЛАВНЫХ букв-ударений)
        text_clean = pattern.sub(replacements[phrase], text_clean)
&amp;nbsp;
    # 3. Перевод цифр в слова
    def replace_num(match):
        try: return num2words(int(match.group()), lang=&#039;ru&#039;)
        except: return match.group()
    text_clean = re.sub(r&#039;\d+&#039;, replace_num, text_clean)
&amp;nbsp;
    # 4. Железный перевод английских слов (игнорируем регистр букв ввода)
    for eng_word, ru_word in ENG_PHONETIC.items():
        pattern = re.compile(r&#039;\b&#039; + re.escape(eng_word) + r&#039;\b&#039;, re.IGNORECASE)
        text_clean = pattern.sub(ru_word, text_clean)
&amp;nbsp;
    # Смываем оставшиеся одиночные английские буквы побуквенно для безопасности ИИ
    def replace_isolated_lat(match):
        char = match.group().lower()
        abc = {&#039;a&#039;:&#039;а&#039;,&#039;b&#039;:&#039;бэ&#039;,&#039;c&#039;:&#039;цэ&#039;,&#039;d&#039;:&#039;дэ&#039;,&#039;e&#039;:&#039;е&#039;,&#039;f&#039;:&#039;эф&#039;,&#039;g&#039;:&#039;джи&#039;,&#039;h&#039;:&#039;эйч&#039;,
               &#039;i&#039;:&#039;ай&#039;,&#039;j&#039;:&#039;джей&#039;,&#039;k&#039;:&#039;кэй&#039;,&#039;l&#039;:&#039;эль&#039;,&#039;m&#039;:&#039;эм&#039;,&#039;n&#039;:&#039;эн&#039;,&#039;o&#039;:&#039;о&#039;,&#039;p&#039;:&#039;пи&#039;,
               &#039;q&#039;:&#039;кью&#039;,&#039;r&#039;:&#039;эр&#039;,&#039;s&#039;:&#039;эс&#039;,&#039;t&#039;:&#039;ти&#039;,&#039;u&#039;:&#039;ю&#039;,&#039;v&#039;:&#039;ви&#039;,&#039;w&#039;:&#039;дабл ю&#039;,&#039;x&#039;:&#039;икс&#039;,&#039;y&#039;:&#039;уай&#039;,&#039;z&#039;:&#039;зет&#039;}
        return abc.get(char, char)
    text_clean = re.sub(r&#039;[a-zA-Z]&#039;, replace_isolated_lat, text_clean)
&amp;nbsp;
    # Убираем лишние пробелы перед отправкой в нейросеть
    text_clean = re.sub(r&#039;\s+&#039;, &#039; &#039;, text_clean)
    return text_clean
&amp;nbsp;
class TTSHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers[&#039;Content-Length&#039;])
        post_data = json.loads(self.rfile.read(content_length).decode(&#039;utf-8&#039;))
&amp;nbsp;
        raw_text = post_data.get(&#039;text&#039;, &#039;&#039;)
        base_speaker = post_data.get(&#039;speaker&#039;, &#039;baya&#039;)
        if base_speaker not in [&#039;aidar&#039;, &#039;baya&#039;, &#039;kseniya&#039;, &#039;eugene&#039;, &#039;xenia&#039;]:
            base_speaker = &#039;baya&#039;
&amp;nbsp;
        config = load_config()
        txt = clean_and_normalize_text(raw_text, config)
        print(f&amp;quot;[ИИ-Синтез] Итоговый текст для Silero: &#039;{txt}&#039; [Голос: {base_speaker}]&amp;quot;)
&amp;nbsp;
        # Модель читает заглавные русские буквы как жесткие ударения
        model.save_wav(text=txt, speaker=base_speaker, sample_rate=48000, put_accent=True, put_yo=True)
&amp;nbsp;
        self.send_response(200)
        self.send_header(&#039;Content-type&#039;, &#039;application/json&#039;)
        self.end_headers()
        self.wfile.write(json.dumps({&amp;quot;status&amp;quot;: &amp;quot;SUCCESS&amp;quot;}).encode(&#039;utf-8&#039;))
&amp;nbsp;
if __name__ == &amp;quot;__main__&amp;quot;:
    server = HTTPServer((&#039;127.0.0.1&#039;, 5000), TTSHandler)
    server.serve_forever()&lt;/pre&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 29 Jul 2026 10:21:05 +0000</pubDate>
        </item>
    </channel>
</rss>
