feat(voice): add admin-configurable elevenlabs tts

This commit is contained in:
Yera All
2026-04-11 16:46:43 +05:00
parent 9d0b76deca
commit fc976804e4
14 changed files with 1342 additions and 32 deletions
+138
View File
@@ -36,6 +36,7 @@
<a class="nav-link" href="#routes"><span class="nav-bullet"></span>Маршрутизация</a>
<a class="nav-link" href="#ivr"><span class="nav-bullet"></span>IVR</a>
<a class="nav-link" href="#voiceNameCollection"><span class="nav-bullet"></span>Voice AI</a>
<a class="nav-link" href="#voiceTtsConfig"><span class="nav-bullet"></span>Voice TTS</a>
<a class="nav-link" href="#asterisk"><span class="nav-bullet"></span>Asterisk</a>
</div>
</nav>
@@ -326,6 +327,143 @@
<pre id="voiceNameConfigOutput" class="output">Raw payload voice name collection появится здесь.</pre>
</article>
<article class="panel reveal" id="voiceTtsConfig">
<h2>Voice AI: TTS</h2>
<p class="hint">Выберите провайдера и голоса для RU и KZ. Для ElevenLabs в поле голоса хранится voice ID, для Brian уже есть готовый preset.</p>
<pre id="voiceTtsSummary" class="output">Сводка по voice TTS появится здесь.</pre>
<div class="inline-form split-two">
<label>
Активный провайдер
<select id="voiceTtsProvider">
<option value="yandex">Yandex SpeechKit</option>
<option value="elevenlabs">ElevenLabs</option>
<option value="openai">OpenAI</option>
</select>
</label>
<div class="hint">RU и KZ можно настроить отдельно, а провайдер переключать из админки без правки env.</div>
</div>
<div class="row">
<label>Yandex</label>
<div class="inline-form split-two">
<label>
RU preset
<select id="voiceTtsYandexRuVoicePreset"></select>
</label>
<label>
RU voice
<input id="voiceTtsYandexRuVoice" placeholder="jane" />
</label>
</div>
<div class="inline-form split-two">
<label>
KZ preset
<select id="voiceTtsYandexKzVoicePreset"></select>
</label>
<label>
KZ voice
<input id="voiceTtsYandexKzVoice" placeholder="amira" />
</label>
</div>
</div>
<div class="row">
<label>ElevenLabs</label>
<div class="inline-form split-two">
<label>
RU preset
<select id="voiceTtsElevenRuVoicePreset"></select>
</label>
<label>
RU voice ID
<input id="voiceTtsElevenRuVoice" placeholder="nPczCjzI2devNBz1zQrb" />
</label>
</div>
<div class="inline-form split-two">
<label>
RU model
<input id="voiceTtsElevenRuModel" placeholder="eleven_v3" />
</label>
<label>
RU language_code
<input id="voiceTtsElevenRuLanguageCode" placeholder="ru" />
</label>
</div>
<div class="inline-form split-two">
<label>
KZ preset
<select id="voiceTtsElevenKzVoicePreset"></select>
</label>
<label>
KZ voice ID
<input id="voiceTtsElevenKzVoice" placeholder="nPczCjzI2devNBz1zQrb" />
</label>
</div>
<div class="inline-form split-two">
<label>
KZ model
<input id="voiceTtsElevenKzModel" placeholder="eleven_v3" />
</label>
<label>
KZ language_code
<input id="voiceTtsElevenKzLanguageCode" placeholder="kk" />
</label>
</div>
</div>
<div class="row">
<label>OpenAI</label>
<div class="inline-form split-two">
<label>
RU preset
<select id="voiceTtsOpenAiRuVoicePreset"></select>
</label>
<label>
RU voice
<input id="voiceTtsOpenAiRuVoice" placeholder="alloy" />
</label>
</div>
<div class="inline-form split-two">
<label>
RU model
<input id="voiceTtsOpenAiRuModel" placeholder="gpt-4o-mini-tts" />
</label>
<label>
RU language_code
<input id="voiceTtsOpenAiRuLanguageCode" placeholder="ru" />
</label>
</div>
<div class="inline-form split-two">
<label>
KZ preset
<select id="voiceTtsOpenAiKzVoicePreset"></select>
</label>
<label>
KZ voice
<input id="voiceTtsOpenAiKzVoice" placeholder="alloy" />
</label>
</div>
<div class="inline-form split-two">
<label>
KZ model
<input id="voiceTtsOpenAiKzModel" placeholder="gpt-4o-mini-tts" />
</label>
<label>
KZ language_code
<input id="voiceTtsOpenAiKzLanguageCode" placeholder="kz" />
</label>
</div>
</div>
<div class="actions compact-actions">
<button id="loadVoiceTtsConfigBtn" class="btn ghost">Загрузить настройки</button>
<button id="saveVoiceTtsConfigBtn" class="btn">Сохранить настройки</button>
<button id="resetVoiceTtsConfigBtn" class="btn ghost">Сбросить форму к текущим</button>
</div>
<pre id="voiceTtsConfigOutput" class="output">Raw payload voice TTS появится здесь.</pre>
</article>
<article class="panel reveal" id="asterisk">
<h2>Мост Asterisk</h2>
<p class="hint">Диагностика AMI-подключения, пересланных bridge-событий и ручного повтора.</p>