RafaG commited on
Commit
07a4c5d
·
verified ·
1 Parent(s): 4f5369e

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +128 -0
  2. requiriments.txt +2 -0
  3. voice_map.py +312 -0
app.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess
2
+ import os
3
+ import gradio as gr
4
+ from pydub import AudioSegment
5
+ from voice_map import SUPPORTED_VOICES
6
+
7
+ def generate_audio(texto, modelo_de_voz, velocidade):
8
+ if velocidade is None: # Verifique se velocidade é None
9
+ velocidade = 0 # Defina um valor padrão se velocidade for None
10
+
11
+ if velocidade >= 0:
12
+ rate_str = f"+{velocidade}%"
13
+ else:
14
+ rate_str = f"{velocidade}%"
15
+
16
+ output_dir = "output"
17
+ os.makedirs(output_dir, exist_ok=True) # Certifique-se de que o diretório de saída exista
18
+
19
+ mp3_output_file = os.path.join(output_dir, "new_audio.mp3")
20
+
21
+ cmd = ["edge-tts", "--rate=" + rate_str, "-v", modelo_de_voz, "-t", texto, "--write-media", mp3_output_file]
22
+
23
+ print("Gerando áudio...")
24
+ try:
25
+ subprocess.run(cmd, check=True)
26
+ except subprocess.CalledProcessError as e:
27
+ print("Erro ao gerar áudio:", e)
28
+ return None
29
+
30
+ print("Áudio gerado com sucesso!")
31
+
32
+ # Convertendo o arquivo de MP3 para WAV
33
+ wav_output_file = os.path.join(output_dir, "new_audio.wav")
34
+ audio = AudioSegment.from_mp3(mp3_output_file)
35
+ audio.export(wav_output_file, format="wav")
36
+
37
+ return wav_output_file # Retorna o caminho completo do arquivo de áudio WAV
38
+
39
+ from elevenlabs import generate
40
+
41
+ def generate_audio_elevenlabsfree(texto, modelo_de_voz):
42
+ output_dir = "output"
43
+ os.makedirs(output_dir, exist_ok=True) # Certifique-se de que o diretório de saída exista
44
+
45
+ try:
46
+ # Gerar áudio usando elevenlabs
47
+ audio = generate(
48
+ text=texto,
49
+ voice=modelo_de_voz,
50
+ model='eleven_multilingual_v2'
51
+ )
52
+
53
+ # Caminho completo para o arquivo de saída
54
+ output_file_path = os.path.join(output_dir, "new_audio.wav")
55
+
56
+ # Escrever os dados do áudio no arquivo WAV
57
+ with open(output_file_path, 'wb') as wf:
58
+ wf.write(audio)
59
+
60
+ print("Áudio gerado com sucesso em:", output_file_path)
61
+ return output_file_path
62
+ except Exception as e:
63
+ print("Erro ao gerar áudio:", e)
64
+ return None
65
+
66
+ badges = """
67
+ <div style="display: flex">
68
+ <span style="margin-right: 5px">
69
+
70
+ [ ![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) ](https://github.com/rafaelGodoyEbert)
71
+
72
+ </span>
73
+ <span style="margin-right: 5px">
74
+
75
+ [ ![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white) ](https://twitter.com/GodoyEbert)
76
+
77
+ </span>
78
+ <span>
79
+
80
+ [ ![](https://dcbadge.vercel.app/api/server/aihubbrasil) ](https://discord.gg/aihubbrasil)
81
+
82
+ </span>
83
+ </div>
84
+ """
85
+
86
+ description = """
87
+ # TTS Rápido
88
+ TTS Rápido, para todos aqueles que sempre me pediam alguma forma de fazer algum TTS.<br>
89
+ Tem em diversos idiomas, só aproveitar<br>
90
+ Increva-se no canal do <a href='https://www.youtube.com/@aihubbrasil' target='_blank'>Youtube do AI HUB Brasil</a> e no meu pessoal <a href='https://www.youtube.com/@godoyy' target='_blank'>Godoyy</a>
91
+ """
92
+
93
+
94
+ with gr.Blocks(theme=gr.themes.Default(primary_hue="green", secondary_hue="blue"), title="TTS Rápido") as iface:
95
+ gr.Markdown(badges)
96
+ gr.Markdown(description)
97
+ title="TTS Rápido"
98
+ description="Digite o texto, escolha o modelo de voz e ajuste a velocidade para gerar um áudio. O áudio resultante pode ser reproduzido diretamente no Gradio."
99
+
100
+ with gr.Tabs():
101
+ with gr.TabItem("Edge-TTS"):
102
+ gr.Markdown("Botei todos os idiomas possível, até onde testei, é ilimitado, podendo até mesmo colocar um livro inteiro, mas claro, tem a questão de tempo, quanto maior o texto, mais demorado é.")
103
+ # Defina os elementos de entrada e saída
104
+ audio_input = gr.Textbox(label="Texto", value='Texto de exemplo!', interactive=True)
105
+ voice_model_input = gr.Dropdown(SUPPORTED_VOICES, label="Modelo de Voz", value="pt-BR-AntonioNeural")
106
+ speed_input = gr.Slider(minimum=-200, maximum=200, label="Velocidade (%)", value=0)
107
+ audio_output = gr.Audio(label="Áudio", type="filepath", interactive=False)
108
+ edgetts_button = gr.Button(value="Falar")
109
+ edgetts_button.click(fn=generate_audio, inputs=[audio_input, voice_model_input], outputs=[audio_output])
110
+ clear_button = gr.ClearButton(audio_input, value='Limpar')
111
+ gr.Markdown("Agradecimentos a rany2 pelo Edge-TTS")
112
+
113
+ with gr.TabItem("Elevenlabs SEM API"):
114
+ gr.Markdown("Esse é a API gratuita que é disponivel pela própria Elevenlabs, não sei os limites, mas sei que tem, acredito que após 3 requests seguidos já caia, então tenha certeza o texto que vá usar.")
115
+ audio_input = gr.Textbox(label="Texto (Acho que o limite é 250 caracteres)", value='Texto de exemplo!', interactive=True)
116
+ voice_model_input = gr.Dropdown(['Arnold', 'Antoni','Bella', 'Rachel', 'Drew', 'Clyde', 'Paul' ], label="Modelo de Voz", value="Arnold")
117
+ audio_output = gr.Audio(label="Áudio", type="filepath", interactive=False)
118
+ elevenlabs_button = gr.Button(value="Falar")
119
+ elevenlabs_button.click(fn=generate_audio_elevenlabsfree, inputs=[audio_input, voice_model_input], outputs=[audio_output])
120
+ clear_button = gr.ClearButton(audio_input, value='Limpar')
121
+ gr.Markdown("Agradecimentos ao Elevenlabs")
122
+
123
+ # Executar o aplicativo Gradio
124
+ gr.Markdown("""
125
+ Desenvolvido por Rafael Godoy <br>
126
+ Apoie o projeto pelo https://nubank.com.br/pagar/1ls6a4/0QpSSbWBSq, qualquer valor é bem vindo.
127
+ """)
128
+ iface.launch()
requiriments.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ edge-tts
2
+ elevenlabs==0.2.15
voice_map.py ADDED
@@ -0,0 +1,312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SUPPORTED_VOICES = {
2
+ # 'es-AR': 'es-AR-TomasNeural',
3
+ # 'en-US': 'en-US-EricNeural',
4
+ # 'it-IT': 'it-IT-DiegoNeural',
5
+ # 'fr-FR': 'fr-FR-HenriNeural',
6
+ # 'ru-RU': 'ru-RU-DmitryNeural',
7
+ # 'de-DE': 'de-DE-ConradNeural',
8
+ # 'pt-BR': 'pt-BR-AntonioNeural',
9
+ # 'pt-PT': 'pt-PT-DuarteNeural',
10
+ # }
11
+
12
+
13
+ SUPPORTED_VOICES = {
14
+ 'zh-CN-XiaoxiaoNeural',
15
+ 'zh-CN-XiaoyiNeural',
16
+ 'zh-CN-YunjianNeural',
17
+ 'zh-CN-YunxiNeural',
18
+ 'zh-CN-YunxiaNeural',
19
+ 'zh-CN-YunyangNeural',
20
+ 'zh-HK-HiuGaaiNeural',
21
+ 'zh-HK-HiuMaanNeural',
22
+ 'zh-HK-WanLungNeural',
23
+ 'zh-TW-HsiaoChenNeural',
24
+ 'zh-TW-YunJheNeural',
25
+ 'zh-TW-HsiaoYuNeural',
26
+ 'af-ZA-AdriNeural',
27
+ 'af-ZA-WillemNeural',
28
+ 'am-ET-AmehaNeural',
29
+ 'am-ET-MekdesNeural',
30
+ 'ar-AE-FatimaNeural',
31
+ 'ar-AE-HamdanNeural',
32
+ 'ar-BH-AliNeural',
33
+ 'ar-BH-LailaNeural',
34
+ 'ar-DZ-AminaNeural',
35
+ 'ar-DZ-IsmaelNeural',
36
+ 'ar-EG-SalmaNeural',
37
+ 'ar-EG-ShakirNeural',
38
+ 'ar-IQ-BasselNeural',
39
+ 'ar-IQ-RanaNeural',
40
+ 'ar-JO-SanaNeural',
41
+ 'ar-JO-TaimNeural',
42
+ 'ar-KW-FahedNeural',
43
+ 'ar-KW-NouraNeural',
44
+ 'ar-LB-LaylaNeural',
45
+ 'ar-LB-RamiNeural',
46
+ 'ar-LY-ImanNeural',
47
+ 'ar-LY-OmarNeural',
48
+ 'ar-MA-JamalNeural',
49
+ 'ar-MA-MounaNeural',
50
+ 'ar-OM-AbdullahNeural',
51
+ 'ar-OM-AyshaNeural',
52
+ 'ar-QA-AmalNeural',
53
+ 'ar-QA-MoazNeural',
54
+ 'ar-SA-HamedNeural',
55
+ 'ar-SA-ZariyahNeural',
56
+ 'ar-SY-AmanyNeural',
57
+ 'ar-SY-LaithNeural',
58
+ 'ar-TN-HediNeural',
59
+ 'ar-TN-ReemNeural',
60
+ 'ar-YE-MaryamNeural',
61
+ 'ar-YE-SalehNeural',
62
+ 'az-AZ-BabekNeural',
63
+ 'az-AZ-BanuNeural',
64
+ 'bg-BG-BorislavNeural',
65
+ 'bg-BG-KalinaNeural',
66
+ 'bn-BD-NabanitaNeural',
67
+ 'bn-BD-PradeepNeural',
68
+ 'bn-IN-BashkarNeural',
69
+ 'bn-IN-TanishaaNeural',
70
+ 'bs-BA-GoranNeural',
71
+ 'bs-BA-VesnaNeural',
72
+ 'ca-ES-EnricNeural',
73
+ 'ca-ES-JoanaNeural',
74
+ 'cs-CZ-AntoninNeural',
75
+ 'cs-CZ-VlastaNeural',
76
+ 'cy-GB-AledNeural',
77
+ 'cy-GB-NiaNeural',
78
+ 'da-DK-ChristelNeural',
79
+ 'da-DK-JeppeNeural',
80
+ 'de-AT-IngridNeural',
81
+ 'de-AT-JonasNeural',
82
+ 'de-CH-JanNeural',
83
+ 'de-CH-LeniNeural',
84
+ 'de-DE-AmalaNeural',
85
+ 'de-DE-ConradNeural',
86
+ 'de-DE-KatjaNeural',
87
+ 'de-DE-KillianNeural',
88
+ 'el-GR-AthinaNeural',
89
+ 'el-GR-NestorasNeural',
90
+ 'en-AU-NatashaNeural',
91
+ 'en-AU-WilliamNeural',
92
+ 'en-CA-ClaraNeural',
93
+ 'en-CA-LiamNeural',
94
+ 'en-GB-LibbyNeural',
95
+ 'en-GB-MaisieNeural',
96
+ 'en-GB-RyanNeural',
97
+ 'en-GB-SoniaNeural',
98
+ 'en-GB-ThomasNeural',
99
+ 'en-HK-SamNeural',
100
+ 'en-HK-YanNeural',
101
+ 'en-IE-ConnorNeural',
102
+ 'en-IE-EmilyNeural',
103
+ 'en-IN-NeerjaNeural',
104
+ 'en-IN-PrabhatNeural',
105
+ 'en-KE-AsiliaNeural',
106
+ 'en-KE-ChilembaNeural',
107
+ 'en-NG-AbeoNeural',
108
+ 'en-NG-EzinneNeural',
109
+ 'en-NZ-MitchellNeural',
110
+ 'en-NZ-MollyNeural',
111
+ 'en-PH-JamesNeural',
112
+ 'en-PH-RosaNeural',
113
+ 'en-SG-LunaNeural',
114
+ 'en-SG-WayneNeural',
115
+ 'en-TZ-ElimuNeural',
116
+ 'en-TZ-ImaniNeural',
117
+ 'en-US-EricNeural',
118
+ 'en-US-AnaNeural',
119
+ 'en-US-AriaNeural',
120
+ 'en-US-ChristopherNeural',
121
+ 'en-US-GuyNeural',
122
+ 'en-US-JennyNeural',
123
+ 'en-US-MichelleNeural',
124
+ 'en-ZA-LeahNeural',
125
+ 'en-ZA-LukeNeural',
126
+ 'es-AR-ElenaNeural',
127
+ 'es-AR-TomasNeural',
128
+ 'es-BO-MarceloNeural',
129
+ 'es-BO-SofiaNeural',
130
+ 'es-CL-CatalinaNeural',
131
+ 'es-CL-LorenzoNeural',
132
+ 'es-CO-GonzaloNeural',
133
+ 'es-CO-SalomeNeural',
134
+ 'es-CR-JuanNeural',
135
+ 'es-CR-MariaNeural',
136
+ 'es-CU-BelkysNeural',
137
+ 'es-CU-ManuelNeural',
138
+ 'es-DO-EmilioNeural',
139
+ 'es-DO-RamonaNeural',
140
+ 'es-EC-AndreaNeural',
141
+ 'es-EC-LuisNeural',
142
+ 'es-ES-AlvaroNeural',
143
+ 'es-ES-ElviraNeural',
144
+ 'es-ES-ManuelEsCUNeural',
145
+ 'es-GQ-JavierNeural',
146
+ 'es-GQ-TeresaNeural',
147
+ 'es-GT-AndresNeural',
148
+ 'es-GT-MartaNeural',
149
+ 'es-HN-CarlosNeural',
150
+ 'es-HN-KarlaNeural',
151
+ 'es-MX-DaliaNeural',
152
+ 'es-MX-JorgeNeural',
153
+ 'es-MX-LorenzoEsCLNeural',
154
+ 'es-NI-FedericoNeural',
155
+ 'es-NI-YolandaNeural',
156
+ 'es-PA-MargaritaNeural',
157
+ 'es-PA-RobertoNeural',
158
+ 'es-PE-AlexNeural',
159
+ 'es-PE-CamilaNeural',
160
+ 'es-PR-KarinaNeural',
161
+ 'es-PR-VictorNeural',
162
+ 'es-PY-MarioNeural',
163
+ 'es-PY-TaniaNeural',
164
+ 'es-SV-LorenaNeural',
165
+ 'es-SV-RodrigoNeural',
166
+ 'es-US-AlonsoNeural',
167
+ 'es-US-PalomaNeural',
168
+ 'es-UY-MateoNeural',
169
+ 'es-UY-ValentinaNeural',
170
+ 'es-VE-PaolaNeural',
171
+ 'es-VE-SebastianNeural',
172
+ 'et-EE-AnuNeural',
173
+ 'et-EE-KertNeural',
174
+ 'fa-IR-DilaraNeural',
175
+ 'fa-IR-FaridNeural',
176
+ 'fi-FI-HarriNeural',
177
+ 'fi-FI-NooraNeural',
178
+ 'fil-PH-AngeloNeural',
179
+ 'fil-PH-BlessicaNeural',
180
+ 'fr-BE-CharlineNeural',
181
+ 'fr-BE-GerardNeural',
182
+ 'fr-CA-AntoineNeural',
183
+ 'fr-CA-JeanNeural',
184
+ 'fr-CA-SylvieNeural',
185
+ 'fr-CH-ArianeNeural',
186
+ 'fr-CH-FabriceNeural',
187
+ 'fr-FR-DeniseNeural',
188
+ 'fr-FR-EloiseNeural',
189
+ 'fr-FR-HenriNeural',
190
+ 'ga-IE-ColmNeural',
191
+ 'ga-IE-OrlaNeural',
192
+ 'gl-ES-RoiNeural',
193
+ 'gl-ES-SabelaNeural',
194
+ 'gu-IN-DhwaniNeural',
195
+ 'gu-IN-NiranjanNeural',
196
+ 'he-IL-AvriNeural',
197
+ 'he-IL-HilaNeural',
198
+ 'hi-IN-MadhurNeural',
199
+ 'hi-IN-SwaraNeural',
200
+ 'hr-HR-GabrijelaNeural',
201
+ 'hr-HR-SreckoNeural',
202
+ 'hu-HU-NoemiNeural',
203
+ 'hu-HU-TamasNeural',
204
+ 'id-ID-ArdiNeural',
205
+ 'id-ID-GadisNeural',
206
+ 'is-IS-GudrunNeural',
207
+ 'is-IS-GunnarNeural',
208
+ 'it-IT-DiegoNeural',
209
+ 'it-IT-ElsaNeural',
210
+ 'it-IT-IsabellaNeural',
211
+ 'ja-JP-KeitaNeural',
212
+ 'ja-JP-NanamiNeural',
213
+ 'jv-ID-DimasNeural',
214
+ 'jv-ID-SitiNeural',
215
+ 'ka-GE-EkaNeural',
216
+ 'ka-GE-GiorgiNeural',
217
+ 'kk-KZ-AigulNeural',
218
+ 'kk-KZ-DauletNeural',
219
+ 'km-KH-PisethNeural',
220
+ 'km-KH-SreymomNeural',
221
+ 'kn-IN-GaganNeural',
222
+ 'kn-IN-SapnaNeural',
223
+ 'ko-KR-InJoonNeural',
224
+ 'ko-KR-SunHiNeural',
225
+ 'lo-LA-ChanthavongNeural',
226
+ 'lo-LA-KeomanyNeural',
227
+ 'lt-LT-LeonasNeural',
228
+ 'lt-LT-OnaNeural',
229
+ 'lv-LV-EveritaNeural',
230
+ 'lv-LV-NilsNeural',
231
+ 'mk-MK-AleksandarNeural',
232
+ 'mk-MK-MarijaNeural',
233
+ 'ml-IN-MidhunNeural',
234
+ 'ml-IN-SobhanaNeural',
235
+ 'mn-MN-BataaNeural',
236
+ 'mn-MN-YesuiNeural',
237
+ 'mr-IN-AarohiNeural',
238
+ 'mr-IN-ManoharNeural',
239
+ 'ms-MY-OsmanNeural',
240
+ 'ms-MY-YasminNeural',
241
+ 'mt-MT-GraceNeural',
242
+ 'mt-MT-JosephNeural',
243
+ 'my-MM-NilarNeural',
244
+ 'my-MM-ThihaNeural',
245
+ 'nb-NO-FinnNeural',
246
+ 'nb-NO-PernilleNeural',
247
+ 'ne-NP-HemkalaNeural',
248
+ 'ne-NP-SagarNeural',
249
+ 'nl-BE-ArnaudNeural',
250
+ 'nl-BE-DenaNeural',
251
+ 'nl-NL-ColetteNeural',
252
+ 'nl-NL-FennaNeural',
253
+ 'nl-NL-MaartenNeural',
254
+ 'pl-PL-MarekNeural',
255
+ 'pl-PL-ZofiaNeural',
256
+ 'ps-AF-GulNawazNeural',
257
+ 'ps-AF-LatifaNeural',
258
+ 'pt-BR-AntonioNeural',
259
+ 'pt-BR-FranciscaNeural',
260
+ 'pt-PT-DuarteNeural',
261
+ 'pt-PT-RaquelNeural',
262
+ 'ro-RO-AlinaNeural',
263
+ 'ro-RO-EmilNeural',
264
+ 'ru-RU-DmitryNeural',
265
+ 'ru-RU-SvetlanaNeural',
266
+ 'si-LK-SameeraNeural',
267
+ 'si-LK-ThiliniNeural',
268
+ 'sk-SK-LukasNeural',
269
+ 'sk-SK-ViktoriaNeural',
270
+ 'sl-SI-PetraNeural',
271
+ 'sl-SI-RokNeural',
272
+ 'so-SO-MuuseNeural',
273
+ 'so-SO-UbaxNeural',
274
+ 'sq-AL-AnilaNeural',
275
+ 'sq-AL-IlirNeural',
276
+ 'sr-RS-NicholasNeural',
277
+ 'sr-RS-SophieNeural',
278
+ 'su-ID-JajangNeural',
279
+ 'su-ID-TutiNeural',
280
+ 'sv-SE-MattiasNeural',
281
+ 'sv-SE-SofieNeural',
282
+ 'sw-KE-RafikiNeural',
283
+ 'sw-KE-ZuriNeural',
284
+ 'sw-TZ-DaudiNeural',
285
+ 'sw-TZ-RehemaNeural',
286
+ 'ta-IN-PallaviNeural',
287
+ 'ta-IN-ValluvarNeural',
288
+ 'ta-LK-KumarNeural',
289
+ 'ta-LK-SaranyaNeural',
290
+ 'ta-MY-KaniNeural',
291
+ 'ta-MY-SuryaNeural',
292
+ 'ta-SG-AnbuNeural',
293
+ 'ta-SG-VenbaNeural',
294
+ 'te-IN-MohanNeural',
295
+ 'te-IN-ShrutiNeural',
296
+ 'th-TH-NiwatNeural',
297
+ 'th-TH-PremwadeeNeural',
298
+ 'tr-TR-AhmetNeural',
299
+ 'tr-TR-EmelNeural',
300
+ 'uk-UA-OstapNeural',
301
+ 'uk-UA-PolinaNeural',
302
+ 'ur-IN-GulNeural',
303
+ 'ur-IN-SalmanNeural',
304
+ 'ur-PK-AsadNeural',
305
+ 'ur-PK-UzmaNeural',
306
+ 'uz-UZ-MadinaNeural',
307
+ 'uz-UZ-SardorNeural',
308
+ 'vi-VN-HoaiMyNeural',
309
+ 'vi-VN-NamMinhNeural',
310
+ 'zu-ZA-ThandoNeural',
311
+ 'zu-ZA-ThembaNeural',
312
+ }