Spaces:
Running
on
Zero
Running
on
Zero
File size: 8,575 Bytes
06d33a3 c6fbbbc 5f7d4f2 666d1ff 5f7d4f2 df2963e 5f7d4f2 666d1ff 5f7d4f2 c6fbbbc af468c1 666d1ff 2ad7bbc 3e36194 f312981 3e36194 666d1ff 3e36194 666d1ff 2ad7bbc 5f7d4f2 2ad7bbc 3e36194 666d1ff 2ad7bbc 0350865 3e36194 5f7d4f2 3e36194 666d1ff 2ad7bbc 666d1ff 2c2732a 666d1ff 2c2732a 666d1ff 3e36194 666d1ff c6fbbbc 5f7d4f2 666d1ff c6fbbbc 5f7d4f2 ed08c96 23f1b16 682b06b 28a9998 fab105b c67470d 3616d99 c67470d 3616d99 96f8e84 c43cb5d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
import spaces
import gradio as gr
import torch
from huggingface_hub import hf_hub_download
import os
import sys
import tempfile
from scipy.io.wavfile import write
import numpy as np
from tqdm import tqdm
from underthesea import sent_tokenize
try:
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
except ImportError:
os.system("git clone https://github.com/hellcatmon/XTTSv2-Finetuning-for-New-Languages.git")
if os.path.exists("XTTSv2-Finetuning-for-New-Languages/TTS"):
os.system("mv XTTSv2-Finetuning-for-New-Languages/TTS ./")
sys.path.append("./TTS")
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
# Шляхі да файлаў (цяпер як радкі)
repo_id = "archivartaunik/BE_XTTS_V2_10ep250k"
model_dir = "./model" # Дырэкторыя для захавання мадэлі
os.makedirs(model_dir, exist_ok=True) # Ствараем дырэкторыю, калі яе няма
checkpoint_file = os.path.join(model_dir, "model.pth")
config_file = os.path.join(model_dir, "config.json")
vocab_file = os.path.join(model_dir, "vocab.json")
default_voice_file = os.path.join(model_dir, "voice.wav")
if not os.path.exists(checkpoint_file):
hf_hub_download(repo_id, filename="model.pth", local_dir=model_dir)
if not os.path.exists(config_file):
hf_hub_download(repo_id, filename="config.json", local_dir=model_dir)
if not os.path.exists(vocab_file):
hf_hub_download(repo_id, filename="vocab.json", local_dir=model_dir)
if not os.path.exists(default_voice_file):
hf_hub_download(repo_id, filename="voice.wav", local_dir=model_dir)
# Загрузка канфігурацыі і мадэлі адзін раз
config = XttsConfig()
config.load_json(config_file)
XTTS_MODEL = Xtts.init_from_config(config)
XTTS_MODEL.load_checkpoint(config, checkpoint_path=checkpoint_file, vocab_path=vocab_file, use_deepspeed=False) # Тут выпраўленне
device = "cuda:0" if torch.cuda.is_available() else "cpu"
XTTS_MODEL.to(device)
sampling_rate = XTTS_MODEL.config.audio["sample_rate"]
@spaces.GPU(duration=60)
def text_to_speech(belarusian_story, speaker_audio_file=None):
if not speaker_audio_file or (not isinstance(speaker_audio_file, str) and speaker_audio_file.name == ""):
speaker_audio_file = default_voice_file
try:
gpt_cond_latent, speaker_embedding = XTTS_MODEL.get_conditioning_latents(
audio_path=speaker_audio_file,
gpt_cond_len=XTTS_MODEL.config.gpt_cond_len,
max_ref_length=XTTS_MODEL.config.max_ref_len,
sound_norm_refs=XTTS_MODEL.config.sound_norm_refs,
)
except Exception as e:
return f"Error getting conditioning latents: {e}"
try:
tts_texts = sent_tokenize(belarusian_story)
except Exception as e:
return f"Error tokenizing text: {e}"
all_wavs = []
for text in tqdm(tts_texts):
try:
with torch.no_grad():
wav_chunk = XTTS_MODEL.inference(
text=text,
language="be",
gpt_cond_latent=gpt_cond_latent,
speaker_embedding=speaker_embedding,
temperature=0.1,
length_penalty=1.0,
repetition_penalty=10.0,
top_k=10,
top_p=0.3,
)
all_wavs.append(wav_chunk["wav"])
except Exception as e:
return f"Error generating audio: {e}"
try:
out_wav = np.concatenate(all_wavs)
except ValueError:
return "Немагчыма згенерыраваць аўдыё. Праверце ўваходны тэкст і аўдыёфайл."
except Exception as e:
return f"Error concatenating audio: {e}"
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
write(temp_file.name, sampling_rate, out_wav)
return temp_file.name
examples = [
["Такім чынам, клуб стаў уладальнікам усіх існых на сёння міжнародных трафеяў паўднёваамерыканскага футболу.", "Nestarka.wav", "krai.wav"],
["Яму не ўдалося палепшыць фінансавае становішча каралеўства, а, наадварот, прыйшлося распрадаваць каштоўнасці чэшскай кароны.", "muzh.wav", "examples/цуды.wav"],
["Кампілятарамі называюць праграмы, якія пераўтвараюць код вышэйшага ўзроўню ў код ніжэйшага ўзроўню.", "chunk_100.wav", "examples/надВозерам.wav"],
["Акрамя таго, ліхачы аддаюць перавагу рэгі, хіп-хопу і класічнай музыцы.", "d1015.mp3", "examples/Беларусь.wav"],
["Позірк можа быць уважлівым, зацікаўленым, захопленым, але бывае і нахабным, задзірлівым, пагардлівым, напышлівым.", "donarka_ench.wav", "examples/цуды.wav"],
["Такі нават шчыры, ці што: родная мова народу – трасянка, а беларуская яму чужая!", "muzhcynski.wav", "examples/цуды.wav"],
]
# Генерацыя адсутных файлаў
for example in examples:
input_text, input_audio, output_audio = example
if not os.path.exists(output_audio):
print(f"Creating missing file: {output_audio}")
generated_audio = text_to_speech(input_text, input_audio)
os.rename(generated_audio, output_audio)
analytics_script = """
<script async src="https://www.googletagmanager.com/gtag/js?id=G-TKDCRCQ7FK"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-TKDCRCQ7FK');
</script>
"""
demo = gr.Blocks()
with demo:
gr.HTML(analytics_script) # Дадаем аналітыку
gr.Interface(
fn=text_to_speech,
inputs=[
gr.Textbox(lines=5, label="Тэкст на беларускай мове"),
gr.Audio(type="filepath", label="Прыклад голасу (без іншых гукаў) не карацей 7 секунд", interactive=True),
],
outputs=gr.Audio(label="Згенераванае аўдыя"),
title="Belarusian TTS Demo",
description="""
<p>Увядзіце тэкст, і мадэль пераўтворыць яго ў аўдыя. Вы можаце выкарыстоўваць
голас па змаўчанні, абраць голас з прыкладаў унізе ці загрузіць уласны файл
або запісаць аўдыё.</p>
<p><strong>Карысныя парады:</strong></p>
<ul>
<li>Выкарыстоўвайце прыклады з добрай якасцю, без іншых гукаў і разнастайнай інтанацыяй,
ад яе моцна залежыць вынік.</li>
<li>Інтанацыя таксама ўплывае на націскі.</li>
<li>Прыклады галасоў могуць быць на любой мове.</li>
</ul>
<p>Каб палепшыць якасць мадэлі (націскі і дакладнасць кланавання галасоў), патрэбны дадатковыя датасэты.
Ахвяруйце свой голас праз <a href="https://Donar.by" target="_blank">Donar.by</a>, запішыце свой голас з
высокай якасцю і станьце ўзорным донарам
(<a href="https://forms.gle/TTirxTJNd3Ngw3dD6" target="_blank">запісацца тут</a>).</p>
<p>Далучайцеся да беларускаймоўнай суполкі ў ТГ, каб дапамагчы ці даведацца пра навіны ШІ:
<a href="https://t.me/belarusai" target="_blank">https://t.me/belarusai</a>.</p>
<p><strong>Падтрымаць праект:</strong> <a href="https://buymeacoffee.com/tuteishygpt" target="_blank">Buy Me a Coffee</a></p>
""",
examples=examples,
cache_examples=False
)
if __name__ == "__main__":
demo.launch() |