File size: 4,018 Bytes
b59e10d
 
 
 
 
69aeb7e
b59e10d
 
69aeb7e
 
0e9d1bc
 
 
 
a295d2a
 
 
 
 
 
 
 
 
b59e10d
69aeb7e
b59e10d
69aeb7e
 
b59e10d
 
69aeb7e
 
0e9d1bc
69aeb7e
b59e10d
 
 
 
 
69aeb7e
0e9d1bc
b59e10d
 
 
 
 
 
 
 
 
 
 
 
0e9d1bc
 
69aeb7e
0e9d1bc
69aeb7e
 
5b49376
 
 
 
69aeb7e
0e9d1bc
 
 
9c6803e
0e9d1bc
9c6803e
bd8bee9
 
 
 
0e9d1bc
bd8bee9
 
 
 
 
 
9c6803e
bd8bee9
0e9d1bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd8bee9
 
 
0e9d1bc
bd8bee9
 
0e9d1bc
 
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
99
100
101
102
103
104
105
106
107
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 com a voz desejada (masculina ou feminina)!
"""

# 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. 
"""

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

# 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)
        audio_path = fp.name  # Caminho do arquivo gerado

    return audio_path, audio_path  # Retorna o caminho como áudio e arquivo


# Criar a interface Gradio
with gr.Blocks(title=my_title, css=".gradio-container {max-width: 900px; margin: auto;}") as demo:
    gr.Markdown(f"<h1 style='text-align: center;'>{my_title}</h1>")
    gr.Markdown(my_description)
    
    with gr.Row():
        with gr.Column(scale=1):
            text_input = gr.Textbox(
                lines=10, 
                label="Texto em Português", 
                placeholder="Insira o texto aqui... (máximo de 500 tokens)"
            )
            voice_selector = gr.Radio(
                label="Voz", 
                choices=TTS_VOICES, 
                value="Ed"
            )
            submit_button = gr.Button("Gerar Áudio", variant="primary")
        with gr.Column(scale=1):
            audio_output = gr.Audio(type="filepath", label="Áudio Gerado")
            download_button = gr.File(label="Baixar Áudio")
    
    gr.Markdown("<hr>")
    gr.Markdown("""
        <h3>Guia do Usuário:</h3>
        <ul>
            <li>Insira o texto em português no campo de entrada (até 500 tokens).</li>
            <li>Selecione a voz desejada (masculina ou feminina).</li>
            <li>Clique em "Gerar Áudio" para gerar o arquivo de áudio.</li>
            <li>Reproduza ou faça o download do áudio gerado.</li>
        </ul>
    """)

    # Ação do botão
    submit_button.click(
        fn=tts, 
        inputs=[text_input, voice_selector], 
        outputs=[audio_output, download_button]
    )

# Iniciar a interface
demo.launch()