Spaces:
Running
Running
Upload get_voices.py
Browse files- 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
|
| 87 |
-
|
| 88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
return
|
| 93 |
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
|
|
|
|
|
|
| 97 |
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 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 |
-
|
| 111 |
-
|
| 112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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()
|