fewe32 commited on
Commit
2fea0af
·
verified ·
1 Parent(s): eafff01

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +143 -53
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
- def preprocess_text(text, should_add_pauses, convert_accent):
38
- if convert_accent:
39
- text = convert_accented_text(text)
40
- if should_add_pauses:
41
- text = add_pauses(text)
42
- return text
 
 
 
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("Текст должен быть меньше 50k символов")
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
- with gr.Blocks() as demo:
64
- gr.Markdown(description)
65
-
66
- text_input = gr.Textbox(label='Текст:', lines=5, max_lines=10)
67
- speed_slider = gr.Slider(label='Скорость:', maximum=1.3, minimum=0.7, value=1.0)
68
- steps_slider = gr.Slider(label='Количество шагов диффузии:', minimum=3, maximum=20, step=1, value=3)
69
-
70
- # Чекбоксы для обработки текста
71
- add_pauses_checkbox = gr.Checkbox(label="Добавить паузы")
72
- convert_accent_checkbox = gr.Checkbox(label="Преобразовать акценты")
73
-
74
- # Кнопка для конвертации текста
75
- convert_button = gr.Button("Преобразовать текст")
76
- convert_output = gr.Textbox(label="Преобразованный текст")
77
-
78
- # Кнопка для синтеза речи
79
- synthesize_button = gr.Button("Синтезировать речь")
80
- output_audio = gr.Audio(label="Аудио", autoplay=False, streaming=False, type="numpy")
81
-
82
- # Связываем кнопки с функциями
83
- convert_button.click(
84
- fn=convert_text,
85
- inputs=[text_input, add_pauses_checkbox, convert_accent_checkbox],
86
- outputs=convert_output
87
- )
88
-
89
- synthesize_button.click(
90
- fn=synthesise,
91
- inputs=[convert_output, speed_slider, steps_slider],
92
- outputs=output_audio
93
- )
94
-
95
- demo.launch(share=True, server_name="0.0.0.0")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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")