import gradio as gr from transformers import VitsModel, AutoTokenizer import torch import numpy as np # Carregamento do modelo e tokenizer model_id = "facebook/mms-tts-grc" tokenizer = AutoTokenizer.from_pretrained(model_id) model = VitsModel.from_pretrained(model_id) def synthesize_greek(text, speed): if not text or len(text.strip()) == 0: return None try: # Log para conferirmos se o slider está enviando o valor correto print(f"Gerando áudio com velocidade: {speed}") inputs = tokenizer(text, return_tensors="pt") # O modelo VITS da Transformers usa o speaking_rate como um multiplicador. # Se 1.0 é o normal, 2.0 deveria ser o dobro da duração (mais lento). # Vamos garantir que o atributo seja aplicado antes da inferência. model.speaking_rate = float(speed) with torch.no_grad(): output = model(**inputs).waveform audio_numpy = output[0].cpu().numpy() sampling_rate = model.config.sampling_rate return (sampling_rate, audio_numpy) except Exception as e: print(f"Erro na síntese: {e}") return None # Exemplos clássicos politônicos greek_examples = [ ["Γνῶθι σεαυτόν.", 0.6], ["Ὁ βίος βραχύς, ἡ δὲ τέχνη μακρή.", 1], ["οἶδα ὅτι οὐδὲν οἶδα.", 0.8], ["Ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν θεόν.", 0.6] ] with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# 🏛️ MMS-TTS Grego Antigo - Pronúncia em grego moderno") gr.Markdown("### Ajuste a velocidade para uma pronúncia mais clara e pausada") gr.Markdown("### Valor menor = maior lentidão") with gr.Row(): with gr.Column(): input_text = gr.Textbox( label="Inserir texto em Grego Politônico", placeholder="Ex: ἐν ἀρχῇ ἦν ὁ λόγος...", lines=5 ) speed_slider = gr.Slider( minimum=0.5, maximum=2.0, # Aumentado para permitir uma lentidão extrema value=1.0, step=0.1, label="Ajuste a velocidade para obter a pronúncia ideal" ) btn = gr.Button("Gerar Áudio", variant="primary") with gr.Column(): audio_output = gr.Audio(label="Áudio Sintetizado") btn.click( fn=synthesize_greek, inputs=[input_text, speed_slider], outputs=audio_output ) gr.Examples( examples=greek_examples, inputs=[input_text, speed_slider], label="Exemplos" ) if __name__ == "__main__": demo.launch()