Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,17 +1,60 @@
|
|
1 |
import gradio as gr
|
2 |
from infer import inference
|
3 |
import unicodedata
|
|
|
4 |
|
5 |
description = '''
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
'''
|
10 |
|
11 |
-
#
|
12 |
def normalize_text(text):
|
13 |
return unicodedata.normalize('NFC', text)
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
def convert_accented_text(text):
|
16 |
result = ""
|
17 |
for char in text:
|
@@ -34,62 +77,109 @@ def add_pauses(text):
|
|
34 |
text = text.replace('?', '? ... ...')
|
35 |
return text
|
36 |
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
|
|
|
|
|
|
43 |
|
44 |
-
# Функция синтеза речи
|
45 |
def synthesise(text, speed, steps, progress=gr.Progress()):
|
46 |
if text.strip() == "":
|
47 |
-
raise gr.Error("
|
48 |
if len(text) > 50000:
|
49 |
-
raise gr.Error("
|
50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
print("*** saying ***")
|
52 |
print(text)
|
53 |
print("*** end ***")
|
54 |
-
|
55 |
-
return 24000, inference(text, progress, speed=speed, alpha=1.0, diffusion_steps=steps, embedding_scale=1.0)[0]
|
56 |
|
57 |
-
|
58 |
-
def convert_text(text, should_add_pauses, convert_accent):
|
59 |
-
return preprocess_text(text, should_add_pauses, convert_accent)
|
60 |
|
61 |
-
# Основной интерфейс Gradio
|
62 |
if __name__ == "__main__":
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import gradio as gr
|
2 |
from infer import inference
|
3 |
import unicodedata
|
4 |
+
import regex
|
5 |
|
6 |
description = '''
|
7 |
+
Програма може не коректно визначати деякі наголоси і не перетворює цифри, акроніми і різні скорочення в словесну форму.
|
8 |
+
Якщо наголос не правильний, використовуйте символ + після наголошеного складу.
|
9 |
+
Також дуже маленькі речення можуть крешати, тому пишіть щось більше а не одне-два слова.
|
10 |
'''
|
11 |
|
12 |
+
# Text Pre-processing Functions
|
13 |
def normalize_text(text):
|
14 |
return unicodedata.normalize('NFC', text)
|
15 |
|
16 |
+
def remove_combining_chars(text):
|
17 |
+
decomposed = unicodedata.normalize('NFD', text)
|
18 |
+
filtered = ''.join(c for c in decomposed if unicodedata.category(c) != 'Mn')
|
19 |
+
return unicodedata.normalize('NFC', filtered)
|
20 |
+
|
21 |
+
def adjust_case(original, replacement):
|
22 |
+
if original.isupper():
|
23 |
+
return replacement.upper()
|
24 |
+
elif original[0].isupper() and original[1:].islower():
|
25 |
+
return replacement.capitalize()
|
26 |
+
elif original.islower():
|
27 |
+
return replacement.lower()
|
28 |
+
else:
|
29 |
+
adjusted = ''
|
30 |
+
for o_char, r_char in zip(original, replacement):
|
31 |
+
if o_char.isupper():
|
32 |
+
adjusted += r_char.upper()
|
33 |
+
else:
|
34 |
+
adjusted += r_char.lower()
|
35 |
+
adjusted += replacement[len(original):]
|
36 |
+
return adjusted
|
37 |
+
|
38 |
+
def replace_with_custom_dict(text, custom_dict):
|
39 |
+
text = normalize_text(text)
|
40 |
+
tokens = regex.findall(r'[\p{L}\p{M}\+]+|\s+|[^\s\p{L}\p{M}]+', text)
|
41 |
+
new_tokens = []
|
42 |
+
for token in tokens:
|
43 |
+
token_normalized = normalize_text(token)
|
44 |
+
if regex.match(r'^[\p{L}\p{M}\+]+$', token_normalized):
|
45 |
+
token_no_combining = remove_combining_chars(token_normalized)
|
46 |
+
base_token = token_no_combining.replace('+', '').lower()
|
47 |
+
base_token = normalize_text(base_token)
|
48 |
+
if base_token in custom_dict:
|
49 |
+
replacement = custom_dict[base_token]
|
50 |
+
adjusted_replacement = adjust_case(token, replacement)
|
51 |
+
new_tokens.append(adjusted_replacement)
|
52 |
+
else:
|
53 |
+
new_tokens.append(token)
|
54 |
+
else:
|
55 |
+
new_tokens.append(token)
|
56 |
+
return ''.join(new_tokens)
|
57 |
+
|
58 |
def convert_accented_text(text):
|
59 |
result = ""
|
60 |
for char in text:
|
|
|
77 |
text = text.replace('?', '? ... ...')
|
78 |
return text
|
79 |
|
80 |
+
# Load the custom dictionary from dict.txt
|
81 |
+
custom_dict = {}
|
82 |
+
with open('dict.txt', 'r', encoding='utf-8') as f:
|
83 |
+
for line in f:
|
84 |
+
line = line.strip()
|
85 |
+
if line:
|
86 |
+
line_normalized = normalize_text(line)
|
87 |
+
base_word = remove_combining_chars(line_normalized.replace('+', '').lower())
|
88 |
+
custom_dict[base_word] = line_normalized
|
89 |
|
|
|
90 |
def synthesise(text, speed, steps, progress=gr.Progress()):
|
91 |
if text.strip() == "":
|
92 |
+
raise gr.Error("You must enter some text")
|
93 |
if len(text) > 50000:
|
94 |
+
raise gr.Error("Text must be <50k characters")
|
95 |
+
|
96 |
+
# Pre-process the text
|
97 |
+
text = normalize_text(text)
|
98 |
+
text = replace_with_custom_dict(text, custom_dict)
|
99 |
+
text = convert_accented_text(text)
|
100 |
+
# Uncomment the next line if you want to add pauses
|
101 |
+
# text = add_pauses(text)
|
102 |
+
|
103 |
print("*** saying ***")
|
104 |
print(text)
|
105 |
print("*** end ***")
|
|
|
|
|
106 |
|
107 |
+
return 24000, inference(text, progress, speed=speed, alpha=1.0, diffusion_steps=steps, embedding_scale=1.0)[0]
|
|
|
|
|
108 |
|
|
|
109 |
if __name__ == "__main__":
|
110 |
+
i = gr.Interface(
|
111 |
+
fn=synthesise,
|
112 |
+
description=description,
|
113 |
+
inputs=[
|
114 |
+
gr.Text(label='Text:', lines=5, max_lines=10),
|
115 |
+
gr.Slider(label='Швидкість:', maximum=1.3, minimum=0.7, value=1.0),
|
116 |
+
gr.Slider(label='Кількість кроків дифузії:', minimum=3, maximum=20, step=1, value=3)
|
117 |
+
],
|
118 |
+
outputs=[
|
119 |
+
gr.Audio(
|
120 |
+
label="Audio:",
|
121 |
+
autoplay=False,
|
122 |
+
streaming=False,
|
123 |
+
type="numpy",
|
124 |
+
),
|
125 |
+
],
|
126 |
+
allow_flagging='never',
|
127 |
+
cache_examples=False,
|
128 |
+
title='StyleTTS2 Ukrainian Demo',
|
129 |
+
examples=[
|
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 |
+
І поцілува+ла. ... ... . ... ... . ... ...
|
168 |
+
Нена+че со+нце засія+ло,:::
|
169 |
+
Нена+че все на сві+ті ста+ло
|
170 |
+
Моє+::: лани+,::: гаї+,::: сади+. ... ... . ... ... . ... ...
|
171 |
+
І ми,::: жарту+ючи,::: погна+ли
|
172 |
+
Чужі+ ягня+та до води+. ... ...
|
173 |
+
Бридня+! ... .... ... ... . ... ... А й до+сі,::: як згада+ю,:::
|
174 |
+
То се+рце пла+че та боли+ть,:::
|
175 |
+
Чому+ Госпо+дь не дав дожить
|
176 |
+
Мало+го ві+ку у ті+м ра+ю. ... ...
|
177 |
+
Уме+р би,::: орючи+ на ни+ві,:::
|
178 |
+
Нічо+го б на сві+ті не знав. ... ...
|
179 |
+
Не був би в сві+ті юроди+вим. ... ...
|
180 |
+
Люде+й і [Бо+га] не прокля+в! ... ...''', 1.0, 6
|
181 |
+
]
|
182 |
+
],
|
183 |
+
)
|
184 |
+
i.queue(max_size=20, default_concurrency_limit=4)
|
185 |
+
i.launch(share=False, server_name="0.0.0.0")
|