Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -73,16 +73,15 @@ tokenizer = VoiceBpeTokenizer(vocab_file=vocab_file)
|
|
| 73 |
XTTS_MODEL.tokenizer = tokenizer
|
| 74 |
|
| 75 |
# ---------------------------------------------------------
|
| 76 |
-
# 4) Патокавая TTS
|
| 77 |
# ---------------------------------------------------------
|
| 78 |
@spaces.GPU(duration=60)
|
| 79 |
def text_to_speech(belarusian_story, speaker_audio_file=None):
|
| 80 |
"""
|
| 81 |
STREAMING-выхад для gr.Audio:
|
| 82 |
-
- на кожным кроку yield (sample_rate,
|
|
|
|
| 83 |
- у фінале yield шлях да temp-файла з поўным WAV (для загрузкі)
|
| 84 |
-
Gradio з autoplay=True пачынае прайграванне адразу пасля першага чанка.
|
| 85 |
-
Звярніце ўвагу: у некаторых браўзерах можа запатрабавацца 1-е ўзаемадзеянне карыстальніка (клік).
|
| 86 |
"""
|
| 87 |
if not belarusian_story or str(belarusian_story).strip() == "":
|
| 88 |
raise gr.Error("Увядзі хоць нейкі тэкст 🙂")
|
|
@@ -120,9 +119,8 @@ def text_to_speech(belarusian_story, speaker_audio_file=None):
|
|
| 120 |
except Exception as e:
|
| 121 |
raise gr.Error(f"Памылка пры падзеле тэксту на сказы: {e}")
|
| 122 |
|
| 123 |
-
|
| 124 |
|
| 125 |
-
# Важна хутка аддаць 1-ы чанк — гэта спрацуе autoplay
|
| 126 |
for text in tqdm(tts_texts):
|
| 127 |
try:
|
| 128 |
with torch.no_grad():
|
|
@@ -138,25 +136,23 @@ def text_to_speech(belarusian_story, speaker_audio_file=None):
|
|
| 138 |
top_p=0.3,
|
| 139 |
)
|
| 140 |
cur = wav_chunk["wav"].astype(np.float32)
|
|
|
|
| 141 |
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
else:
|
| 145 |
-
running_total = np.concatenate([running_total, cur], axis=0)
|
| 146 |
-
|
| 147 |
-
# STREAM: вяртаем назапашаны аўдыя-сігнал
|
| 148 |
-
yield (sampling_rate, running_total)
|
| 149 |
|
| 150 |
except Exception as e:
|
| 151 |
raise gr.Error(f"Памылка пры генерырацыі аўдыя: {e}")
|
| 152 |
|
| 153 |
-
if
|
| 154 |
raise gr.Error("Нічога не згенеравана. Праверце ўваходныя даныя.")
|
| 155 |
|
| 156 |
# Фінальны WAV у temp-файл — каб можна было спампаваць
|
| 157 |
try:
|
|
|
|
| 158 |
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
|
| 159 |
-
write(temp_file.name, sampling_rate,
|
|
|
|
| 160 |
yield temp_file.name
|
| 161 |
except Exception as e:
|
| 162 |
raise gr.Error(f"Памылка пры запісе фінальнага WAV: {e}")
|
|
@@ -202,7 +198,7 @@ analytics_script = """
|
|
| 202 |
"""
|
| 203 |
|
| 204 |
# ---------------------------------------------------------
|
| 205 |
-
# 6) Gradio UI
|
| 206 |
# ---------------------------------------------------------
|
| 207 |
with gr.Blocks() as demo:
|
| 208 |
gr.HTML(analytics_script)
|
|
@@ -217,13 +213,13 @@ with gr.Blocks() as demo:
|
|
| 217 |
),
|
| 218 |
],
|
| 219 |
outputs=gr.Audio(
|
| 220 |
-
type="filepath", #
|
| 221 |
label="Згенераванае аўдыя (патокава)",
|
| 222 |
-
autoplay=True, # 🔊
|
| 223 |
),
|
| 224 |
-
title="Belarusian TTS Demo — Streaming (Autoplay)",
|
| 225 |
description="""
|
| 226 |
-
<p
|
| 227 |
<p>Калі браўзер блакуе autoplay, зрабіце адзін клік па старонцы/кнопцы — і далей будзе прайгравацца аўтаматычна.</p>
|
| 228 |
""",
|
| 229 |
examples=examples,
|
|
|
|
| 73 |
XTTS_MODEL.tokenizer = tokenizer
|
| 74 |
|
| 75 |
# ---------------------------------------------------------
|
| 76 |
+
# 4) Патокавая TTS-функцыя: yield ТОЛЬКІ НОВЫ ЧАНК
|
| 77 |
# ---------------------------------------------------------
|
| 78 |
@spaces.GPU(duration=60)
|
| 79 |
def text_to_speech(belarusian_story, speaker_audio_file=None):
|
| 80 |
"""
|
| 81 |
STREAMING-выхад для gr.Audio:
|
| 82 |
+
- на кожным кроку yield (sample_rate, waveform_float32_chunk) — ТОЛЬКІ новы кавалак
|
| 83 |
+
- Gradio будзе прайграваць чаргой, як адно суцэльнае аўдыя
|
| 84 |
- у фінале yield шлях да temp-файла з поўным WAV (для загрузкі)
|
|
|
|
|
|
|
| 85 |
"""
|
| 86 |
if not belarusian_story or str(belarusian_story).strip() == "":
|
| 87 |
raise gr.Error("Увядзі хоць нейкі тэкст 🙂")
|
|
|
|
| 119 |
except Exception as e:
|
| 120 |
raise gr.Error(f"Памылка пры падзеле тэксту на сказы: {e}")
|
| 121 |
|
| 122 |
+
all_chunks = [] # для фінальнага WAV
|
| 123 |
|
|
|
|
| 124 |
for text in tqdm(tts_texts):
|
| 125 |
try:
|
| 126 |
with torch.no_grad():
|
|
|
|
| 136 |
top_p=0.3,
|
| 137 |
)
|
| 138 |
cur = wav_chunk["wav"].astype(np.float32)
|
| 139 |
+
all_chunks.append(cur)
|
| 140 |
|
| 141 |
+
# STREAM: аддаём ТОЛЬКІ гэты чанк — франтэнд дадасць яго да плэйбэку
|
| 142 |
+
yield (sampling_rate, cur)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
except Exception as e:
|
| 145 |
raise gr.Error(f"Памылка пры генерырацыі аўдыя: {e}")
|
| 146 |
|
| 147 |
+
if not all_chunks:
|
| 148 |
raise gr.Error("Нічога не згенеравана. Праверце ўваходныя даныя.")
|
| 149 |
|
| 150 |
# Фінальны WAV у temp-файл — каб можна было спампаваць
|
| 151 |
try:
|
| 152 |
+
final_audio = np.concatenate(all_chunks, axis=0)
|
| 153 |
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
|
| 154 |
+
write(temp_file.name, sampling_rate, final_audio)
|
| 155 |
+
# Апошні yield — шлях да файла для загрузкі
|
| 156 |
yield temp_file.name
|
| 157 |
except Exception as e:
|
| 158 |
raise gr.Error(f"Памылка пры запісе фінальнага WAV: {e}")
|
|
|
|
| 198 |
"""
|
| 199 |
|
| 200 |
# ---------------------------------------------------------
|
| 201 |
+
# 6) Gradio UI: autoplay = True (першы чанк запускае прайграванне)
|
| 202 |
# ---------------------------------------------------------
|
| 203 |
with gr.Blocks() as demo:
|
| 204 |
gr.HTML(analytics_script)
|
|
|
|
| 213 |
),
|
| 214 |
],
|
| 215 |
outputs=gr.Audio(
|
| 216 |
+
type="filepath", # прымае як (sr, ndarray) для патоку, так і шлях да фінальнага файла
|
| 217 |
label="Згенераванае аўдыя (патокава)",
|
| 218 |
+
autoplay=True, # 🔊 аўтапрайграванне з 1-га чанка; наступныя чанкі дадаюцца без рэстарту
|
| 219 |
),
|
| 220 |
+
title="Belarusian TTS Demo — Streaming (No-Restart, Autoplay)",
|
| 221 |
description="""
|
| 222 |
+
<p>Аўдыя ідзе <b>бесперапынна</b>: кожны новы чанк дадаецца ў канец, без перазапуску з пачатку.</p>
|
| 223 |
<p>Калі браўзер блакуе autoplay, зрабіце адзін клік па старонцы/кнопцы — і далей будзе прайгравацца аўтаматычна.</p>
|
| 224 |
""",
|
| 225 |
examples=examples,
|