Spaces:
Running on Zero
Running on Zero
Upload app.py with huggingface_hub
Browse files
app.py
CHANGED
|
@@ -213,6 +213,17 @@ def _peak_vram_gb():
|
|
| 213 |
return None
|
| 214 |
|
| 215 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 216 |
def stream_tts(text, speaker_name, ref_audio, ref_text, language,
|
| 217 |
num_step, guidance, speed, normalize, *, use_clone):
|
| 218 |
"""Stream long text sentence-by-sentence: yields (audio_chunk, metrics_html)."""
|
|
@@ -246,7 +257,8 @@ def stream_tts(text, speaker_name, ref_audio, ref_text, language,
|
|
| 246 |
audio_secs += len(chunk) / sr
|
| 247 |
total = time.time() - t0
|
| 248 |
metrics = _metrics_html(n, ttfa, total, audio_secs, _peak_vram_gb())
|
| 249 |
-
yield
|
|
|
|
| 250 |
|
| 251 |
|
| 252 |
def preview_reference(speaker_name):
|
|
@@ -341,8 +353,12 @@ with gr.Blocks(**_blocks_kwargs) as demo:
|
|
| 341 |
stream_b = gr.Checkbox(value=False, elem_id="vt-stream",
|
| 342 |
label="🌊 بث مباشر للنصوص الطويلة / Stream long text (audio chunks)")
|
| 343 |
gen_b = gr.Button("🔊 توليد الصوت", variant="primary", elem_id="vt-generate")
|
|
|
|
| 344 |
out_b = gr.Audio(label="الناتج", type="numpy", elem_classes="vt-audio",
|
| 345 |
waveform_options=WAVE, autoplay=True)
|
|
|
|
|
|
|
|
|
|
| 346 |
metrics_b = gr.HTML()
|
| 347 |
|
| 348 |
gr.Examples(EXAMPLES, inputs=[speaker, text_b], label="أمثلة",
|
|
@@ -350,6 +366,11 @@ with gr.Blocks(**_blocks_kwargs) as demo:
|
|
| 350 |
|
| 351 |
speaker.change(preview_reference, speaker, [ref_prev, ref_txt, spk_meta])
|
| 352 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
def run_b(stream_on, speaker_name, text, language, ns, gs, sp, nm):
|
| 354 |
if stream_on:
|
| 355 |
for chunk, met in stream_tts(text, speaker_name, None, None, language,
|
|
@@ -359,8 +380,17 @@ with gr.Blocks(**_blocks_kwargs) as demo:
|
|
| 359 |
wav = gen_builtin(speaker_name, text, language, ns, gs, sp, nm)
|
| 360 |
yield wav, ""
|
| 361 |
|
| 362 |
-
|
| 363 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 364 |
|
| 365 |
# ============================================= clone (single column)
|
| 366 |
with gr.Tab("استنساخ صوت"):
|
|
@@ -383,8 +413,12 @@ with gr.Blocks(**_blocks_kwargs) as demo:
|
|
| 383 |
gen_c = gr.Button("🔊 توليد الصوت", variant="primary", elem_id="vt-generate")
|
| 384 |
out_c = gr.Audio(label="الناتج", type="numpy", elem_classes="vt-audio",
|
| 385 |
waveform_options=WAVE, autoplay=True)
|
|
|
|
|
|
|
| 386 |
metrics_c = gr.HTML()
|
| 387 |
|
|
|
|
|
|
|
| 388 |
def run_c(stream_on, ref_audio, ref_text, text, language, ns, gs, sp, nm):
|
| 389 |
if stream_on:
|
| 390 |
for chunk, met in stream_tts(text, None, ref_audio, ref_text, language,
|
|
@@ -394,8 +428,16 @@ with gr.Blocks(**_blocks_kwargs) as demo:
|
|
| 394 |
wav = gen_clone(ref_audio, ref_text, text, language, ns, gs, sp, nm)
|
| 395 |
yield wav, ""
|
| 396 |
|
| 397 |
-
|
| 398 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 399 |
|
| 400 |
# initial preview for the default speaker
|
| 401 |
demo.load(preview_reference, speaker, [ref_prev, ref_txt, spk_meta])
|
|
|
|
| 213 |
return None
|
| 214 |
|
| 215 |
|
| 216 |
+
def _chunk_to_wav_bytes(sr, wav):
|
| 217 |
+
"""Encode one audio chunk as a standalone WAV byte-string for streaming output."""
|
| 218 |
+
import io
|
| 219 |
+
import numpy as np
|
| 220 |
+
import soundfile as sf
|
| 221 |
+
buf = io.BytesIO()
|
| 222 |
+
arr = np.asarray(wav, dtype=np.float32)
|
| 223 |
+
sf.write(buf, arr, sr, format="WAV")
|
| 224 |
+
return buf.getvalue()
|
| 225 |
+
|
| 226 |
+
|
| 227 |
def stream_tts(text, speaker_name, ref_audio, ref_text, language,
|
| 228 |
num_step, guidance, speed, normalize, *, use_clone):
|
| 229 |
"""Stream long text sentence-by-sentence: yields (audio_chunk, metrics_html)."""
|
|
|
|
| 257 |
audio_secs += len(chunk) / sr
|
| 258 |
total = time.time() - t0
|
| 259 |
metrics = _metrics_html(n, ttfa, total, audio_secs, _peak_vram_gb())
|
| 260 |
+
# yield WAV bytes -> a streaming gr.Audio appends & plays each chunk as it arrives
|
| 261 |
+
yield _chunk_to_wav_bytes(sr, chunk), metrics
|
| 262 |
|
| 263 |
|
| 264 |
def preview_reference(speaker_name):
|
|
|
|
| 353 |
stream_b = gr.Checkbox(value=False, elem_id="vt-stream",
|
| 354 |
label="🌊 بث مباشر للنصوص الطويلة / Stream long text (audio chunks)")
|
| 355 |
gen_b = gr.Button("🔊 توليد الصوت", variant="primary", elem_id="vt-generate")
|
| 356 |
+
# one-shot output (visible by default)
|
| 357 |
out_b = gr.Audio(label="الناتج", type="numpy", elem_classes="vt-audio",
|
| 358 |
waveform_options=WAVE, autoplay=True)
|
| 359 |
+
# streaming output: plays each chunk as it's produced (hidden until used)
|
| 360 |
+
out_b_stream = gr.Audio(label="الناتج (بث مباشر)", streaming=True, autoplay=True,
|
| 361 |
+
elem_classes="vt-audio", visible=False)
|
| 362 |
metrics_b = gr.HTML()
|
| 363 |
|
| 364 |
gr.Examples(EXAMPLES, inputs=[speaker, text_b], label="أمثلة",
|
|
|
|
| 366 |
|
| 367 |
speaker.change(preview_reference, speaker, [ref_prev, ref_txt, spk_meta])
|
| 368 |
|
| 369 |
+
# toggle which output is visible based on the streaming checkbox
|
| 370 |
+
def _toggle_outputs(stream_on):
|
| 371 |
+
return gr.update(visible=not stream_on), gr.update(visible=stream_on)
|
| 372 |
+
stream_b.change(_toggle_outputs, stream_b, [out_b, out_b_stream])
|
| 373 |
+
|
| 374 |
def run_b(stream_on, speaker_name, text, language, ns, gs, sp, nm):
|
| 375 |
if stream_on:
|
| 376 |
for chunk, met in stream_tts(text, speaker_name, None, None, language,
|
|
|
|
| 380 |
wav = gen_builtin(speaker_name, text, language, ns, gs, sp, nm)
|
| 381 |
yield wav, ""
|
| 382 |
|
| 383 |
+
def run_b_dispatch(stream_on, *args):
|
| 384 |
+
# route to the correct output component (streaming vs one-shot)
|
| 385 |
+
if stream_on:
|
| 386 |
+
for chunk, met in run_b(True, *args):
|
| 387 |
+
yield gr.update(), chunk, met # feed streaming Audio
|
| 388 |
+
else:
|
| 389 |
+
wav, met = next(run_b(False, *args))
|
| 390 |
+
yield wav, gr.update(), met # feed one-shot Audio
|
| 391 |
+
|
| 392 |
+
gen_b.click(run_b_dispatch, [stream_b, speaker, text_b, language, ns_b, gs_b, sp_b, nm_b],
|
| 393 |
+
[out_b, out_b_stream, metrics_b])
|
| 394 |
|
| 395 |
# ============================================= clone (single column)
|
| 396 |
with gr.Tab("استنساخ صوت"):
|
|
|
|
| 413 |
gen_c = gr.Button("🔊 توليد الصوت", variant="primary", elem_id="vt-generate")
|
| 414 |
out_c = gr.Audio(label="الناتج", type="numpy", elem_classes="vt-audio",
|
| 415 |
waveform_options=WAVE, autoplay=True)
|
| 416 |
+
out_c_stream = gr.Audio(label="الناتج (بث مباشر)", streaming=True, autoplay=True,
|
| 417 |
+
elem_classes="vt-audio", visible=False)
|
| 418 |
metrics_c = gr.HTML()
|
| 419 |
|
| 420 |
+
stream_c.change(_toggle_outputs, stream_c, [out_c, out_c_stream])
|
| 421 |
+
|
| 422 |
def run_c(stream_on, ref_audio, ref_text, text, language, ns, gs, sp, nm):
|
| 423 |
if stream_on:
|
| 424 |
for chunk, met in stream_tts(text, None, ref_audio, ref_text, language,
|
|
|
|
| 428 |
wav = gen_clone(ref_audio, ref_text, text, language, ns, gs, sp, nm)
|
| 429 |
yield wav, ""
|
| 430 |
|
| 431 |
+
def run_c_dispatch(stream_on, *args):
|
| 432 |
+
if stream_on:
|
| 433 |
+
for chunk, met in run_c(True, *args):
|
| 434 |
+
yield gr.update(), chunk, met
|
| 435 |
+
else:
|
| 436 |
+
wav, met = next(run_c(False, *args))
|
| 437 |
+
yield wav, gr.update(), met
|
| 438 |
+
|
| 439 |
+
gen_c.click(run_c_dispatch, [stream_c, ref_audio_c, ref_text_c, text_c, language_c,
|
| 440 |
+
ns_c, gs_c, sp_c, nm_c], [out_c, out_c_stream, metrics_c])
|
| 441 |
|
| 442 |
# initial preview for the default speaker
|
| 443 |
demo.load(preview_reference, speaker, [ref_prev, ref_txt, spk_meta])
|