RafaG commited on
Commit
a9f77d3
·
verified ·
1 Parent(s): 52cb8ec

Upload get_voices.py

Browse files
Files changed (1) hide show
  1. get_voices.py +49 -25
get_voices.py CHANGED
@@ -1,7 +1,8 @@
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 = {
@@ -83,33 +84,56 @@ language_mapping = {
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()
 
1
  import subprocess
2
+ import asyncio
3
  import json
 
4
  from collections import defaultdict
5
+ from edge_tts import VoicesManager
6
 
7
  # Dicionário para mapear códigos de idioma para nomes completos
8
  language_mapping = {
 
84
  "zu": "Zulu"
85
  }
86
 
87
+ async def generate_voices_json():
88
+ """
89
+ Usa a biblioteca edge-tts para obter a lista de vozes diretamente,
90
+ agrupa por nome de idioma mapeado e salva em voices.json.
91
+ """
92
+ print("Gerando lista de vozes a partir da API... Isso pode levar um momento.")
93
+
94
+ try:
95
+ voices_manager = await VoicesManager.create()
96
+ voices_by_lang_name = defaultdict(list)
97
+
98
+ for voice in voices_manager.voices:
99
+ # Pega o código de localidade, ex: "pt-BR"
100
+ locale_code = voice["Locale"]
101
+ # Pega apenas a primeira parte (o código do idioma), ex: "pt"
102
+ lang_code = locale_code.split('-')[0]
103
+
104
+ # Usa o seu mapeamento para obter o nome completo, ex: "Portuguese"
105
+ # Se o código não estiver no mapa, usa o próprio código como fallback
106
+ language_name = language_mapping.get(lang_code, lang_code)
107
+
108
+ voice_info = {
109
+ "name": voice["ShortName"],
110
+ "gender": voice["Gender"]
111
+ }
112
+
113
+ voices_by_lang_name[language_name].append(voice_info)
114
 
115
+ # Ordena o dicionário final pelo nome do idioma para consistência
116
+ sorted_voices = dict(sorted(voices_by_lang_name.items()))
 
117
 
118
+ with open("voices.json", "w", encoding="utf-8") as f:
119
+ json.dump(sorted_voices, f, ensure_ascii=False, indent=4)
120
+
121
+ print(f"Lista de vozes salva com sucesso em 'voices.json'.")
122
+ print(f"Total de {len(voices_manager.voices)} vozes em {len(sorted_voices)} idiomas.")
123
 
124
+ except Exception as e:
125
+ print(f"Ocorreu um erro ao tentar gerar o arquivo de vozes: {e}")
126
+ print("Verifique sua conexão com a internet e se a biblioteca 'edge-tts' está instalada corretamente.")
 
 
 
 
 
 
 
 
127
 
128
+ # A função 'get_voices' agora é um simples wrapper para a função assíncrona
129
+ def get_voices():
130
+ """Wrapper síncrono para executar a geração do JSON de vozes."""
131
+ try:
132
+ asyncio.run(generate_voices_json())
133
+ except RuntimeError:
134
+ # Lida com o caso de já haver um loop de eventos rodando (comum em notebooks)
135
+ loop = asyncio.get_event_loop()
136
+ loop.run_until_complete(generate_voices_json())
137
 
138
  if __name__ == "__main__":
139
+ get_voices()