archivartaunik commited on
Commit
b6e2427
·
verified ·
1 Parent(s): 9bf2147

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +74 -31
app.py CHANGED
@@ -47,7 +47,7 @@ from TTS.tts.layers.xtts.tokenizer import (
47
  # ---------------------------------------------------------
48
  # 2. Шляхі да файлаў мадэлі
49
  # ---------------------------------------------------------
50
- repo_id = "archivartaunik/BE_XTTS_V2_20_Naciski"
51
  model_dir = "./model"
52
  os.makedirs(model_dir, exist_ok=True)
53
 
@@ -57,6 +57,7 @@ vocab_file = os.path.join(model_dir, "vocab.json")
57
  default_voice_file = os.path.join(model_dir, "voice.wav")
58
  speakers_file = os.path.join(model_dir, "speakers_xtts.pth")
59
 
 
60
  if not os.path.exists(checkpoint_file):
61
  hf_hub_download(repo_id, filename="model.pth", local_dir=model_dir)
62
  if not os.path.exists(config_file):
@@ -100,8 +101,8 @@ XTTS_MODEL.tokenizer = tokenizer
100
  # ---------------------------------------------------------
101
  # 4. Загрузка speakers_xtts.pth (гатовыя галасы)
102
  # ---------------------------------------------------------
103
- SPEAKERS_DB = {}
104
- SPEAKER_CHOICES = ["— з аўдыё (reference) —"]
105
 
106
  if os.path.exists(speakers_file):
107
  try:
@@ -147,9 +148,9 @@ else:
147
  # ---------------------------------------------------------
148
  @spaces.GPU(duration=60)
149
  def text_to_speech(
150
- belarusian_story,
151
  speaker_audio_file=None,
152
- preset_speaker="— з аўдыё (reference) —",
153
  ):
154
  if not belarusian_story or belarusian_story.strip() == "":
155
  raise gr.Error("Увядзі хоць нейкі тэкст 🙂")
@@ -176,15 +177,13 @@ def text_to_speech(
176
  )
177
  else:
178
  # калі аўдыё не перададзена — бярэм голас па змаўчанні
179
- if not speaker_audio_file or (
180
- not isinstance(speaker_audio_file, str)
181
- and getattr(speaker_audio_file, "name", "") == ""
182
- ):
183
- speaker_audio_file = default_voice_file
184
 
185
  try:
186
  gpt_cond_latent, speaker_embedding = XTTS_MODEL.get_conditioning_latents(
187
- audio_path=speaker_audio_file,
188
  gpt_cond_len=XTTS_MODEL.config.gpt_cond_len,
189
  max_ref_length=XTTS_MODEL.config.max_ref_len,
190
  sound_norm_refs=XTTS_MODEL.config.sound_norm_refs,
@@ -217,7 +216,7 @@ def text_to_speech(
217
  language="be",
218
  gpt_cond_latent=gpt_cond_latent,
219
  speaker_embedding=speaker_embedding,
220
- temperature=0.5,
221
  length_penalty=1.0,
222
  repetition_penalty=10.0,
223
  top_k=10,
@@ -244,52 +243,96 @@ def text_to_speech(
244
 
245
  # ---------------------------------------------------------
246
  # 6. Прыклады
 
 
247
  # ---------------------------------------------------------
248
  examples = [
249
- ["Такі́м чы́нам, клуб ста́ў улада́льнікам усі́х існых на сё́ння міжнаро́дных трафе́яў паўднёваамерыка́нскага футбо́лу.", "Nestarka.wav", "krai.wav"],
250
- ["Яму не ўдалося палепшыць фінансавае становішча каралеўства, а, наадварот, прыйшлося распрадаваць каштоўнасці чэшскай кароны.", "muzh.wav", "examples/цуды.wav"],
251
- ["Кампілятарамі называюць праграмы, якія пераўтвараюць код вышэйшага ўзроўню ў код ніжэйшага ўзроўню.", "chunk_100.wav", "examples/надВозерам.wav"],
252
- ["Акрамя таго, ліхачы аддаюць перавагу рэгі, хіп-хопу і класічнай музыцы.", "d1015.mp3", "examples/Беларусь.wav"],
253
- ["Позірк можа быць уважлівым, зацікаўленым, захопленым, але бывае і нахабным, задзірлівым, пагардлівым, напышлівым.", "donarka_ench.wav", "examples/цуды.wav"],
254
- ["Такі нават шчыры, ці што: родная мова народу трасянка, а беларуская яму чужая!", "muzhcynski.wav", "examples/цуды.wav"],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255
  ]
256
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  demo = gr.Blocks()
258
  with demo:
 
259
  gr.Interface(
260
  fn=text_to_speech,
261
  inputs=[
262
  gr.Textbox(lines=5, label="Тэкст на беларускай мове"),
263
- gr.Audio(type="filepath", label="Прыклад голасу (без іншых гукаў) не карацей 7 секунд", interactive=True),
 
 
 
 
264
  gr.Dropdown(
265
  label="Падрыхтаваныя галасы ",
266
  choices=SPEAKER_CHOICES,
267
  value=SPEAKER_CHOICES[0],
268
  ),
269
  ],
270
- outputs=gr.Audio(label="Згенераванае аўдыя"),
271
- title="Belarusian TTS Demo + stresses",
 
 
 
272
  description="""
273
  <p>Увядзіце тэкст, і мадэль пераўтворыць яго ў аўдыя. Вы можаце выкарыстоўваць
274
- голас па змаўчанні, абраць голас з прыкладаў унізе ці загрузіць уласны файл
275
- або запісаць аўдыё.</p>
 
276
  <p><strong>Карысныя парады:</strong></p>
277
  <ul>
278
- <li>Можна дадаваць націскі у тэкст. Знак U+0301 ставіцца альт + 769 на дадатковай клавіятуры, ці папрасіце нейрасетку паставіць націскі, ці скапіруйце адсюль а́ е́ ё́ і́ о́ у́ ы́ э́ ю́ я́ </li>
279
- <li>Выкарыстоўвайце прыклады з добрай якасцю, без іншых гукаў і разнастайнай інтанацыяй,
280
  ад яе моцна залежыць вынік.</li>
 
281
  <li>Прыклады галасоў могуць быць на любой мове.</li>
282
  </ul>
 
283
  <p>Каб палепшыць якасць мадэлі (націскі і дакладнасць кланавання галасоў), патрэбны дадатковыя датасэты.
284
- Ахвяруйце свой голас праз <a href="https://Donar.by" target="_blank">Donar.by</a>, запішыце свой голас з
285
- высокай якасцю і станьце ўзорным донарам
286
- (<a href="https://forms.gle/TTirxTJNd3Ngw3dD6" target="_blank">запісацца тут</a>).</p>
287
- <p>Далучайцеся да беларускаймоўнай суполкі ў ТГ, каб дапамагчы ці даведацца пра навіны ШІ:
288
-
289
  <p><strong>Падтрымаць праект:</strong> <a href="https://buymeacoffee.com/tuteishygpt" target="_blank">Buy Me a Coffee</a></p>
290
  """,
291
  examples=examples,
292
- cache_examples=False
293
  )
294
 
295
  if __name__ == "__main__":
 
47
  # ---------------------------------------------------------
48
  # 2. Шляхі да файлаў мадэлі
49
  # ---------------------------------------------------------
50
+ repo_id = "archivartaunik/BE_XTTS_V2_10ep250k"
51
  model_dir = "./model"
52
  os.makedirs(model_dir, exist_ok=True)
53
 
 
57
  default_voice_file = os.path.join(model_dir, "voice.wav")
58
  speakers_file = os.path.join(model_dir, "speakers_xtts.pth")
59
 
60
+ # Спампоўваем асноўныя файлы мадэлі
61
  if not os.path.exists(checkpoint_file):
62
  hf_hub_download(repo_id, filename="model.pth", local_dir=model_dir)
63
  if not os.path.exists(config_file):
 
101
  # ---------------------------------------------------------
102
  # 4. Загрузка speakers_xtts.pth (гатовыя галасы)
103
  # ---------------------------------------------------------
104
+ SPEAKERS_DB: dict[str, dict] = {}
105
+ SPEAKER_CHOICES: list[str] = ["— з аўдыё (reference) —"]
106
 
107
  if os.path.exists(speakers_file):
108
  try:
 
148
  # ---------------------------------------------------------
149
  @spaces.GPU(duration=60)
150
  def text_to_speech(
151
+ belarusian_story: str,
152
  speaker_audio_file=None,
153
+ preset_speaker: str = "— з аўдыё (reference) —",
154
  ):
155
  if not belarusian_story or belarusian_story.strip() == "":
156
  raise gr.Error("Увядзі хоць нейкі тэкст 🙂")
 
177
  )
178
  else:
179
  # калі аўдыё не перададзена — бярэм голас па змаўчанні
180
+ ref_path = speaker_audio_file
181
+ if not ref_path or (not isinstance(ref_path, str) and getattr(ref_path, "name", "") == ""):
182
+ ref_path = default_voice_file
 
 
183
 
184
  try:
185
  gpt_cond_latent, speaker_embedding = XTTS_MODEL.get_conditioning_latents(
186
+ audio_path=ref_path,
187
  gpt_cond_len=XTTS_MODEL.config.gpt_cond_len,
188
  max_ref_length=XTTS_MODEL.config.max_ref_len,
189
  sound_norm_refs=XTTS_MODEL.config.sound_norm_refs,
 
216
  language="be",
217
  gpt_cond_latent=gpt_cond_latent,
218
  speaker_embedding=speaker_embedding,
219
+ temperature=0.1,
220
  length_penalty=1.0,
221
  repetition_penalty=10.0,
222
  top_k=10,
 
243
 
244
  # ---------------------------------------------------------
245
  # 6. Прыклады
246
+ # (3-яя калёнка — значэнне дропдауна: тут па змаўчанні
247
+ # выкарыстоўваем reference-аудыё, таму ставім базавы пункт меню)
248
  # ---------------------------------------------------------
249
  examples = [
250
+ [
251
+ "Такім чынам, клуб стаў уладальнікам усіх існых на сёння міжнародных трафеяў паўднёваамерыканскага футболу.",
252
+ "Nestarka.wav",
253
+ ],
254
+ [
255
+ "Яму не ўдалося палепшыць фінансавае становішча каралеўства, а, наадварот, прыйшлося распрадаваць каштоўнасці чэшскай кароны.",
256
+ "muzh.wav",
257
+ ],
258
+ [
259
+ "Кампілятарамі называюць праграмы, якія пераўтвараюць код вышэйшага ўзроўню ў код ніжэйшага ўзроўню.",
260
+ "chunk_100.wav",
261
+ ],
262
+ [
263
+ "Акрамя таго, ліхачы аддаюць перавагу рэгі, хіп-хопу і класічнай музыцы.",
264
+ "d1015.mp3",
265
+ ],
266
+ [
267
+ "Позірк можа быць уважлівым, зацікаўленым, захопленым, але бывае і нахабным, задзірлівым, пагардлівым, напышлівым.",
268
+ "donarka_ench.wav",
269
+ ],
270
+ [
271
+ "Такі нават шчыры, ці што: родная мова народу – трасянка, а беларуская яму чужая!",
272
+ "muzhcynski.wav",
273
+ ],
274
  ]
275
 
276
+ analytics_script = """
277
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-TKDCRCQ7FK"></script>
278
+ <script>
279
+ window.dataLayer = window.dataLayer || [];
280
+ function gtag(){dataLayer.push(arguments);}
281
+ gtag('js', new Date());
282
+
283
+ gtag('config', 'G-TKDCRCQ7FK');
284
+ </script>
285
+ """
286
+
287
+ # ---------------------------------------------------------
288
+ # 7. Графічны інтэрфейс Gradio з выбарам гатовых галасоў
289
+ # ---------------------------------------------------------
290
  demo = gr.Blocks()
291
  with demo:
292
+ gr.HTML(analytics_script)
293
  gr.Interface(
294
  fn=text_to_speech,
295
  inputs=[
296
  gr.Textbox(lines=5, label="Тэкст на беларускай мове"),
297
+ gr.Audio(
298
+ type="filepath",
299
+ label="Прыклад голасу (без іншых гукаў) не карацей 7 секунд",
300
+ interactive=True,
301
+ ),
302
  gr.Dropdown(
303
  label="Падрыхтаваныя галасы ",
304
  choices=SPEAKER_CHOICES,
305
  value=SPEAKER_CHOICES[0],
306
  ),
307
  ],
308
+ outputs=gr.Audio(
309
+ type="filepath",
310
+ label="Згенераванае аўдыя",
311
+ ),
312
+ title="Belarusian TTS Demo",
313
  description="""
314
  <p>Увядзіце тэкст, і мадэль пераўтворыць яго ў аўдыя. Вы можаце выкарыстоўваць
315
+ голас па змаўчанні, абраць голас з прыкладаў унізе, абраць гатовы голас з
316
+ <code>спісу замежных галасоў</code> або загрузіць уласны файл / запісаць аўдыё.</p>
317
+
318
  <p><strong>Карысныя парады:</strong></p>
319
  <ul>
320
+ <li>Выкарыстоўвайце прыклады з добрай якасцю, без іншых гукаў і з разнастайнай інтанацыяй
 
321
  ад яе моцна залежыць вынік.</li>
322
+ <li>Інтанацыя таксама ўплывае на націскі.</li>
323
  <li>Прыклады галасоў могуць быць на любой мове.</li>
324
  </ul>
325
+
326
  <p>Каб палепшыць якасць мадэлі (націскі і дакладнасць кланавання галасоў), патрэбны дадатковыя датасэты.
327
+ Ахвяруйце свой голас праз <a href="https://Donar.by" target="_blank">Donar.by</a></p>
328
+
329
+ <p>Далучайцеся да нашай беларускай суполкі ў ТГ, каб дапамагчы ці даведацца пра навіны ШІ:
330
+ <a href="https://t.me/SHibelChat" target="_blank">https://t.me/SHibelChat</a>.</p>
331
+
332
  <p><strong>Падтрымаць праект:</strong> <a href="https://buymeacoffee.com/tuteishygpt" target="_blank">Buy Me a Coffee</a></p>
333
  """,
334
  examples=examples,
335
+ cache_examples=False,
336
  )
337
 
338
  if __name__ == "__main__":