TTS-Rapido / app.py
RafaG's picture
Update app.py
dbf3c82 verified
raw
history blame
7.79 kB
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)