File size: 3,768 Bytes
4d849cc
 
 
499a43a
4d849cc
 
 
499a43a
43e252d
4d849cc
499a43a
 
 
 
 
 
 
4d849cc
 
43e252d
 
4d849cc
 
499a43a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d849cc
499a43a
 
 
 
4d849cc
499a43a
4d849cc
499a43a
 
 
 
 
8a7fed3
4d849cc
499a43a
 
4d849cc
499a43a
4d849cc
499a43a
43e252d
4d849cc
499a43a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d849cc
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
import spaces
import tempfile
import gradio as gr
from f5_tts.api import F5TTS # f5_tts'in kurulu ve erişilebilir olduğunu varsayıyoruz
from huggingface_hub import hf_hub_download
import os

# Kullanılabilir model varyantlarını tanımla
VARIANTS = ["orkhon_tts"]
models = {}

# TTS modellerini yükle
# Bu döngü, VARIANTS listesini (şu anda sadece "orkhon_tts") yineler
# ve karşılık gelen F5TTS modelini yükler.
# Hugging Face Hub'dan model kontrol noktasını ve kelime dağarcığı dosyasını almak için
# hf_hub_download kullanır.
# Model özelse kimlik doğrulama için HF_TOKEN ortam değişkeni kullanılır.
for variant in VARIANTS:
    models[variant] = F5TTS(
        ckpt_file=hf_hub_download("hcsolakoglu/Orkhon-TTS", f"{variant}.pt", token=os.getenv("HF_TOKEN")),
        vocab_file=hf_hub_download("hcsolakoglu/Orkhon-TTS", "vocab.txt", token=os.getenv("HF_TOKEN"))
    )

@spaces.GPU # Bu fonksiyonun Hugging Face Spaces'ta varsa GPU'da çalışması gerektiğini belirten dekoratör
def generate(text, ref_audio, variant, progress=gr.Progress()):
    """
    Seçilen F5TTS model varyantını kullanarak metinden konuşma üretir.

    Args:
        text (str): Sentezlenecek giriş metni.
        ref_audio (str): Ses klonlama için referans sesin dosya yolu.
        variant (str): Kullanılacak TTS model varyantı (örn. "orkhon_tts").
        progress (gradio.Progress, optional): Gradio ilerleme izleyicisi. Varsayılan gr.Progress().

    Returns:
        str: Üretilen WAV ses dosyasının dosya yolu.
    """
    # Seçilen varyant için F5TTS API örneğini al
    api = models[variant]

    # Üretilen sesi kaydetmek için geçici bir dosya oluştur
    # delete=False önemlidir çünkü Gradio'nun bu dosyaya fonksiyon döndükten sonra erişmesi gerekir.
    # Gradio geçici dosyaların temizlenmesini halledecektir.
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        # TTS çıkarımını gerçekleştir
        api.infer(
            ref_file=ref_audio,    # Referans sesin yolu
            ref_text="",           # Referans metin (ASR kullanılırsa veya model tarafından gerekmiyorsa boş olabilir)
            gen_text=text,         # Konuşma üretilecek metin
            progress=progress,     # İlerleme izleyicisini API'ye ilet
            file_wave=f.name,      # Çıktı WAV dosyasını kaydetme yolu
            nfe_step=64            # nfe_step değerini maksimuma (64) ayarla
        )
    print(f"Üretilen ses şuraya kaydedildi: {f.name}") # Geçici dosyanın yolunu günlüğe kaydet
    return f.name # Üretilen ses dosyasının yolunu döndür

# Gradio arayüzünü oluştur
with gr.Blocks() as demo:
    # Başlık ve açıklama için Markdown
    gr.Markdown("# Demo for Orkhon-TTS\n\nTry out [Orkhon-TTS](https://huggingface.co/hcsolakoglu/Orkhon-TTS)")

    # Giriş bileşenleri
    textbox = gr.Textbox(label="Sentezlenecek Metin")
    audio = gr.Audio(label="Referans Ses (ses klonlama için)", type="filepath")
    variant_radio = gr.Radio(choices=VARIANTS, value=VARIANTS[0], label="Model Varyantını Seçin")

    # Üretimi tetikleme düğmesi
    btn = gr.Button("Konuşma Üret", variant="primary")

    # Çıkış bileşeni
    output_audio = gr.Audio(label="Sentezlenmiş Konuşma Çıktısı", type="filepath")

    # Düğme için tıklama eylemini tanımla
    # Düğmeye tıklandığında, 'generate' fonksiyonunu
    # 'textbox', 'audio' ve 'variant_radio' değerleriyle giriş olarak çağır.
    # 'generate' çıktısı 'output_audio' içinde görüntülenecektir.
    btn.click(generate, [textbox, audio, variant_radio], outputs=[output_audio])

# Birden fazla isteği işlemek için demoyu kuyruğa al ve başlat
demo.queue().launch()