Spaces:
Running on Zero
Running on Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -47,7 +47,7 @@ from TTS.tts.layers.xtts.tokenizer import (
|
|
| 47 |
# ---------------------------------------------------------
|
| 48 |
# 2. Шляхі да файлаў мадэлі
|
| 49 |
# ---------------------------------------------------------
|
| 50 |
-
repo_id = "archivartaunik/
|
| 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 |
-
|
| 180 |
-
|
| 181 |
-
|
| 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=
|
| 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.
|
| 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 |
-
[
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
[
|
| 254 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 264 |
gr.Dropdown(
|
| 265 |
label="Падрыхтаваныя галасы ",
|
| 266 |
choices=SPEAKER_CHOICES,
|
| 267 |
value=SPEAKER_CHOICES[0],
|
| 268 |
),
|
| 269 |
],
|
| 270 |
-
outputs=gr.Audio(
|
| 271 |
-
|
|
|
|
|
|
|
|
|
|
| 272 |
description="""
|
| 273 |
<p>Увядзіце тэкст, і мадэль пераўтворыць яго ў аўдыя. Вы можаце выкарыстоўваць
|
| 274 |
-
голас па змаўчанні, абраць голас з прыкладаў унізе
|
| 275 |
-
або запісаць аўдыё.</p>
|
|
|
|
| 276 |
<p><strong>Карысныя парады:</strong></p>
|
| 277 |
<ul>
|
| 278 |
-
<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 |
-
|
| 287 |
-
<
|
| 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__":
|