archivartaunik commited on
Commit
1e2af94
·
verified ·
1 Parent(s): 3350e70

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +16 -20
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, waveform_float32_cumulative)
 
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
- running_total = None
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
- if running_total is None:
143
- running_total = cur
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 running_total is None:
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, running_total)
 
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 (autoplay у выхадным Audio)
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", # падтрымлівае і (sr, ndarray), і фінальны шлях
221
  label="Згенераванае аўдыя (патокава)",
222
- autoplay=True, # 🔊 аўтаматычнае прайграванне
223
  ),
224
- title="Belarusian TTS Demo — Streaming (Autoplay)",
225
  description="""
226
- <p>Увядзіце тэкст і аўдыя будзе адлюстроўвацца <b>па меры сінтэзу</b> з аўтапрайграваннем.</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,