File size: 7,786 Bytes
c4fd9bd
 
 
 
 
 
 
 
 
 
 
 
 
 
07a4c5d
 
 
 
 
dbf3c82
07a4c5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dbf3c82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
07a4c5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dbf3c82
 
 
07a4c5d
dbf3c82
 
 
07a4c5d
 
 
 
 
 
 
f4754c2
dbf3c82
07a4c5d
 
 
 
 
 
 
 
 
 
e12566c
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import subprocess

# Comando para instalar ou atualizar o pacote elevenlabs
comando_elevenlabs = ["pip", "install", "elevenlabs", "-U", "--quiet"]

# Comando para instalar ou atualizar o pacote edge-tts
comando_edge_tts = ["pip", "install", "edge-tts", "-U", "--quiet"]

# Executando o comando para instalar ou atualizar o pacote elevenlabs
subprocess.run(comando_elevenlabs)

# Executando o comando para instalar ou atualizar o pacote edge-tts
subprocess.run(comando_edge_tts)

import subprocess
import os
import gradio as gr
from pydub import AudioSegment
from voice_map import SUPPORTED_VOICES
from pydub.silence import split_on_silence

def generate_audio(texto, modelo_de_voz, velocidade):
    if velocidade >= 0:
        rate_str = f"+{velocidade}%"
    else:
        rate_str = f"{velocidade}%"
    
    output_dir = "output"
    os.makedirs(output_dir, exist_ok=True)  # Certifique-se de que o diretório de saída exista

    mp3_output_file = os.path.join(output_dir, "new_audio.mp3")

    cmd = ["edge-tts", "--rate=" + rate_str, "-v", modelo_de_voz, "-t", texto, "--write-media", mp3_output_file]

    print("Gerando áudio...")
    try:
        subprocess.run(cmd, check=True)
    except subprocess.CalledProcessError as e:
        print("Erro ao gerar áudio:", e)
        return None

    print("Áudio gerado com sucesso!")

    # Convertendo o arquivo de MP3 para WAV
    wav_output_file = os.path.join(output_dir, "new_audio.wav")
    audio = AudioSegment.from_mp3(mp3_output_file)
    audio.export(wav_output_file, format="wav")

    return wav_output_file  # Retorna o caminho completo do arquivo de áudio WAV

def remove_silence(input_file, output_file):
    audio = AudioSegment.from_wav(input_file)
    
    # Encontra os segmentos de áudio que não são silêncio
    segments = split_on_silence(audio, min_silence_len=500, silence_thresh=-40)
    
    # Concatena os segmentos de áudio não silenciosos
    non_silent_audio = AudioSegment.silent(duration=0)
    for segment in segments:
        non_silent_audio += segment
    
    # Salva o áudio sem as partes de silêncio
    non_silent_audio.export(output_file, format="wav")

def controlador_generate_audio(audio_input, voice_model_input, speed_input, checkbox_cortar_silencio):
    # Gerar áudio
    audio_file = generate_audio(audio_input, voice_model_input, speed_input)
    if audio_file:
        print("Áudio gerado com sucesso:", audio_file)
        # Verificar se o checkbox de cortar silêncio está marcado
        if checkbox_cortar_silencio:
            print("Cortando silêncio...")
            # Remover silêncio do áudio
            remove_silence(audio_file, audio_file)
            print("Silêncio removido com sucesso!")
    else:
        print("Erro ao gerar áudio.")
    return audio_file  # Retornar o caminho do arquivo de áudio

from elevenlabs import generate

def generate_audio_elevenlabsfree(texto, modelo_de_voz):
    output_dir = "output"
    os.makedirs(output_dir, exist_ok=True)  # Certifique-se de que o diretório de saída exista

    try:
        # Gerar áudio usando elevenlabs
        audio = generate(
            text=texto,
            voice=modelo_de_voz,
            model='eleven_multilingual_v2'
        )
        
        # Caminho completo para o arquivo de saída
        output_file_path = os.path.join(output_dir, "new_audio.wav")

        # Escrever os dados do áudio no arquivo WAV
        with open(output_file_path, 'wb') as wf:
            wf.write(audio)

        print("Áudio gerado com sucesso em:", output_file_path)
        return output_file_path
    except Exception as e:
        print("Erro ao gerar áudio:", e)
        return None

badges = """
<div style="display: flex">
<span style="margin-right: 5px"> 

[ ![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) ](https://github.com/rafaelGodoyEbert)
 
</span>
<span style="margin-right: 5px"> 

[ ![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white) ](https://twitter.com/GodoyEbert)
 
</span>
<span>

[ ![](https://dcbadge.vercel.app/api/server/aihubbrasil) ](https://discord.gg/aihubbrasil)

</span>
</div>
"""

description = """
# TTS Rápido
 TTS Rápido, para todos aqueles que sempre me pediam alguma forma de fazer algum TTS.<br>
 Tem em diversos idiomas, só aproveitar<br>
 Increva-se no canal do <a href='https://www.youtube.com/@aihubbrasil' target='_blank'>Youtube do AI HUB Brasil</a> e no meu pessoal <a href='https://www.youtube.com/@godoyy' target='_blank'>Godoyy</a>
"""


with gr.Blocks(theme=gr.themes.Default(primary_hue="green", secondary_hue="blue"), title="TTS Rápido") as iface:
    gr.Markdown(badges)
    gr.Markdown(description)
    title="TTS Rápido"
    description="Digite o texto, escolha o modelo de voz e ajuste a velocidade para gerar um áudio. O áudio resultante pode ser reproduzido diretamente no Gradio."

    with gr.Tabs():
        with gr.TabItem("Edge-TTS"):
            gr.Markdown("Botei todos os idiomas possível, até onde testei, é ilimitado, podendo até mesmo colocar um livro inteiro, mas claro, tem a questão de tempo, quanto maior o texto, mais demorado é.")
            # Defina os elementos de entrada e saída
            audio_input = gr.Textbox(label="Texto", value='Texto de exemplo!', interactive=True)
            voice_model_input = gr.Dropdown(SUPPORTED_VOICES, label="Modelo de Voz", value="pt-BR-AntonioNeural")
            speed_input = gr.Slider(minimum=-200, maximum=200, label="Velocidade (%)", value=0, interactive=True)
            checkbox_cortar_silencio = gr.Checkbox(label="Cortar Silencio", interactive=True)
            audio_output = gr.Audio(label="Resultado", type="filepath", interactive=False)
            edgetts_button = gr.Button(value="Falar")
            edgetts_button.click(controlador_generate_audio, inputs=[audio_input, voice_model_input, speed_input, checkbox_cortar_silencio], outputs=[audio_output])
            #edgetts_button = gr.Button(value="Falar")
            #edgetts_button.click(fn=generate_audio, inputs=[audio_input, voice_model_input, speed_input], outputs=[audio_output])
            clear_button = gr.ClearButton(audio_input, value='Limpar')
            gr.Markdown("Agradecimentos a rany2 pelo Edge-TTS")

        with gr.TabItem("Elevenlabs SEM API"):
            gr.Markdown("Esse é a API gratuita que é disponivel pela própria Elevenlabs, não sei os limites, mas sei que tem, acredito que após 3 requests seguidos já caia, então tenha certeza o texto que vá usar.")
            audio_input = gr.Textbox(label="Texto (Acho que o limite é 250 caracteres)", value='Texto de exemplo!', interactive=True)
            voice_model_input = gr.Dropdown(['Arnold', 'Antoni','Bella', 'Rachel', 'Drew', 'Clyde', 'Paul' ], label="Modelo de Voz", value="Arnold")
            gr.Markdown("Se estiver usando huggingface e não rodar, vá em logs, que está acima da imagem do github e veja se já não passou o limite de request da API")
            audio_output = gr.Audio(label="Resultado", type="filepath", interactive=False)
            elevenlabs_button = gr.Button(value="Falar")
            elevenlabs_button.click(fn=generate_audio_elevenlabsfree, inputs=[audio_input, voice_model_input], outputs=[audio_output])
            clear_button = gr.ClearButton(audio_input, value='Limpar')
            gr.Markdown("Agradecimentos ao Elevenlabs")

            # Executar o aplicativo Gradio
        gr.Markdown("""
                    Desenvolvido por Rafael Godoy <br>
                    Apoie o projeto pelo https://nubank.com.br/pagar/1ls6a4/0QpSSbWBSq, qualquer valor é bem vindo.
                    """)
        iface.launch(share=True)