File size: 4,207 Bytes
b59e10d
 
 
 
 
69aeb7e
b59e10d
 
69aeb7e
 
 
a295d2a
 
 
 
 
 
 
 
 
 
 
 
b59e10d
69aeb7e
b59e10d
69aeb7e
 
b59e10d
 
69aeb7e
b59e10d
a295d2a
 
b59e10d
 
69aeb7e
 
 
a295d2a
69aeb7e
 
 
 
b59e10d
69aeb7e
 
 
 
b59e10d
 
 
 
 
69aeb7e
 
b59e10d
 
 
 
 
 
 
 
 
 
 
 
69aeb7e
 
 
 
 
 
 
 
9c6803e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69aeb7e
 
9c6803e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import gradio as gr
import tempfile
from TTS.utils.synthesizer import Synthesizer
from huggingface_hub import hf_hub_download

# Repositório do modelo no Hugging Face Hub
REPO_ID = "mbarnig/lb-de-fr-en-pt-coqui-vits-tts"

# Configurações da interface
my_title = "🇵🇹 Sintetizador de Fala em Português com Coqui TTS"
my_description = "Um sintetizador de fala em português baseado no modelo YourTTS da Coqui.ai. Insira o texto e gere o áudio!"

# Texto de exemplo com o máximo de tokens (500 tokens)
max_tokens_text = """
O vento norte e o Sol discutiam quem era o mais forte, quando surgiu um viajante envolvido numa capa. 
O vento começou a soprar com toda a força, mas quanto mais soprava, mais o viajante se enrolava em sua capa. 
Então, o Sol começou a brilhar suavemente, e o viajante, sentindo o calor, logo tirou a capa. 
Assim, o Sol provou que o calor e a gentileza são mais eficazes do que a força bruta. 
Esta história nos ensina que, muitas vezes, a delicadeza e a paciência são mais poderosas do que a agressividade. 
Em nossa vida diária, podemos aplicar essa lição ao lidar com os outros, buscando sempre a compreensão e o diálogo. 
A natureza nos oferece muitos exemplos de como a suavidade pode superar a força, e essa é uma lição valiosa para todos nós. 
Que possamos sempre lembrar dessa história e agir com sabedoria em nossas interações com os outros.
"""

# Vozes disponíveis para português
TTS_VOICES = [
    "Ed",  # Voz masculina
    "Linda"  # Voz feminina
]

# Exemplo de uso
my_examples = [
    [max_tokens_text, "Ed"],  # Texto com máximo de tokens e voz masculina
    [max_tokens_text, "Linda"]  # Texto com máximo de tokens e voz feminina
]

# Artigo com informações adicionais
my_article = """
<h3>Guia do Usuário</h3>
<p>1. Insira o texto em português no campo de entrada (até 500 tokens).</p>
<p>2. Selecione a voz desejada (masculina ou feminina).</p>
<p>3. Clique em "Submit" para gerar o áudio.</p>
<p>4. Reproduza o áudio gerado ou faça o download.</p>
"""

# Função para sintetizar a fala
def tts(text: str, speaker_idx: str):
    # Baixar os arquivos do modelo
    best_model_path = hf_hub_download(repo_id=REPO_ID, filename="best_model.pth")
    config_path = hf_hub_download(repo_id=REPO_ID, filename="config.json")
    speakers_path = hf_hub_download(repo_id=REPO_ID, filename="speakers.pth")
    languages_path = hf_hub_download(repo_id=REPO_ID, filename="language_ids.json")
    speaker_encoder_model_path = hf_hub_download(repo_id=REPO_ID, filename="model_se.pth")
    speaker_encoder_config_path = hf_hub_download(repo_id=REPO_ID, filename="config_se.json")

    # Inicializar o sintetizador
    synthesizer = Synthesizer(
        best_model_path,
        config_path,
        speakers_path,
        languages_path,
        None,
        None,
        speaker_encoder_model_path,
        speaker_encoder_config_path,
        False
    )

    # Gerar o áudio
    wavs = synthesizer.tts(text, speaker_idx, "Português")  # Idioma fixo: Português

    # Salvar o áudio em um arquivo temporário
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp:
        synthesizer.save_wav(wavs, fp)
    return fp.name

# Criar a interface Gradio com layout moderno
with gr.Blocks(title=my_title, css=".gradio-container {max-width: 800px; margin: auto;}") as demo:
    gr.Markdown(f"# {my_title}")
    gr.Markdown(my_description)
    
    with gr.Row():
        with gr.Column():
            text_input = gr.Textbox(lines=10, label="Texto em Português", placeholder="Insira o texto aqui... (até 500 tokens)")
            voice_selector = gr.Radio(label="Voz", choices=TTS_VOICES, value="Ed")
            submit_button = gr.Button("Gerar Áudio", variant="primary")
        with gr.Column():
            audio_output = gr.Audio(type="filepath", label="Áudio Gerado")
            gr.Markdown(my_article)
    
    # Exemplos
    gr.Examples(examples=my_examples, inputs=[text_input, voice_selector], outputs=audio_output, fn=tts, cache_examples=True)
    
    # Ação do botão
    submit_button.click(fn=tts, inputs=[text_input, voice_selector], outputs=audio_output)

# Iniciar a interface
demo.launch()