feat(radio): replace robot TTS with Piper Neural voices & add instant voice preview

- Integrate local Piper ONNX neural TTS engine (Dmitri, Irina, Denis, Ruslan)
- Add GET /api/radio/preview-voice endpoint with cached pre-rendered samples
- Add '▶ Прослушать голос' button in Web UI for 1-click preview before generating
- Add automated filter to strip LLM refusals and fall back to clean radio phrasing
This commit is contained in:
Antigravity committed 2026-10-12 16:58:59 +03:00
1 parent e5afeb06cc
commit 4ed8e0c71a
7 files changed
+183 -24

No files matched your search

+10 -4
View File
@@ -147,7 +147,7 @@
<section class="card radio-card">
<div class="radio-header">
<div class="radio-header-title">
<h2>🎙️ AI Радио <span class="badge badge-radio">AI DJ Эфир</span> <span class="badge badge-llm">🤖 Qwen 2.5 + Edge-TTS</span></h2>
<h2>🎙️ AI Радио <span class="badge badge-radio">AI DJ Эфир</span> <span class="badge badge-llm">🤖 Qwen 2.5 + Piper Neural</span></h2>
<p class="radio-subtitle">
Персональный радиоэфир: AI-ведущий объявляет погоду, время суток и делает динамичные подводки перед песнями в отдельном плейлисте «AI Радио».
</p>
@@ -159,12 +159,18 @@
<!-- Radio Host Voice & Context Row -->
<div class="radio-settings-row">
<div class="radio-voice-group">
<div class="radio-voice-group" style="flex-wrap: wrap;">
<label for="radioVoiceSelect" class="radio-voice-label">Голос ведущего:</label>
<select id="radioVoiceSelect" class="radio-voice-select">
<option value="ru-RU-DmitryNeural" selected>🎙️ Дмитрий (Харизматичный)</option>
<option value="ru-RU-SvetlanaNeural">🎙️ Светлана (Мягкий)</option>
<option value="ru_RU-dmitri-medium" selected>🎙️ Дмитрий (Энергичный DJ)</option>
<option value="ru_RU-irina-medium">🎙️ Ирина (Естественный женский)</option>
<option value="ru_RU-denis-medium">🎙️ Денис (Глубокий баритон)</option>
<option value="ru_RU-ruslan-medium">🎙️ Руслан (Спокойный ведущий)</option>
<option value="gtts_ru">🎙️ Google (Стандартный робот)</option>
</select>
<button id="radioVoicePreviewBtn" type="button" class="btn-sm btn-play-preview" title="Послушать сэмпл выбранного голоса">
▶ Прослушать голос
</button>
</div>
<div class="radio-status-badge-wrap">
<span id="radioStatusLabel" class="badge badge-context">Эфир готов к запуску</span>