RafaG commited on
Commit
8686289
1 Parent(s): 5a85ef3

Upload 7 files

Browse files
Files changed (7) hide show
  1. app.py +352 -142
  2. get_voices.py +115 -0
  3. header.py +25 -25
  4. output/new_audio.mp3 +0 -0
  5. output/new_audio.wav +0 -0
  6. requirements.txt +1 -2
  7. voices.json +1422 -0
app.py CHANGED
@@ -1,142 +1,352 @@
1
- import subprocess
2
-
3
- # Comando para instalar ou atualizar o pacote edge-tts
4
- comando_edge_tts = ["pip", "install", "edge-tts", "-U", "--quiet"]
5
-
6
- # Executando o comando para instalar ou atualizar o pacote edge-tts
7
- subprocess.run(comando_edge_tts)
8
-
9
-
10
-
11
- import subprocess
12
- import os
13
- import gradio as gr
14
- from pydub import AudioSegment
15
- from voice_map import SUPPORTED_VOICES
16
- from header import badges, description
17
- from pydub.silence import split_on_silence
18
-
19
- def generate_audio(texto, modelo_de_voz, velocidade):
20
- if velocidade >= 0:
21
- rate_str = f"+{velocidade}%"
22
- else:
23
- rate_str = f"{velocidade}%"
24
-
25
- output_dir = "output"
26
- os.makedirs(output_dir, exist_ok=True) # Certifique-se de que o diretório de saída exista
27
-
28
- mp3_output_file = os.path.join(output_dir, "new_audio.mp3")
29
-
30
- cmd = ["edge-tts", "--rate=" + rate_str, "-v", modelo_de_voz, "-t", texto, "--write-media", mp3_output_file]
31
-
32
- print("Gerando áudio...")
33
- try:
34
- subprocess.run(cmd, check=True)
35
- except subprocess.CalledProcessError as e:
36
- print("Erro ao gerar áudio:", e)
37
- return None
38
-
39
- print("Áudio gerado com sucesso!")
40
-
41
- # Convertendo o arquivo de MP3 para WAV
42
- wav_output_file = os.path.join(output_dir, "new_audio.wav")
43
- audio = AudioSegment.from_mp3(mp3_output_file)
44
- audio.export(wav_output_file, format="wav")
45
-
46
- return wav_output_file # Retorna o caminho completo do arquivo de áudio WAV
47
-
48
- def remove_silence(input_file, output_file):
49
- audio = AudioSegment.from_wav(input_file)
50
-
51
- # Encontra os segmentos de áudio que não são silêncio
52
- segments = split_on_silence(audio, min_silence_len=500, silence_thresh=-40)
53
-
54
- # Concatena os segmentos de áudio não silenciosos
55
- non_silent_audio = AudioSegment.silent(duration=0)
56
- for segment in segments:
57
- non_silent_audio += segment
58
-
59
- # Salva o áudio sem as partes de silêncio
60
- non_silent_audio.export(output_file, format="wav")
61
-
62
- def controlador_generate_audio(audio_input, voice_model_input, speed_input, checkbox_cortar_silencio):
63
- # Gerar áudio
64
- audio_file = generate_audio(audio_input, voice_model_input, speed_input)
65
- if audio_file:
66
- print("Áudio gerado com sucesso:", audio_file)
67
- # Verificar se o checkbox de cortar silêncio está marcado
68
- if checkbox_cortar_silencio:
69
- print("Cortando silêncio...")
70
- # Remover silêncio do áudio
71
- remove_silence(audio_file, audio_file)
72
- print("Silêncio removido com sucesso!")
73
- else:
74
- print("Erro ao gerar áudio.")
75
- return audio_file # Retornar o caminho do arquivo de áudio
76
-
77
- all_voices = ['Deletado']
78
- with gr.Blocks(theme=gr.themes.Default(primary_hue="green", secondary_hue="blue"), title="TTS Rápido") as iface:
79
- gr.Markdown(badges)
80
- gr.Markdown(description)
81
- title="TTS Rápido"
82
- 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."
83
-
84
- with gr.Tabs():
85
- with gr.TabItem("Edge-TTS"):
86
- 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 é.")
87
- # Defina os elementos de entrada e saída
88
- audio_input = gr.Textbox(label="Texto", value='Texto de exemplo!', interactive=True)
89
- voice_model_input = gr.Dropdown(SUPPORTED_VOICES, label="Modelo de Voz", value="pt-BR-AntonioNeural")
90
- speed_input = gr.Slider(minimum=-200, maximum=200, label="Velocidade (%)", value=0, interactive=True)
91
- checkbox_cortar_silencio = gr.Checkbox(label="Cortar Silencio", interactive=True)
92
- audio_output = gr.Audio(label="Resultado", type="filepath", interactive=False)
93
- edgetts_button = gr.Button(value="Falar")
94
- edgetts_button.click(controlador_generate_audio, inputs=[audio_input, voice_model_input, speed_input, checkbox_cortar_silencio], outputs=[audio_output])
95
- #edgetts_button = gr.Button(value="Falar")
96
- #edgetts_button.click(fn=generate_audio, inputs=[audio_input, voice_model_input, speed_input], outputs=[audio_output])
97
- clear_button = gr.ClearButton(audio_input, value='Limpar')
98
- gr.Markdown("Agradecimentos a rany2 pelo Edge-TTS")
99
-
100
- with gr.TabItem("Elevenlabs"):
101
- with gr.TabItem("Elevenlabs Free"):
102
- 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.")
103
- audio_input = gr.Textbox(label="Texto (Não botei limite de caracteres, mas não sei se tem limite no request)", value='Texto de exemplo!', interactive=True)
104
- voice_model_input = gr.Dropdown(['Deletado reclame com ElevenLabs que mudou API'], label="Modelo de Voz", value='Adam', interactive=True)
105
- gr.Markdown("Se estiver usando huggingface e não rodar quer dizer que já atingiu o limite, o space é publico, se quiser usar utilize o google colab que lá cada máquina é um IP novo")
106
- audio_output = gr.Audio(label="Resultado", type="filepath", interactive=False)
107
- elevenlabs_button = gr.Button(value="Falar")
108
- elevenlabs_button.click(fn=None, inputs=[audio_input, voice_model_input], outputs=[audio_output])
109
- clear_button = gr.ClearButton(audio_input, value='Limpar')
110
- gr.Markdown("Agradecimentos ao Elevenlabs")
111
- with gr.TabItem("Elevenlabs com API"):
112
- gr.Markdown("Versão com API, basicamente mesma coisa que o site, mas por algum motivo as pessoas me pediram")
113
- audio_input_elevenlabs_api = gr.Textbox(label="Texto (Acho que o limite é 2500 caracteres)", value='Texto de exemplo!', interactive=True)
114
- with gr.Row():
115
- id_api = gr.Textbox(label="Digite sua API (Obrigatório)", interactive=True)
116
- voice_model_input = gr.Dropdown(['Deletado reclame com ElevenLabs que mudou API'], label="Modelo de Voz", value="Adam", interactive=True)
117
- id_voz_input = gr.Textbox(label="Ou digite o ID da voz", interactive=True)
118
- gr.Markdown("Abaixo funciona o Modelo (multilingual_v1,v2,mono), só funciona todas abaixo se tiver com o ID de voz (Por enquanto). <br> <a href='https://api.elevenlabs.io/v1/voices' target='_blank'>Nesse link</a> tem ID de voz, só filtrar por voice_id")
119
- with gr.Row():
120
- model_elevenlabs_t = gr.Dropdown(['eleven_multilingual_v2', 'eleven_multilingual_v1', 'eleven_monolingual_v1'], label="Modelo", value='eleven_multilingual_v2', interactive=True)
121
- stability_elevenlabs = gr.Slider(0, 1, step=0.1, label="Establidade", value=0.67, interactive=True)
122
- similarity_boost_elevenlabs = gr.Slider(0, 1, step=0.1, label="Claridade + Similaridade", value=0.8, interactive=True)
123
- style_elevenlabs = gr.Slider(0, 1, step=0.1, label="Exagero de estilo", value=0.0, interactive=True)
124
- use_speaker_boost_elevenlabs = gr.Checkbox(label="Speaker Boost", value=True, interactive=True)
125
- gr.Markdown("Se estiver usando huggingface e não rodar, vá em logs, que está acima da imagem do github e veja se já não passou o limite de request da API")
126
- audio_output = gr.Audio(label="Resultado", type="filepath", interactive=False)
127
- elevenlabs_button = gr.Button(value="Falar")
128
- elevenlabs_button.click(fn=None, inputs=[audio_input_elevenlabs_api, voice_model_input, model_elevenlabs_t, stability_elevenlabs, similarity_boost_elevenlabs, style_elevenlabs, use_speaker_boost_elevenlabs, id_voz_input, id_api], outputs=[audio_output])
129
- clear_button = gr.ClearButton(audio_input_elevenlabs_api, value='Limpar')
130
- gr.Markdown("Agradecimentos ao Elevenlabs")
131
- with gr.TabItem("Conqui-TTS"):
132
- gr.Markdown("Em DEV - Conqui")
133
- # Chame a função do arquivo conqui.py para criar os blocos específicos
134
- # tabs_conqui = conqui.criar_tab_conqui()
135
- # Adicione os blocos criados ao bloco principal
136
- # gr.Component(tabs_conqui)
137
- # Executar o aplicativo Gradio
138
- gr.Markdown("""
139
- Desenvolvido por Rafael Godoy <br>
140
- Apoie o projeto pelo https://nubank.com.br/pagar/1ls6a4/0QpSSbWBSq, qualquer valor é bem vindo.
141
- """)
142
- iface.launch(share=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess
2
+ import os
3
+ import json
4
+ import gradio as gr
5
+ from pydub import AudioSegment
6
+ from header import badges, description
7
+ from pydub.silence import split_on_silence
8
+ from get_voices import get_voices
9
+ #from adjust import remove_silence, controlador_generate_audio, generate_audio
10
+
11
+ # Load voices from JSON file
12
+ def load_voices():
13
+ with open('voices.json', 'r', encoding='utf-8') as f:
14
+ return json.load(f)
15
+
16
+ # Get formatted voice options for specific language
17
+ def get_voice_options(language, voices_data):
18
+ if language in voices_data:
19
+ return [f"{voice['name']} | {voice['gender']}" for voice in voices_data[language]]
20
+ return []
21
+
22
+ # Extract voice name from formatted string
23
+ def extract_voice_name(formatted_voice):
24
+ return formatted_voice.split(" | ")[0]
25
+
26
+ def update_voice_options(language):
27
+ voices_data = load_voices()
28
+ voice_options = get_voice_options(language, voices_data)
29
+ # Retorna apenas a lista de opções e o primeiro valor
30
+ if voice_options:
31
+ return gr.Dropdown(choices=voice_options, value=voice_options[0])
32
+ return gr.Dropdown(choices=[], value=None)
33
+
34
+ def update_voices_and_refresh():
35
+ # Execute get_voices to update the voices.json file
36
+ get_voices()
37
+ # Reload the voices data
38
+ voices_data = load_voices()
39
+ available_languages = list(voices_data.keys())
40
+ # Get initial voices for the first language
41
+ initial_voices = get_voice_options(available_languages[0], voices_data) if available_languages else []
42
+
43
+ return (
44
+ gr.Dropdown(choices=available_languages, value=available_languages[0] if available_languages else None),
45
+ gr.Dropdown(choices=initial_voices, value=initial_voices[0] if initial_voices else None)
46
+ )
47
+
48
+ def remove_silence(input_file, output_file):
49
+ audio = AudioSegment.from_wav(input_file)
50
+
51
+ # Encontra os segmentos de áudio que não são silêncio
52
+ segments = split_on_silence(audio, min_silence_len=500, silence_thresh=-40)
53
+
54
+ # Concatena os segmentos de áudio não silenciosos
55
+ non_silent_audio = AudioSegment.silent(duration=0)
56
+ for segment in segments:
57
+ non_silent_audio += segment
58
+
59
+ # Salva o áudio sem as partes de silêncio
60
+ non_silent_audio.export(output_file, format="wav")
61
+
62
+ def controlador_generate_audio(audio_input, voice_model_input, speed_input, pitch_input, volume_input, checkbox_cortar_silencio):
63
+ # Gerar áudio
64
+ audio_file = generate_audio(audio_input, voice_model_input, speed_input, pitch_input, volume_input)
65
+ if audio_file:
66
+ print("Áudio gerado com sucesso:", audio_file)
67
+ # Verificar se o checkbox de cortar silêncio está marcado
68
+ if checkbox_cortar_silencio:
69
+ print("Cortando silêncio...")
70
+ # Remover silêncio do áudio
71
+ remove_silence(audio_file, audio_file)
72
+ print("Silêncio removido com sucesso!")
73
+ else:
74
+ print("Erro ao gerar áudio.")
75
+ return audio_file # Retornar o caminho do arquivo de áudio
76
+
77
+ def generate_audio(texto, modelo_de_voz, velocidade, tom, volume):
78
+ # Extract actual voice name from formatted string if necessary
79
+ actual_voice = extract_voice_name(modelo_de_voz)
80
+
81
+ # Format parameters with proper signs
82
+ if velocidade >= 0:
83
+ rate_str = f"+{velocidade}%"
84
+ else:
85
+ rate_str = f"{velocidade}%"
86
+
87
+ if tom >= 0:
88
+ pitch_str = f"+{tom}Hz"
89
+ else:
90
+ pitch_str = f"{tom}Hz"
91
+
92
+ if volume >= 0:
93
+ volume_str = f"+{volume}%"
94
+ else:
95
+ volume_str = f"{volume}%"
96
+
97
+ output_dir = "output"
98
+ os.makedirs(output_dir, exist_ok=True)
99
+ mp3_output_file = os.path.join(output_dir, "new_audio.mp3")
100
+
101
+ cmd = [
102
+ "edge-tts",
103
+ "--rate=" + rate_str,
104
+ "--pitch=" + pitch_str,
105
+ "--volume=" + volume_str,
106
+ "-v", actual_voice,
107
+ "-t", texto,
108
+ "--write-media", mp3_output_file
109
+ ]
110
+
111
+ print("Gerando áudio...")
112
+ try:
113
+ subprocess.run(cmd, check=True)
114
+ except subprocess.CalledProcessError as e:
115
+ print("Erro ao gerar áudio:", e)
116
+ return None
117
+
118
+ print("Áudio gerado com sucesso!")
119
+ wav_output_file = os.path.join(output_dir, "new_audio.wav")
120
+ audio = AudioSegment.from_mp3(mp3_output_file)
121
+ audio.export(wav_output_file, format="wav")
122
+ return wav_output_file
123
+
124
+ def generate_audio_from_file(file_path, modelo_de_voz, velocidade, tom, volume):
125
+ # Extrai o nome real da voz formatada, se necessário
126
+ actual_voice = extract_voice_name(modelo_de_voz)
127
+
128
+ # Formatação dos parâmetros com sinais adequados
129
+ rate_str = f"+{velocidade}%" if velocidade >= 0 else f"{velocidade}%"
130
+ pitch_str = f"+{tom}Hz" if tom >= 0 else f"{tom}Hz"
131
+ volume_str = f"+{volume}%" if volume >= 0 else f"{volume}%"
132
+
133
+ output_dir = "output"
134
+ os.makedirs(output_dir, exist_ok=True)
135
+ mp3_output_file = os.path.join(output_dir, "new_audio.mp3")
136
+
137
+ # Usar -f FILE para passar o caminho do arquivo de texto
138
+ cmd = [
139
+ "edge-tts",
140
+ "-f", file_path, # Certificar que o conteúdo do arquivo seja texto puro
141
+ "--rate=" + rate_str,
142
+ "--pitch=" + pitch_str,
143
+ "--volume=" + volume_str,
144
+ "-v", actual_voice,
145
+ "--write-media", mp3_output_file
146
+ ]
147
+
148
+ print("Gerando áudio do arquivo...")
149
+ try:
150
+ subprocess.run(cmd, check=True)
151
+ except subprocess.CalledProcessError as e:
152
+ print("Erro ao gerar áudio:", e)
153
+ return None
154
+
155
+ print("Áudio gerado com sucesso!")
156
+ wav_output_file = os.path.join(output_dir, "new_audio.wav")
157
+ audio = AudioSegment.from_mp3(mp3_output_file)
158
+ audio.export(wav_output_file, format="wav")
159
+ return wav_output_file
160
+
161
+ def controlador_generate_audio_from_file(file, voice_model_input, speed_input, pitch_input, volume_input, checkbox_cortar_silencio):
162
+ if file is None:
163
+ return None
164
+
165
+ # Neste caso, o 'file' já é o caminho do arquivo, então não precisa reescrever
166
+ temp_file_path = file # Caminho do arquivo que você recebe do Gradio
167
+
168
+ # Gerar o áudio
169
+ audio_file = generate_audio_from_file(temp_file_path, voice_model_input, speed_input, pitch_input, volume_input)
170
+
171
+ if audio_file:
172
+ print("Áudio gerado com sucesso:", audio_file)
173
+ if checkbox_cortar_silencio:
174
+ print("Cortando silêncio...")
175
+ remove_silence(audio_file, audio_file)
176
+ print("Silêncio removido com sucesso!")
177
+ else:
178
+ print("Erro ao gerar áudio.")
179
+
180
+ return audio_file
181
+
182
+ with gr.Blocks(theme=gr.themes.Default(primary_hue="green", secondary_hue="blue"), title="QuickTTS") as iface:
183
+ gr.Markdown(badges)
184
+ gr.Markdown(description)
185
+
186
+ voices_data = load_voices()
187
+ available_languages = list(voices_data.keys())
188
+
189
+ with gr.Tabs():
190
+ with gr.TabItem("Edge-TTS"):
191
+ gr.Markdown("É ilimitado, podendo até mesmo colocar um livro inteiro, mas claro, tem a questão de tempo, quanto maior o texto, mais demorado é, dublagem por SRT talvez um dia eu bote.")
192
+
193
+ # Language selection dropdown
194
+ language_input = gr.Dropdown(
195
+ choices=available_languages,
196
+ label="Idioma",
197
+ value=available_languages[52] if available_languages else None
198
+ )
199
+
200
+ # Voice model dropdown (will be updated based on language selection)
201
+ initial_voices = get_voice_options(available_languages[52], voices_data) if available_languages else []
202
+ voice_model_input = gr.Dropdown(
203
+ choices=initial_voices,
204
+ label="Modelo de Voz",
205
+ value=initial_voices[0] if initial_voices else None
206
+ )
207
+
208
+ # Connect language selection to voice model update
209
+ language_input.change(
210
+ fn=update_voice_options,
211
+ inputs=[language_input],
212
+ outputs=[voice_model_input]
213
+ )
214
+
215
+ audio_input = gr.Textbox(label="Texto", value='Texto de exemplo!', interactive=True)
216
+
217
+ with gr.Row():
218
+ with gr.Column():
219
+ speed_input = gr.Slider(
220
+ minimum=-200,
221
+ maximum=200,
222
+ label="Velocidade (%)",
223
+ value=0,
224
+ interactive=True
225
+ )
226
+ with gr.Column():
227
+ pitch_input = gr.Slider(
228
+ minimum=-100,
229
+ maximum=100,
230
+ label="Tom (Hz)",
231
+ value=0,
232
+ interactive=True
233
+ )
234
+ with gr.Column():
235
+ volume_input = gr.Slider(
236
+ minimum=-99,
237
+ maximum=100,
238
+ label="Volume (%)",
239
+ value=0,
240
+ interactive=True
241
+ )
242
+
243
+ checkbox_cortar_silencio = gr.Checkbox(label="Cortar Silencio", interactive=True)
244
+ audio_output = gr.Audio(label="Resultado", type="filepath", interactive=False)
245
+
246
+ edgetts_button = gr.Button(value="Falar")
247
+ edgetts_button.click(
248
+ controlador_generate_audio,
249
+ inputs=[
250
+ audio_input,
251
+ voice_model_input,
252
+ speed_input,
253
+ pitch_input, # New input
254
+ volume_input, # New input
255
+ checkbox_cortar_silencio
256
+ ],
257
+ outputs=[audio_output]
258
+ )
259
+
260
+ clear_button = gr.ClearButton(audio_input, value='Limpar')
261
+
262
+ # Add update voices button at the top
263
+ update_voices_btn = gr.Button(value="Atualizar Lista de Vozes")
264
+ # Connect update voices button to refresh function
265
+ update_voices_btn.click(
266
+ fn=update_voices_and_refresh,
267
+ inputs=[],
268
+ outputs=[language_input, voice_model_input]
269
+ )
270
+ gr.Markdown("Agradecimentos a rany2 pelo Edge-TTS")
271
+
272
+ with gr.TabItem("Lote (Arquivo txt)"):
273
+ gr.Markdown("Carregar texto de um arquivo")
274
+ # Language and voice selection (same as first tab)
275
+ language_input_file = gr.Dropdown(
276
+ choices=available_languages,
277
+ label="Idioma",
278
+ value=available_languages[52] if available_languages else None
279
+ )
280
+
281
+ initial_voices = get_voice_options(available_languages[52], voices_data) if available_languages else []
282
+ voice_model_input_file = gr.Dropdown(
283
+ choices=initial_voices,
284
+ label="Modelo de Voz",
285
+ value=initial_voices[0] if initial_voices else None
286
+ )
287
+
288
+ language_input_file.change(
289
+ fn=update_voice_options,
290
+ inputs=[language_input_file],
291
+ outputs=[voice_model_input_file]
292
+ )
293
+ gr.Markdown("O programa vai ler linha por linha e entregar em um único áudio")
294
+ # File input
295
+ file_input = gr.File(
296
+ label="Arquivo de Texto",
297
+ file_types=[".txt"],
298
+ type="filepath"
299
+ )
300
+
301
+ with gr.Row():
302
+ with gr.Column():
303
+ speed_input_file = gr.Slider(
304
+ minimum=-200,
305
+ maximum=200,
306
+ label="Velocidade (%)",
307
+ value=0,
308
+ interactive=True
309
+ )
310
+ with gr.Column():
311
+ pitch_input_file = gr.Slider(
312
+ minimum=-100,
313
+ maximum=100,
314
+ label="Tom (Hz)",
315
+ value=0,
316
+ interactive=True
317
+ )
318
+ with gr.Column():
319
+ volume_input_file = gr.Slider(
320
+ minimum=-99,
321
+ maximum=100,
322
+ label="Volume (%)",
323
+ value=0,
324
+ interactive=True
325
+ )
326
+
327
+ checkbox_cortar_silencio_file = gr.Checkbox(label="Cortar Silencio", interactive=True)
328
+ audio_output_file = gr.Audio(label="Resultado", type="filepath", interactive=False)
329
+
330
+ edgetts_button_file = gr.Button(value="Falar")
331
+ edgetts_button_file.click(
332
+ controlador_generate_audio_from_file,
333
+ inputs=[
334
+ file_input,
335
+ voice_model_input_file,
336
+ speed_input_file,
337
+ pitch_input_file,
338
+ volume_input_file,
339
+ checkbox_cortar_silencio_file
340
+ ],
341
+ outputs=[audio_output_file]
342
+ )
343
+
344
+ clear_button_file = gr.ClearButton(file_input, value='Limpar')
345
+
346
+ gr.Markdown("Agradecimentos a rany2 pelo Edge-TTS")
347
+
348
+ gr.Markdown("""
349
+ Desenvolvido por Rafael Godoy <br>
350
+ Apoie o projeto pelo https://nubank.com.br/pagar/1ls6a4/0QpSSbWBSq, qualquer valor é bem vindo.
351
+ """)
352
+ iface.launch()
get_voices.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess
2
+ import json
3
+ import re
4
+ from collections import defaultdict
5
+
6
+ # Dicionário para mapear códigos de idioma para nomes completos
7
+ language_mapping = {
8
+ "af": "Afrikaans",
9
+ "am": "Amharic",
10
+ "ar": "Arabic",
11
+ "az": "Azerbaijani",
12
+ "bg": "Bulgarian",
13
+ "bn": "Bengali",
14
+ "bs": "Bosnian",
15
+ "ca": "Catalan",
16
+ "cs": "Czech",
17
+ "cy": "Welsh",
18
+ "da": "Danish",
19
+ "de": "Deutsch",
20
+ "al": "Albanian",
21
+ "el": "Greek",
22
+ "in": "Indonesian",
23
+ "en": "English",
24
+ "es": "Spanish",
25
+ "et": "Estonian",
26
+ "fa": "Persian",
27
+ "fi": "Finnish",
28
+ "fil": "Filipino",
29
+ "fr": "French",
30
+ "ga": "Irish",
31
+ "gl": "Galician",
32
+ "gu": "Gujarati",
33
+ "he": "Hebrew",
34
+ "hi": "Hindi",
35
+ "hr": "Croatian",
36
+ "hu": "Hungarian",
37
+ "id": "Indonesian",
38
+ "is": "Icelandic",
39
+ "it": "Italian",
40
+ "ja": "Japanese",
41
+ "jv": "Javanese",
42
+ "ka": "Georgian",
43
+ "kk": "Kazakh",
44
+ "km": "Khmer",
45
+ "kn": "Kannada",
46
+ "ko": "Korean",
47
+ "lo": "Lao",
48
+ "lt": "Lithuanian",
49
+ "lv": "Latvian",
50
+ "mk": "Macedonian",
51
+ "ml": "Malayalam",
52
+ "mn": "Mongolian",
53
+ "mr": "Marathi",
54
+ "ms": "Malay",
55
+ "mt": "Maltese",
56
+ "my": "Burmese",
57
+ "nb": "Norwegian Bokmål",
58
+ "ne": "Nepali",
59
+ "nl": "Dutch",
60
+ "pl": "Polish",
61
+ "ps": "Pashto",
62
+ "pt": "Portuguese",
63
+ "ro": "Romanian",
64
+ "ru": "Russian",
65
+ "si": "Sinhala",
66
+ "sk": "Slovak",
67
+ "sl": "Slovenian",
68
+ "so": "Somali",
69
+ "sq": "Albanian",
70
+ "sr": "Serbian",
71
+ "su": "Sundanese",
72
+ "sv": "Swedish",
73
+ "sw": "Swahili",
74
+ "ta": "Tamil",
75
+ "te": "Telugu",
76
+ "th": "Thai",
77
+ "tr": "Turkish",
78
+ "uk": "Ukrainian",
79
+ "ur": "Urdu",
80
+ "uz": "Uzbek",
81
+ "vi": "Vietnamese",
82
+ "zh": "Chinese",
83
+ "zu": "Zulu"
84
+ }
85
+
86
+ def get_voices():
87
+ # Executa o comando edge-tts --list-voices
88
+ result = subprocess.run(['edge-tts', '--list-voices'], capture_output=True, text=True)
89
+
90
+ if result.returncode != 0:
91
+ print("Erro ao executar o comando edge-tts.")
92
+ return
93
+
94
+ # Processa a saída
95
+ voices = result.stdout.strip().split("\n\n")
96
+ voices_data = defaultdict(list)
97
+
98
+ for voice in voices:
99
+ # Usa regex para capturar o nome e o gênero
100
+ match = re.findall(r'Name:\s*(.*?)\s*Gender:\s*(\w+)', voice)
101
+ if match:
102
+ name, gender = match[0]
103
+ language_code = name.split('-')[0] # Pega o código do idioma
104
+ language_name = language_mapping.get(language_code, language_code) # Obtém o nome completo do idioma
105
+ voices_data[language_name].append({
106
+ 'name': name,
107
+ 'gender': gender
108
+ })
109
+
110
+ # Salva em um arquivo JSON
111
+ with open('voices.json', 'w', encoding='utf-8') as json_file:
112
+ json.dump(voices_data, json_file, ensure_ascii=False, indent=4)
113
+
114
+ if __name__ == "__main__":
115
+ get_voices()
header.py CHANGED
@@ -1,26 +1,26 @@
1
- badges = """
2
- <div style="display: flex">
3
- <span style="margin-right: 5px">
4
-
5
- [ ![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) ](https://github.com/rafaelGodoyEbert)
6
-
7
- </span>
8
- <span style="margin-right: 5px">
9
-
10
- [ ![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white) ](https://twitter.com/GodoyEbert)
11
-
12
- </span>
13
- <span>
14
-
15
- [ ![](https://dcbadge.vercel.app/api/server/aihubbrasil) ](https://discord.gg/aihubbrasil)
16
-
17
- </span>
18
- </div>
19
- """
20
-
21
- description = """
22
- # TTS Rápido
23
- TTS Rápido, para todos aqueles que sempre me pediam alguma forma de fazer algum TTS.<br>
24
- Tem em diversos idiomas, só aproveitar<br>
25
- 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>
26
  """
 
1
+ badges = """
2
+ <div style="display: flex">
3
+ <span style="margin-right: 5px">
4
+
5
+ [ ![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) ](https://github.com/rafaelGodoyEbert)
6
+
7
+ </span>
8
+ <span style="margin-right: 5px">
9
+
10
+ [ ![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white) ](https://twitter.com/GodoyEbert)
11
+
12
+ </span>
13
+ <span>
14
+
15
+ [ ![](https://dcbadge.vercel.app/api/server/aihubbrasil) ](https://discord.gg/aihubbrasil)
16
+
17
+ </span>
18
+ </div>
19
+ """
20
+
21
+ description = """
22
+ # QuickTTS
23
+ QuickTTS, para todos aqueles que sempre me pediam alguma forma de fazer algum TTS.<br>
24
+ Tem em diversos idiomas, só aproveitar<br>
25
+ 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>
26
  """
output/new_audio.mp3 ADDED
Binary file (12.2 kB). View file
 
output/new_audio.wav ADDED
Binary file (98 kB). View file
 
requirements.txt CHANGED
@@ -1,2 +1 @@
1
- edge-tts
2
- elevenlabs==0.2.15
 
1
+ edge-tts
 
voices.json ADDED
@@ -0,0 +1,1422 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Afrikaans": [
3
+ {
4
+ "name": "af-ZA-AdriNeural",
5
+ "gender": "Female"
6
+ },
7
+ {
8
+ "name": "af-ZA-WillemNeural",
9
+ "gender": "Male"
10
+ }
11
+ ],
12
+ "Amharic": [
13
+ {
14
+ "name": "am-ET-AmehaNeural",
15
+ "gender": "Male"
16
+ },
17
+ {
18
+ "name": "am-ET-MekdesNeural",
19
+ "gender": "Female"
20
+ }
21
+ ],
22
+ "Arabic": [
23
+ {
24
+ "name": "ar-AE-FatimaNeural",
25
+ "gender": "Female"
26
+ },
27
+ {
28
+ "name": "ar-AE-HamdanNeural",
29
+ "gender": "Male"
30
+ },
31
+ {
32
+ "name": "ar-BH-AliNeural",
33
+ "gender": "Male"
34
+ },
35
+ {
36
+ "name": "ar-BH-LailaNeural",
37
+ "gender": "Female"
38
+ },
39
+ {
40
+ "name": "ar-DZ-AminaNeural",
41
+ "gender": "Female"
42
+ },
43
+ {
44
+ "name": "ar-DZ-IsmaelNeural",
45
+ "gender": "Male"
46
+ },
47
+ {
48
+ "name": "ar-EG-SalmaNeural",
49
+ "gender": "Female"
50
+ },
51
+ {
52
+ "name": "ar-EG-ShakirNeural",
53
+ "gender": "Male"
54
+ },
55
+ {
56
+ "name": "ar-IQ-BasselNeural",
57
+ "gender": "Male"
58
+ },
59
+ {
60
+ "name": "ar-IQ-RanaNeural",
61
+ "gender": "Female"
62
+ },
63
+ {
64
+ "name": "ar-JO-SanaNeural",
65
+ "gender": "Female"
66
+ },
67
+ {
68
+ "name": "ar-JO-TaimNeural",
69
+ "gender": "Male"
70
+ },
71
+ {
72
+ "name": "ar-KW-FahedNeural",
73
+ "gender": "Male"
74
+ },
75
+ {
76
+ "name": "ar-KW-NouraNeural",
77
+ "gender": "Female"
78
+ },
79
+ {
80
+ "name": "ar-LB-LaylaNeural",
81
+ "gender": "Female"
82
+ },
83
+ {
84
+ "name": "ar-LB-RamiNeural",
85
+ "gender": "Male"
86
+ },
87
+ {
88
+ "name": "ar-LY-ImanNeural",
89
+ "gender": "Female"
90
+ },
91
+ {
92
+ "name": "ar-LY-OmarNeural",
93
+ "gender": "Male"
94
+ },
95
+ {
96
+ "name": "ar-MA-JamalNeural",
97
+ "gender": "Male"
98
+ },
99
+ {
100
+ "name": "ar-MA-MounaNeural",
101
+ "gender": "Female"
102
+ },
103
+ {
104
+ "name": "ar-OM-AbdullahNeural",
105
+ "gender": "Male"
106
+ },
107
+ {
108
+ "name": "ar-OM-AyshaNeural",
109
+ "gender": "Female"
110
+ },
111
+ {
112
+ "name": "ar-QA-AmalNeural",
113
+ "gender": "Female"
114
+ },
115
+ {
116
+ "name": "ar-QA-MoazNeural",
117
+ "gender": "Male"
118
+ },
119
+ {
120
+ "name": "ar-SA-HamedNeural",
121
+ "gender": "Male"
122
+ },
123
+ {
124
+ "name": "ar-SA-ZariyahNeural",
125
+ "gender": "Female"
126
+ },
127
+ {
128
+ "name": "ar-SY-AmanyNeural",
129
+ "gender": "Female"
130
+ },
131
+ {
132
+ "name": "ar-SY-LaithNeural",
133
+ "gender": "Male"
134
+ },
135
+ {
136
+ "name": "ar-TN-HediNeural",
137
+ "gender": "Male"
138
+ },
139
+ {
140
+ "name": "ar-TN-ReemNeural",
141
+ "gender": "Female"
142
+ },
143
+ {
144
+ "name": "ar-YE-MaryamNeural",
145
+ "gender": "Female"
146
+ },
147
+ {
148
+ "name": "ar-YE-SalehNeural",
149
+ "gender": "Male"
150
+ }
151
+ ],
152
+ "Azerbaijani": [
153
+ {
154
+ "name": "az-AZ-BabekNeural",
155
+ "gender": "Male"
156
+ },
157
+ {
158
+ "name": "az-AZ-BanuNeural",
159
+ "gender": "Female"
160
+ }
161
+ ],
162
+ "Bulgarian": [
163
+ {
164
+ "name": "bg-BG-BorislavNeural",
165
+ "gender": "Male"
166
+ },
167
+ {
168
+ "name": "bg-BG-KalinaNeural",
169
+ "gender": "Female"
170
+ }
171
+ ],
172
+ "Bengali": [
173
+ {
174
+ "name": "bn-BD-NabanitaNeural",
175
+ "gender": "Female"
176
+ },
177
+ {
178
+ "name": "bn-BD-PradeepNeural",
179
+ "gender": "Male"
180
+ },
181
+ {
182
+ "name": "bn-IN-BashkarNeural",
183
+ "gender": "Male"
184
+ },
185
+ {
186
+ "name": "bn-IN-TanishaaNeural",
187
+ "gender": "Female"
188
+ }
189
+ ],
190
+ "Bosnian": [
191
+ {
192
+ "name": "bs-BA-GoranNeural",
193
+ "gender": "Male"
194
+ },
195
+ {
196
+ "name": "bs-BA-VesnaNeural",
197
+ "gender": "Female"
198
+ }
199
+ ],
200
+ "Catalan": [
201
+ {
202
+ "name": "ca-ES-EnricNeural",
203
+ "gender": "Male"
204
+ },
205
+ {
206
+ "name": "ca-ES-JoanaNeural",
207
+ "gender": "Female"
208
+ }
209
+ ],
210
+ "Czech": [
211
+ {
212
+ "name": "cs-CZ-AntoninNeural",
213
+ "gender": "Male"
214
+ },
215
+ {
216
+ "name": "cs-CZ-VlastaNeural",
217
+ "gender": "Female"
218
+ }
219
+ ],
220
+ "Welsh": [
221
+ {
222
+ "name": "cy-GB-AledNeural",
223
+ "gender": "Male"
224
+ },
225
+ {
226
+ "name": "cy-GB-NiaNeural",
227
+ "gender": "Female"
228
+ }
229
+ ],
230
+ "Danish": [
231
+ {
232
+ "name": "da-DK-ChristelNeural",
233
+ "gender": "Female"
234
+ },
235
+ {
236
+ "name": "da-DK-JeppeNeural",
237
+ "gender": "Male"
238
+ }
239
+ ],
240
+ "Deutsch": [
241
+ {
242
+ "name": "de-AT-IngridNeural",
243
+ "gender": "Female"
244
+ },
245
+ {
246
+ "name": "de-AT-JonasNeural",
247
+ "gender": "Male"
248
+ },
249
+ {
250
+ "name": "de-CH-JanNeural",
251
+ "gender": "Male"
252
+ },
253
+ {
254
+ "name": "de-CH-LeniNeural",
255
+ "gender": "Female"
256
+ },
257
+ {
258
+ "name": "de-DE-AmalaNeural",
259
+ "gender": "Female"
260
+ },
261
+ {
262
+ "name": "de-DE-ConradNeural",
263
+ "gender": "Male"
264
+ },
265
+ {
266
+ "name": "de-DE-FlorianMultilingualNeural",
267
+ "gender": "Male"
268
+ },
269
+ {
270
+ "name": "de-DE-KatjaNeural",
271
+ "gender": "Female"
272
+ },
273
+ {
274
+ "name": "de-DE-KillianNeural",
275
+ "gender": "Male"
276
+ },
277
+ {
278
+ "name": "de-DE-SeraphinaMultilingualNeural",
279
+ "gender": "Female"
280
+ }
281
+ ],
282
+ "Greek": [
283
+ {
284
+ "name": "el-GR-AthinaNeural",
285
+ "gender": "Female"
286
+ },
287
+ {
288
+ "name": "el-GR-NestorasNeural",
289
+ "gender": "Male"
290
+ }
291
+ ],
292
+ "English": [
293
+ {
294
+ "name": "en-AU-NatashaNeural",
295
+ "gender": "Female"
296
+ },
297
+ {
298
+ "name": "en-AU-WilliamNeural",
299
+ "gender": "Male"
300
+ },
301
+ {
302
+ "name": "en-CA-ClaraNeural",
303
+ "gender": "Female"
304
+ },
305
+ {
306
+ "name": "en-CA-LiamNeural",
307
+ "gender": "Male"
308
+ },
309
+ {
310
+ "name": "en-GB-LibbyNeural",
311
+ "gender": "Female"
312
+ },
313
+ {
314
+ "name": "en-GB-MaisieNeural",
315
+ "gender": "Female"
316
+ },
317
+ {
318
+ "name": "en-GB-RyanNeural",
319
+ "gender": "Male"
320
+ },
321
+ {
322
+ "name": "en-GB-SoniaNeural",
323
+ "gender": "Female"
324
+ },
325
+ {
326
+ "name": "en-GB-ThomasNeural",
327
+ "gender": "Male"
328
+ },
329
+ {
330
+ "name": "en-HK-SamNeural",
331
+ "gender": "Male"
332
+ },
333
+ {
334
+ "name": "en-HK-YanNeural",
335
+ "gender": "Female"
336
+ },
337
+ {
338
+ "name": "en-IE-ConnorNeural",
339
+ "gender": "Male"
340
+ },
341
+ {
342
+ "name": "en-IE-EmilyNeural",
343
+ "gender": "Female"
344
+ },
345
+ {
346
+ "name": "en-IN-NeerjaExpressiveNeural",
347
+ "gender": "Female"
348
+ },
349
+ {
350
+ "name": "en-IN-NeerjaNeural",
351
+ "gender": "Female"
352
+ },
353
+ {
354
+ "name": "en-IN-PrabhatNeural",
355
+ "gender": "Male"
356
+ },
357
+ {
358
+ "name": "en-KE-AsiliaNeural",
359
+ "gender": "Female"
360
+ },
361
+ {
362
+ "name": "en-KE-ChilembaNeural",
363
+ "gender": "Male"
364
+ },
365
+ {
366
+ "name": "en-NG-AbeoNeural",
367
+ "gender": "Male"
368
+ },
369
+ {
370
+ "name": "en-NG-EzinneNeural",
371
+ "gender": "Female"
372
+ },
373
+ {
374
+ "name": "en-NZ-MitchellNeural",
375
+ "gender": "Male"
376
+ },
377
+ {
378
+ "name": "en-NZ-MollyNeural",
379
+ "gender": "Female"
380
+ },
381
+ {
382
+ "name": "en-PH-JamesNeural",
383
+ "gender": "Male"
384
+ },
385
+ {
386
+ "name": "en-PH-RosaNeural",
387
+ "gender": "Female"
388
+ },
389
+ {
390
+ "name": "en-SG-LunaNeural",
391
+ "gender": "Female"
392
+ },
393
+ {
394
+ "name": "en-SG-WayneNeural",
395
+ "gender": "Male"
396
+ },
397
+ {
398
+ "name": "en-TZ-ElimuNeural",
399
+ "gender": "Male"
400
+ },
401
+ {
402
+ "name": "en-TZ-ImaniNeural",
403
+ "gender": "Female"
404
+ },
405
+ {
406
+ "name": "en-US-AnaNeural",
407
+ "gender": "Female"
408
+ },
409
+ {
410
+ "name": "en-US-AndrewMultilingualNeural",
411
+ "gender": "Male"
412
+ },
413
+ {
414
+ "name": "en-US-AndrewNeural",
415
+ "gender": "Male"
416
+ },
417
+ {
418
+ "name": "en-US-AriaNeural",
419
+ "gender": "Female"
420
+ },
421
+ {
422
+ "name": "en-US-AvaMultilingualNeural",
423
+ "gender": "Female"
424
+ },
425
+ {
426
+ "name": "en-US-AvaNeural",
427
+ "gender": "Female"
428
+ },
429
+ {
430
+ "name": "en-US-BrianMultilingualNeural",
431
+ "gender": "Male"
432
+ },
433
+ {
434
+ "name": "en-US-BrianNeural",
435
+ "gender": "Male"
436
+ },
437
+ {
438
+ "name": "en-US-ChristopherNeural",
439
+ "gender": "Male"
440
+ },
441
+ {
442
+ "name": "en-US-EmmaMultilingualNeural",
443
+ "gender": "Female"
444
+ },
445
+ {
446
+ "name": "en-US-EmmaNeural",
447
+ "gender": "Female"
448
+ },
449
+ {
450
+ "name": "en-US-EricNeural",
451
+ "gender": "Male"
452
+ },
453
+ {
454
+ "name": "en-US-GuyNeural",
455
+ "gender": "Male"
456
+ },
457
+ {
458
+ "name": "en-US-JennyNeural",
459
+ "gender": "Female"
460
+ },
461
+ {
462
+ "name": "en-US-MichelleNeural",
463
+ "gender": "Female"
464
+ },
465
+ {
466
+ "name": "en-US-RogerNeural",
467
+ "gender": "Male"
468
+ },
469
+ {
470
+ "name": "en-US-SteffanNeural",
471
+ "gender": "Male"
472
+ },
473
+ {
474
+ "name": "en-ZA-LeahNeural",
475
+ "gender": "Female"
476
+ },
477
+ {
478
+ "name": "en-ZA-LukeNeural",
479
+ "gender": "Male"
480
+ }
481
+ ],
482
+ "Spanish": [
483
+ {
484
+ "name": "es-AR-ElenaNeural",
485
+ "gender": "Female"
486
+ },
487
+ {
488
+ "name": "es-AR-TomasNeural",
489
+ "gender": "Male"
490
+ },
491
+ {
492
+ "name": "es-BO-MarceloNeural",
493
+ "gender": "Male"
494
+ },
495
+ {
496
+ "name": "es-BO-SofiaNeural",
497
+ "gender": "Female"
498
+ },
499
+ {
500
+ "name": "es-CL-CatalinaNeural",
501
+ "gender": "Female"
502
+ },
503
+ {
504
+ "name": "es-CL-LorenzoNeural",
505
+ "gender": "Male"
506
+ },
507
+ {
508
+ "name": "es-CO-GonzaloNeural",
509
+ "gender": "Male"
510
+ },
511
+ {
512
+ "name": "es-CO-SalomeNeural",
513
+ "gender": "Female"
514
+ },
515
+ {
516
+ "name": "es-CR-JuanNeural",
517
+ "gender": "Male"
518
+ },
519
+ {
520
+ "name": "es-CR-MariaNeural",
521
+ "gender": "Female"
522
+ },
523
+ {
524
+ "name": "es-CU-BelkysNeural",
525
+ "gender": "Female"
526
+ },
527
+ {
528
+ "name": "es-CU-ManuelNeural",
529
+ "gender": "Male"
530
+ },
531
+ {
532
+ "name": "es-DO-EmilioNeural",
533
+ "gender": "Male"
534
+ },
535
+ {
536
+ "name": "es-DO-RamonaNeural",
537
+ "gender": "Female"
538
+ },
539
+ {
540
+ "name": "es-EC-AndreaNeural",
541
+ "gender": "Female"
542
+ },
543
+ {
544
+ "name": "es-EC-LuisNeural",
545
+ "gender": "Male"
546
+ },
547
+ {
548
+ "name": "es-ES-AlvaroNeural",
549
+ "gender": "Male"
550
+ },
551
+ {
552
+ "name": "es-ES-ElviraNeural",
553
+ "gender": "Female"
554
+ },
555
+ {
556
+ "name": "es-ES-XimenaNeural",
557
+ "gender": "Female"
558
+ },
559
+ {
560
+ "name": "es-GQ-JavierNeural",
561
+ "gender": "Male"
562
+ },
563
+ {
564
+ "name": "es-GQ-TeresaNeural",
565
+ "gender": "Female"
566
+ },
567
+ {
568
+ "name": "es-GT-AndresNeural",
569
+ "gender": "Male"
570
+ },
571
+ {
572
+ "name": "es-GT-MartaNeural",
573
+ "gender": "Female"
574
+ },
575
+ {
576
+ "name": "es-HN-CarlosNeural",
577
+ "gender": "Male"
578
+ },
579
+ {
580
+ "name": "es-HN-KarlaNeural",
581
+ "gender": "Female"
582
+ },
583
+ {
584
+ "name": "es-MX-DaliaNeural",
585
+ "gender": "Female"
586
+ },
587
+ {
588
+ "name": "es-MX-JorgeNeural",
589
+ "gender": "Male"
590
+ },
591
+ {
592
+ "name": "es-NI-FedericoNeural",
593
+ "gender": "Male"
594
+ },
595
+ {
596
+ "name": "es-NI-YolandaNeural",
597
+ "gender": "Female"
598
+ },
599
+ {
600
+ "name": "es-PA-MargaritaNeural",
601
+ "gender": "Female"
602
+ },
603
+ {
604
+ "name": "es-PA-RobertoNeural",
605
+ "gender": "Male"
606
+ },
607
+ {
608
+ "name": "es-PE-AlexNeural",
609
+ "gender": "Male"
610
+ },
611
+ {
612
+ "name": "es-PE-CamilaNeural",
613
+ "gender": "Female"
614
+ },
615
+ {
616
+ "name": "es-PR-KarinaNeural",
617
+ "gender": "Female"
618
+ },
619
+ {
620
+ "name": "es-PR-VictorNeural",
621
+ "gender": "Male"
622
+ },
623
+ {
624
+ "name": "es-PY-MarioNeural",
625
+ "gender": "Male"
626
+ },
627
+ {
628
+ "name": "es-PY-TaniaNeural",
629
+ "gender": "Female"
630
+ },
631
+ {
632
+ "name": "es-SV-LorenaNeural",
633
+ "gender": "Female"
634
+ },
635
+ {
636
+ "name": "es-SV-RodrigoNeural",
637
+ "gender": "Male"
638
+ },
639
+ {
640
+ "name": "es-US-AlonsoNeural",
641
+ "gender": "Male"
642
+ },
643
+ {
644
+ "name": "es-US-PalomaNeural",
645
+ "gender": "Female"
646
+ },
647
+ {
648
+ "name": "es-UY-MateoNeural",
649
+ "gender": "Male"
650
+ },
651
+ {
652
+ "name": "es-UY-ValentinaNeural",
653
+ "gender": "Female"
654
+ },
655
+ {
656
+ "name": "es-VE-PaolaNeural",
657
+ "gender": "Female"
658
+ },
659
+ {
660
+ "name": "es-VE-SebastianNeural",
661
+ "gender": "Male"
662
+ }
663
+ ],
664
+ "Estonian": [
665
+ {
666
+ "name": "et-EE-AnuNeural",
667
+ "gender": "Female"
668
+ },
669
+ {
670
+ "name": "et-EE-KertNeural",
671
+ "gender": "Male"
672
+ }
673
+ ],
674
+ "Persian": [
675
+ {
676
+ "name": "fa-IR-DilaraNeural",
677
+ "gender": "Female"
678
+ },
679
+ {
680
+ "name": "fa-IR-FaridNeural",
681
+ "gender": "Male"
682
+ }
683
+ ],
684
+ "Finnish": [
685
+ {
686
+ "name": "fi-FI-HarriNeural",
687
+ "gender": "Male"
688
+ },
689
+ {
690
+ "name": "fi-FI-NooraNeural",
691
+ "gender": "Female"
692
+ }
693
+ ],
694
+ "Filipino": [
695
+ {
696
+ "name": "fil-PH-AngeloNeural",
697
+ "gender": "Male"
698
+ },
699
+ {
700
+ "name": "fil-PH-BlessicaNeural",
701
+ "gender": "Female"
702
+ }
703
+ ],
704
+ "French": [
705
+ {
706
+ "name": "fr-BE-CharlineNeural",
707
+ "gender": "Female"
708
+ },
709
+ {
710
+ "name": "fr-BE-GerardNeural",
711
+ "gender": "Male"
712
+ },
713
+ {
714
+ "name": "fr-CA-AntoineNeural",
715
+ "gender": "Male"
716
+ },
717
+ {
718
+ "name": "fr-CA-JeanNeural",
719
+ "gender": "Male"
720
+ },
721
+ {
722
+ "name": "fr-CA-SylvieNeural",
723
+ "gender": "Female"
724
+ },
725
+ {
726
+ "name": "fr-CA-ThierryNeural",
727
+ "gender": "Male"
728
+ },
729
+ {
730
+ "name": "fr-CH-ArianeNeural",
731
+ "gender": "Female"
732
+ },
733
+ {
734
+ "name": "fr-CH-FabriceNeural",
735
+ "gender": "Male"
736
+ },
737
+ {
738
+ "name": "fr-FR-DeniseNeural",
739
+ "gender": "Female"
740
+ },
741
+ {
742
+ "name": "fr-FR-EloiseNeural",
743
+ "gender": "Female"
744
+ },
745
+ {
746
+ "name": "fr-FR-HenriNeural",
747
+ "gender": "Male"
748
+ },
749
+ {
750
+ "name": "fr-FR-RemyMultilingualNeural",
751
+ "gender": "Male"
752
+ },
753
+ {
754
+ "name": "fr-FR-VivienneMultilingualNeural",
755
+ "gender": "Female"
756
+ }
757
+ ],
758
+ "Irish": [
759
+ {
760
+ "name": "ga-IE-ColmNeural",
761
+ "gender": "Male"
762
+ },
763
+ {
764
+ "name": "ga-IE-OrlaNeural",
765
+ "gender": "Female"
766
+ }
767
+ ],
768
+ "Galician": [
769
+ {
770
+ "name": "gl-ES-RoiNeural",
771
+ "gender": "Male"
772
+ },
773
+ {
774
+ "name": "gl-ES-SabelaNeural",
775
+ "gender": "Female"
776
+ }
777
+ ],
778
+ "Gujarati": [
779
+ {
780
+ "name": "gu-IN-DhwaniNeural",
781
+ "gender": "Female"
782
+ },
783
+ {
784
+ "name": "gu-IN-NiranjanNeural",
785
+ "gender": "Male"
786
+ }
787
+ ],
788
+ "Hebrew": [
789
+ {
790
+ "name": "he-IL-AvriNeural",
791
+ "gender": "Male"
792
+ },
793
+ {
794
+ "name": "he-IL-HilaNeural",
795
+ "gender": "Female"
796
+ }
797
+ ],
798
+ "Hindi": [
799
+ {
800
+ "name": "hi-IN-MadhurNeural",
801
+ "gender": "Male"
802
+ },
803
+ {
804
+ "name": "hi-IN-SwaraNeural",
805
+ "gender": "Female"
806
+ }
807
+ ],
808
+ "Croatian": [
809
+ {
810
+ "name": "hr-HR-GabrijelaNeural",
811
+ "gender": "Female"
812
+ },
813
+ {
814
+ "name": "hr-HR-SreckoNeural",
815
+ "gender": "Male"
816
+ }
817
+ ],
818
+ "Hungarian": [
819
+ {
820
+ "name": "hu-HU-NoemiNeural",
821
+ "gender": "Female"
822
+ },
823
+ {
824
+ "name": "hu-HU-TamasNeural",
825
+ "gender": "Male"
826
+ }
827
+ ],
828
+ "Indonesian": [
829
+ {
830
+ "name": "id-ID-ArdiNeural",
831
+ "gender": "Male"
832
+ },
833
+ {
834
+ "name": "id-ID-GadisNeural",
835
+ "gender": "Female"
836
+ }
837
+ ],
838
+ "Icelandic": [
839
+ {
840
+ "name": "is-IS-GudrunNeural",
841
+ "gender": "Female"
842
+ },
843
+ {
844
+ "name": "is-IS-GunnarNeural",
845
+ "gender": "Male"
846
+ }
847
+ ],
848
+ "Italian": [
849
+ {
850
+ "name": "it-IT-DiegoNeural",
851
+ "gender": "Male"
852
+ },
853
+ {
854
+ "name": "it-IT-ElsaNeural",
855
+ "gender": "Female"
856
+ },
857
+ {
858
+ "name": "it-IT-GiuseppeNeural",
859
+ "gender": "Male"
860
+ },
861
+ {
862
+ "name": "it-IT-IsabellaNeural",
863
+ "gender": "Female"
864
+ }
865
+ ],
866
+ "Japanese": [
867
+ {
868
+ "name": "ja-JP-KeitaNeural",
869
+ "gender": "Male"
870
+ },
871
+ {
872
+ "name": "ja-JP-NanamiNeural",
873
+ "gender": "Female"
874
+ }
875
+ ],
876
+ "Javanese": [
877
+ {
878
+ "name": "jv-ID-DimasNeural",
879
+ "gender": "Male"
880
+ },
881
+ {
882
+ "name": "jv-ID-SitiNeural",
883
+ "gender": "Female"
884
+ }
885
+ ],
886
+ "Georgian": [
887
+ {
888
+ "name": "ka-GE-EkaNeural",
889
+ "gender": "Female"
890
+ },
891
+ {
892
+ "name": "ka-GE-GiorgiNeural",
893
+ "gender": "Male"
894
+ }
895
+ ],
896
+ "Kazakh": [
897
+ {
898
+ "name": "kk-KZ-AigulNeural",
899
+ "gender": "Female"
900
+ },
901
+ {
902
+ "name": "kk-KZ-DauletNeural",
903
+ "gender": "Male"
904
+ }
905
+ ],
906
+ "Khmer": [
907
+ {
908
+ "name": "km-KH-PisethNeural",
909
+ "gender": "Male"
910
+ },
911
+ {
912
+ "name": "km-KH-SreymomNeural",
913
+ "gender": "Female"
914
+ }
915
+ ],
916
+ "Kannada": [
917
+ {
918
+ "name": "kn-IN-GaganNeural",
919
+ "gender": "Male"
920
+ },
921
+ {
922
+ "name": "kn-IN-SapnaNeural",
923
+ "gender": "Female"
924
+ }
925
+ ],
926
+ "Korean": [
927
+ {
928
+ "name": "ko-KR-HyunsuNeural",
929
+ "gender": "Male"
930
+ },
931
+ {
932
+ "name": "ko-KR-InJoonNeural",
933
+ "gender": "Male"
934
+ },
935
+ {
936
+ "name": "ko-KR-SunHiNeural",
937
+ "gender": "Female"
938
+ }
939
+ ],
940
+ "Lao": [
941
+ {
942
+ "name": "lo-LA-ChanthavongNeural",
943
+ "gender": "Male"
944
+ },
945
+ {
946
+ "name": "lo-LA-KeomanyNeural",
947
+ "gender": "Female"
948
+ }
949
+ ],
950
+ "Lithuanian": [
951
+ {
952
+ "name": "lt-LT-LeonasNeural",
953
+ "gender": "Male"
954
+ },
955
+ {
956
+ "name": "lt-LT-OnaNeural",
957
+ "gender": "Female"
958
+ }
959
+ ],
960
+ "Latvian": [
961
+ {
962
+ "name": "lv-LV-EveritaNeural",
963
+ "gender": "Female"
964
+ },
965
+ {
966
+ "name": "lv-LV-NilsNeural",
967
+ "gender": "Male"
968
+ }
969
+ ],
970
+ "Macedonian": [
971
+ {
972
+ "name": "mk-MK-AleksandarNeural",
973
+ "gender": "Male"
974
+ },
975
+ {
976
+ "name": "mk-MK-MarijaNeural",
977
+ "gender": "Female"
978
+ }
979
+ ],
980
+ "Malayalam": [
981
+ {
982
+ "name": "ml-IN-MidhunNeural",
983
+ "gender": "Male"
984
+ },
985
+ {
986
+ "name": "ml-IN-SobhanaNeural",
987
+ "gender": "Female"
988
+ }
989
+ ],
990
+ "Mongolian": [
991
+ {
992
+ "name": "mn-MN-BataaNeural",
993
+ "gender": "Male"
994
+ },
995
+ {
996
+ "name": "mn-MN-YesuiNeural",
997
+ "gender": "Female"
998
+ }
999
+ ],
1000
+ "Marathi": [
1001
+ {
1002
+ "name": "mr-IN-AarohiNeural",
1003
+ "gender": "Female"
1004
+ },
1005
+ {
1006
+ "name": "mr-IN-ManoharNeural",
1007
+ "gender": "Male"
1008
+ }
1009
+ ],
1010
+ "Malay": [
1011
+ {
1012
+ "name": "ms-MY-OsmanNeural",
1013
+ "gender": "Male"
1014
+ },
1015
+ {
1016
+ "name": "ms-MY-YasminNeural",
1017
+ "gender": "Female"
1018
+ }
1019
+ ],
1020
+ "Maltese": [
1021
+ {
1022
+ "name": "mt-MT-GraceNeural",
1023
+ "gender": "Female"
1024
+ },
1025
+ {
1026
+ "name": "mt-MT-JosephNeural",
1027
+ "gender": "Male"
1028
+ }
1029
+ ],
1030
+ "Burmese": [
1031
+ {
1032
+ "name": "my-MM-NilarNeural",
1033
+ "gender": "Female"
1034
+ },
1035
+ {
1036
+ "name": "my-MM-ThihaNeural",
1037
+ "gender": "Male"
1038
+ }
1039
+ ],
1040
+ "Norwegian Bokmål": [
1041
+ {
1042
+ "name": "nb-NO-FinnNeural",
1043
+ "gender": "Male"
1044
+ },
1045
+ {
1046
+ "name": "nb-NO-PernilleNeural",
1047
+ "gender": "Female"
1048
+ }
1049
+ ],
1050
+ "Nepali": [
1051
+ {
1052
+ "name": "ne-NP-HemkalaNeural",
1053
+ "gender": "Female"
1054
+ },
1055
+ {
1056
+ "name": "ne-NP-SagarNeural",
1057
+ "gender": "Male"
1058
+ }
1059
+ ],
1060
+ "Dutch": [
1061
+ {
1062
+ "name": "nl-BE-ArnaudNeural",
1063
+ "gender": "Male"
1064
+ },
1065
+ {
1066
+ "name": "nl-BE-DenaNeural",
1067
+ "gender": "Female"
1068
+ },
1069
+ {
1070
+ "name": "nl-NL-ColetteNeural",
1071
+ "gender": "Female"
1072
+ },
1073
+ {
1074
+ "name": "nl-NL-FennaNeural",
1075
+ "gender": "Female"
1076
+ },
1077
+ {
1078
+ "name": "nl-NL-MaartenNeural",
1079
+ "gender": "Male"
1080
+ }
1081
+ ],
1082
+ "Polish": [
1083
+ {
1084
+ "name": "pl-PL-MarekNeural",
1085
+ "gender": "Male"
1086
+ },
1087
+ {
1088
+ "name": "pl-PL-ZofiaNeural",
1089
+ "gender": "Female"
1090
+ }
1091
+ ],
1092
+ "Pashto": [
1093
+ {
1094
+ "name": "ps-AF-GulNawazNeural",
1095
+ "gender": "Male"
1096
+ },
1097
+ {
1098
+ "name": "ps-AF-LatifaNeural",
1099
+ "gender": "Female"
1100
+ }
1101
+ ],
1102
+ "Portuguese": [
1103
+ {
1104
+ "name": "pt-BR-AntonioNeural",
1105
+ "gender": "Male"
1106
+ },
1107
+ {
1108
+ "name": "pt-BR-FranciscaNeural",
1109
+ "gender": "Female"
1110
+ },
1111
+ {
1112
+ "name": "pt-BR-ThalitaNeural",
1113
+ "gender": "Female"
1114
+ },
1115
+ {
1116
+ "name": "pt-PT-DuarteNeural",
1117
+ "gender": "Male"
1118
+ },
1119
+ {
1120
+ "name": "pt-PT-RaquelNeural",
1121
+ "gender": "Female"
1122
+ }
1123
+ ],
1124
+ "Romanian": [
1125
+ {
1126
+ "name": "ro-RO-AlinaNeural",
1127
+ "gender": "Female"
1128
+ },
1129
+ {
1130
+ "name": "ro-RO-EmilNeural",
1131
+ "gender": "Male"
1132
+ }
1133
+ ],
1134
+ "Russian": [
1135
+ {
1136
+ "name": "ru-RU-DmitryNeural",
1137
+ "gender": "Male"
1138
+ },
1139
+ {
1140
+ "name": "ru-RU-SvetlanaNeural",
1141
+ "gender": "Female"
1142
+ }
1143
+ ],
1144
+ "Sinhala": [
1145
+ {
1146
+ "name": "si-LK-SameeraNeural",
1147
+ "gender": "Male"
1148
+ },
1149
+ {
1150
+ "name": "si-LK-ThiliniNeural",
1151
+ "gender": "Female"
1152
+ }
1153
+ ],
1154
+ "Slovak": [
1155
+ {
1156
+ "name": "sk-SK-LukasNeural",
1157
+ "gender": "Male"
1158
+ },
1159
+ {
1160
+ "name": "sk-SK-ViktoriaNeural",
1161
+ "gender": "Female"
1162
+ }
1163
+ ],
1164
+ "Slovenian": [
1165
+ {
1166
+ "name": "sl-SI-PetraNeural",
1167
+ "gender": "Female"
1168
+ },
1169
+ {
1170
+ "name": "sl-SI-RokNeural",
1171
+ "gender": "Male"
1172
+ }
1173
+ ],
1174
+ "Somali": [
1175
+ {
1176
+ "name": "so-SO-MuuseNeural",
1177
+ "gender": "Male"
1178
+ },
1179
+ {
1180
+ "name": "so-SO-UbaxNeural",
1181
+ "gender": "Female"
1182
+ }
1183
+ ],
1184
+ "Albanian": [
1185
+ {
1186
+ "name": "sq-AL-AnilaNeural",
1187
+ "gender": "Female"
1188
+ },
1189
+ {
1190
+ "name": "sq-AL-IlirNeural",
1191
+ "gender": "Male"
1192
+ }
1193
+ ],
1194
+ "Serbian": [
1195
+ {
1196
+ "name": "sr-RS-NicholasNeural",
1197
+ "gender": "Male"
1198
+ },
1199
+ {
1200
+ "name": "sr-RS-SophieNeural",
1201
+ "gender": "Female"
1202
+ }
1203
+ ],
1204
+ "Sundanese": [
1205
+ {
1206
+ "name": "su-ID-JajangNeural",
1207
+ "gender": "Male"
1208
+ },
1209
+ {
1210
+ "name": "su-ID-TutiNeural",
1211
+ "gender": "Female"
1212
+ }
1213
+ ],
1214
+ "Swedish": [
1215
+ {
1216
+ "name": "sv-SE-MattiasNeural",
1217
+ "gender": "Male"
1218
+ },
1219
+ {
1220
+ "name": "sv-SE-SofieNeural",
1221
+ "gender": "Female"
1222
+ }
1223
+ ],
1224
+ "Swahili": [
1225
+ {
1226
+ "name": "sw-KE-RafikiNeural",
1227
+ "gender": "Male"
1228
+ },
1229
+ {
1230
+ "name": "sw-KE-ZuriNeural",
1231
+ "gender": "Female"
1232
+ },
1233
+ {
1234
+ "name": "sw-TZ-DaudiNeural",
1235
+ "gender": "Male"
1236
+ },
1237
+ {
1238
+ "name": "sw-TZ-RehemaNeural",
1239
+ "gender": "Female"
1240
+ }
1241
+ ],
1242
+ "Tamil": [
1243
+ {
1244
+ "name": "ta-IN-PallaviNeural",
1245
+ "gender": "Female"
1246
+ },
1247
+ {
1248
+ "name": "ta-IN-ValluvarNeural",
1249
+ "gender": "Male"
1250
+ },
1251
+ {
1252
+ "name": "ta-LK-KumarNeural",
1253
+ "gender": "Male"
1254
+ },
1255
+ {
1256
+ "name": "ta-LK-SaranyaNeural",
1257
+ "gender": "Female"
1258
+ },
1259
+ {
1260
+ "name": "ta-MY-KaniNeural",
1261
+ "gender": "Female"
1262
+ },
1263
+ {
1264
+ "name": "ta-MY-SuryaNeural",
1265
+ "gender": "Male"
1266
+ },
1267
+ {
1268
+ "name": "ta-SG-AnbuNeural",
1269
+ "gender": "Male"
1270
+ },
1271
+ {
1272
+ "name": "ta-SG-VenbaNeural",
1273
+ "gender": "Female"
1274
+ }
1275
+ ],
1276
+ "Telugu": [
1277
+ {
1278
+ "name": "te-IN-MohanNeural",
1279
+ "gender": "Male"
1280
+ },
1281
+ {
1282
+ "name": "te-IN-ShrutiNeural",
1283
+ "gender": "Female"
1284
+ }
1285
+ ],
1286
+ "Thai": [
1287
+ {
1288
+ "name": "th-TH-NiwatNeural",
1289
+ "gender": "Male"
1290
+ },
1291
+ {
1292
+ "name": "th-TH-PremwadeeNeural",
1293
+ "gender": "Female"
1294
+ }
1295
+ ],
1296
+ "Turkish": [
1297
+ {
1298
+ "name": "tr-TR-AhmetNeural",
1299
+ "gender": "Male"
1300
+ },
1301
+ {
1302
+ "name": "tr-TR-EmelNeural",
1303
+ "gender": "Female"
1304
+ }
1305
+ ],
1306
+ "Ukrainian": [
1307
+ {
1308
+ "name": "uk-UA-OstapNeural",
1309
+ "gender": "Male"
1310
+ },
1311
+ {
1312
+ "name": "uk-UA-PolinaNeural",
1313
+ "gender": "Female"
1314
+ }
1315
+ ],
1316
+ "Urdu": [
1317
+ {
1318
+ "name": "ur-IN-GulNeural",
1319
+ "gender": "Female"
1320
+ },
1321
+ {
1322
+ "name": "ur-IN-SalmanNeural",
1323
+ "gender": "Male"
1324
+ },
1325
+ {
1326
+ "name": "ur-PK-AsadNeural",
1327
+ "gender": "Male"
1328
+ },
1329
+ {
1330
+ "name": "ur-PK-UzmaNeural",
1331
+ "gender": "Female"
1332
+ }
1333
+ ],
1334
+ "Uzbek": [
1335
+ {
1336
+ "name": "uz-UZ-MadinaNeural",
1337
+ "gender": "Female"
1338
+ },
1339
+ {
1340
+ "name": "uz-UZ-SardorNeural",
1341
+ "gender": "Male"
1342
+ }
1343
+ ],
1344
+ "Vietnamese": [
1345
+ {
1346
+ "name": "vi-VN-HoaiMyNeural",
1347
+ "gender": "Female"
1348
+ },
1349
+ {
1350
+ "name": "vi-VN-NamMinhNeural",
1351
+ "gender": "Male"
1352
+ }
1353
+ ],
1354
+ "Chinese": [
1355
+ {
1356
+ "name": "zh-CN-XiaoxiaoNeural",
1357
+ "gender": "Female"
1358
+ },
1359
+ {
1360
+ "name": "zh-CN-XiaoyiNeural",
1361
+ "gender": "Female"
1362
+ },
1363
+ {
1364
+ "name": "zh-CN-YunjianNeural",
1365
+ "gender": "Male"
1366
+ },
1367
+ {
1368
+ "name": "zh-CN-YunxiNeural",
1369
+ "gender": "Male"
1370
+ },
1371
+ {
1372
+ "name": "zh-CN-YunxiaNeural",
1373
+ "gender": "Male"
1374
+ },
1375
+ {
1376
+ "name": "zh-CN-YunyangNeural",
1377
+ "gender": "Male"
1378
+ },
1379
+ {
1380
+ "name": "zh-CN-liaoning-XiaobeiNeural",
1381
+ "gender": "Female"
1382
+ },
1383
+ {
1384
+ "name": "zh-CN-shaanxi-XiaoniNeural",
1385
+ "gender": "Female"
1386
+ },
1387
+ {
1388
+ "name": "zh-HK-HiuGaaiNeural",
1389
+ "gender": "Female"
1390
+ },
1391
+ {
1392
+ "name": "zh-HK-HiuMaanNeural",
1393
+ "gender": "Female"
1394
+ },
1395
+ {
1396
+ "name": "zh-HK-WanLungNeural",
1397
+ "gender": "Male"
1398
+ },
1399
+ {
1400
+ "name": "zh-TW-HsiaoChenNeural",
1401
+ "gender": "Female"
1402
+ },
1403
+ {
1404
+ "name": "zh-TW-HsiaoYuNeural",
1405
+ "gender": "Female"
1406
+ },
1407
+ {
1408
+ "name": "zh-TW-YunJheNeural",
1409
+ "gender": "Male"
1410
+ }
1411
+ ],
1412
+ "Zulu": [
1413
+ {
1414
+ "name": "zu-ZA-ThandoNeural",
1415
+ "gender": "Female"
1416
+ },
1417
+ {
1418
+ "name": "zu-ZA-ThembaNeural",
1419
+ "gender": "Male"
1420
+ }
1421
+ ]
1422
+ }