File size: 2,828 Bytes
921ce94
 
 
a1629f5
921ce94
abc9b38
921ce94
abc9b38
921ce94
 
 
a1629f5
921ce94
 
a1629f5
26a8344
 
 
a1629f5
 
26a8344
 
 
 
a1629f5
 
 
 
 
 
 
 
 
 
26a8344
a1629f5
921ce94
abc9b38
921ce94
7172c2f
 
 
 
a1629f5
 
 
6108420
e21f566
2c4cdd7
a1629f5
 
 
 
2c4cdd7
abc9b38
a1629f5
 
 
 
9a815df
 
a1629f5
76dcd24
a1629f5
 
 
 
 
 
 
 
 
 
 
 
921ce94
 
c21d786
 
921ce94
 
 
 
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
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()