mohammedaly22 commited on
Commit
7426f99
·
verified ·
1 Parent(s): 5451385

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +47 -5
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 (sr, chunk), metrics
 
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
- gen_b.click(run_b, [stream_b, speaker, text_b, language, ns_b, gs_b, sp_b, nm_b],
363
- [out_b, metrics_b])
 
 
 
 
 
 
 
 
 
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
- gen_c.click(run_c, [stream_c, ref_audio_c, ref_text_c, text_c, language_c,
398
- ns_c, gs_c, sp_c, nm_c], [out_c, metrics_c])
 
 
 
 
 
 
 
 
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])