archivartaunik commited on
Commit
839218d
·
verified ·
1 Parent(s): d25c869

Upload app (3).py

Browse files
Files changed (1) hide show
  1. app (3).py +98 -0
app (3).py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import gradio as gr
3
+ import torch
4
+ from huggingface_hub import hf_hub_download
5
+ import os
6
+ import sys
7
+ import tempfile
8
+ from scipy.io.wavfile import write
9
+
10
+ # Клонуем рэпазіторый, калі ён яшчэ не загружаны
11
+ if not os.path.exists("XTTSv2-Finetuning-for-New-Languages"):
12
+ os.system("git clone https://github.com/hellcatmon/XTTSv2-Finetuning-for-New-Languages.git")
13
+
14
+ # Перамяшчаем тэчку TTS у асноўную дырэкторыю
15
+ if os.path.exists("XTTSv2-Finetuning-for-New-Languages/TTS"):
16
+ os.system("mv XTTSv2-Finetuning-for-New-Languages/TTS ./")
17
+
18
+ # Дадаем тэчку TTS у PYTHONPATH
19
+ sys.path.append("./TTS")
20
+ from tqdm import tqdm
21
+ from underthesea import sent_tokenize
22
+ from TTS.tts.configs.xtts_config import XttsConfig
23
+ from TTS.tts.models.xtts import Xtts
24
+
25
+ # Шлях да мадэлі ў Hugging Face
26
+ repo_id = "archivartaunik/BE_XTTS_V2_60epoch3Dataset"
27
+ checkpoint_file = hf_hub_download(repo_id, filename="model.pth")
28
+ config_file = hf_hub_download(repo_id, filename="config.json")
29
+ vocab_file = hf_hub_download(repo_id, filename="vocab.json")
30
+ default_voice_file = hf_hub_download(repo_id, filename="voice.wav")
31
+
32
+ # Загрузка канфігурацыі мадэлі
33
+ config = XttsConfig()
34
+ config.load_json(config_file)
35
+
36
+ # Ініцыялізацыя і загрузка мадэлі
37
+ XTTS_MODEL = Xtts.init_from_config(config)
38
+ XTTS_MODEL.load_checkpoint(config, checkpoint_path=checkpoint_file, vocab_path=vocab_file, use_deepspeed=False)
39
+
40
+ @spaces.GPU(duration=60)
41
+ def text_to_speech(belarusian_story, lang="be", speaker_audio_file=None):
42
+ device = "cuda:0" if torch.cuda.is_available() else "cpu"
43
+ XTTS_MODEL.to(device)
44
+ # Калі файл не пададзены, выкарыстоўваем голас па змаўчанні
45
+ if not speaker_audio_file or (not isinstance(speaker_audio_file, str) and speaker_audio_file.name == ""):
46
+ speaker_audio_file = default_voice_file
47
+
48
+ # Атрыманне латэнтных умоў і эмацый
49
+ gpt_cond_latent, speaker_embedding = XTTS_MODEL.get_conditioning_latents(
50
+ audio_path=speaker_audio_file,
51
+ gpt_cond_len=XTTS_MODEL.config.gpt_cond_len,
52
+ max_ref_length=XTTS_MODEL.config.max_ref_len,
53
+ sound_norm_refs=XTTS_MODEL.config.sound_norm_refs,
54
+ )
55
+
56
+ # Токенізацыя тэксту на асобныя сказы
57
+ tts_texts = sent_tokenize(belarusian_story)
58
+
59
+ # Генерацыя аўдыё для кожнага сказы
60
+ wav_chunks = []
61
+ for text in tqdm(tts_texts):
62
+ wav_chunk = XTTS_MODEL.inference(
63
+ text=text,
64
+ language=lang,
65
+ gpt_cond_latent=gpt_cond_latent,
66
+ speaker_embedding=speaker_embedding,
67
+ temperature=0.1,
68
+ length_penalty=1.0,
69
+ repetition_penalty=10.0,
70
+ top_k=10,
71
+ top_p=0.3,
72
+ )
73
+ wav_chunks.append(torch.tensor(wav_chunk["wav"]))
74
+
75
+ # Аб'ядноўваем усе часткі аўдыё ў адзін масіў
76
+ out_wav = torch.cat(wav_chunks, dim=0).squeeze().cpu().numpy()
77
+
78
+ # Захоўваем аўдыё ў часовы файл
79
+ temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
80
+ write(temp_file.name, 24000, out_wav)
81
+
82
+ return temp_file.name
83
+
84
+
85
+ demo = gr.Interface(
86
+ fn=text_to_speech,
87
+ inputs=[
88
+ gr.Textbox(lines=5, label="Тэкст на беларускай мове"),
89
+ gr.Textbox(value="be", label="Мова (па змаўчанні BE)", visible=False),
90
+ gr.Audio(type="filepath", label="Запішыце або загрузіце файл голасу (без іншых гукаў) не карацей 7 секунд", interactive=True),
91
+ ],
92
+ outputs="audio",
93
+ title="XTTS Belarusian TTS Demo",
94
+ description="Увядзіце тэкст, і мадэль пераўтворыць яго ў аўдыя. Вы можаце выкарыстоўваць голас па змаўчанні, загрузіць уласны файл або запісаць аўдыё.",
95
+ )
96
+
97
+ if __name__ == "__main__":
98
+ demo.launch()