dire1copy / app.py
Kamil159's picture
Update app.py
c33313c verified
import os
import gradio as gr
import torch
from TTS.api import TTS
import spaces # Hugging Face Spaces üzerinde GPU decorator'ı için gerekli
import tempfile # Geçici dosya oluşturmak için tempfile modülünü import ediyoruz
# --- GÜVENLİK AYARI BAŞLANGICI ---
# PyTorch'un güvenlik mekanizması, model yüklenirken bilinmeyen sınıflara
# varsayılan olarak izin vermez. Modelin ihtiyaç duyduğu tüm özel sınıfları
# güvenli olarak işaretlemeliyiz.
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts, XttsAudioConfig, XttsArgs
from TTS.config.shared_configs import BaseDatasetConfig
# Güvenli olarak kabul edilecek tüm sınıfları içeren bir liste
SAFE_GLOBALS = [XttsConfig, XttsAudioConfig, Xtts, BaseDatasetConfig, XttsArgs]
# torch.serialization.add_safe_globals ile bu listeyi PyTorch'a bildiriyoruz.
torch.serialization.add_safe_globals(SAFE_GLOBALS)
# --- GÜVENLİK AYARI SONU ---
# Coqui TOS (Kullanım Şartları) kabul edildiğini belirtiyoruz.
os.environ["COQUI_TOS_AGREED"] = "1"
# Cihazı belirliyoruz: Mümkünse GPU (cuda), değilse CPU kullan.
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Kullanılan Cihaz: {device}")
# --- YENİ EKLENEN KISIM: SABİT REFERANS SES ---
# Her zaman kullanılacak olan referans ses dosyasının yolu.
# Bu dosyanın Space'inizde 'audio' klasörünün içinde olması gerekir.
REFERENCE_AUDIO_PATH = "audio/reference.wav"
# Uygulama başlamadan önce referans ses dosyasının varlığını kontrol et
if not os.path.exists(REFERENCE_AUDIO_PATH):
print(f"UYARI: Referans ses dosyası bulunamadı: {REFERENCE_AUDIO_PATH}")
print("Lütfen Space'inize 'audio' adında bir klasör oluşturun ve içine 'reference.wav' adında bir ses dosyası yükleyin.")
# Dosya yoksa uygulamanın çökmesini engellemek için boş bir referans yolu atayabiliriz
# veya bir hata fırlatabiliriz. Şimdilik uyarı verip devam ediyoruz.
# --- YENİ EKLENEN KISIM SONU ---
try:
# TTS modelini başlatıyoruz.
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")
tts.to(device)
print("TTS modeli başarıyla yüklendi.")
except Exception as e:
# Model yüklenemezse, hatayı loglara yazdır ve programı sonlandır.
print(f"KRİTİK HATA: TTS modeli yüklenemedi. Hata: {e}")
raise e
# Gradio arayüzünde GPU kullanıldığını belirtmek için bir decorator.
@spaces.GPU
def clone(text, language):
"""
Verilen ses dosyasından sesi klonlar ve metni bu sesle seslendirir.
Bu fonksiyon artık sabit bir referans ses dosyası kullanır.
"""
if not text or not language:
gr.Warning("Lütfen metin ve dil seçimi alanlarını doldurun.")
return gr.update(value=None)
# Referans ses dosyasının varlığını tekrar kontrol et
if not os.path.exists(REFERENCE_AUDIO_PATH):
error_msg = f"Referans ses dosyası bulunamadı: {REFERENCE_AUDIO_PATH}"
gr.Error(error_msg)
print(error_msg)
return gr.update(value=None)
try:
# Çıktı için güvenli bir geçici dosya yolu oluşturuyoruz.
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_wav_file:
output_path = temp_wav_file.name
print(f"Ses klonlama başlatıldı. Metin: '{text}', Dil: '{language}'")
# Sesi doğrudan dosyaya üretiyoruz. Sabit referans ses yolunu kullanıyoruz.
tts.tts_to_file(text=text, speaker_wav=REFERENCE_AUDIO_PATH, language=language.lower(), file_path=output_path)
print(f"Ses dosyası başarıyla oluşturuldu: {output_path}")
# Başarı durumunda ses oynatıcıyı oluşturulan dosyanın yolu ile güncelliyoruz.
return gr.update(value=output_path)
except Exception as e:
error_message = f"Ses klonlama sırasında bir hata oluştu: {e}"
print(error_message)
gr.Error(error_message)
return gr.update(value=None)
# Gradio arayüzünü Blocks API'si ile tasarlıyoruz.
with gr.Blocks(title="Gelişmiş Ses Klonlama", theme=gr.themes.Soft(primary_hue="teal")) as demo:
gr.Markdown(
"""
# 🎤 Gelişmiş Ses Klonlama
**Vortex Tarafından Geliştirilmiştir**
Bu uygulama, ses klonlama için **xtts_v2** modelini kullanır.
*Sadece ticari olmayan kullanım içindir.*
[Coqui Kamu Modeli Lisansı](https://coqui.ai/cpml)
---
"""
)
with gr.Row():
with gr.Column(scale=2):
text_input = gr.Textbox(
label="Seslendirilecek Metin",
placeholder="Klonlanmış sesin söylemesini istediğiniz metni buraya yazın...",
lines=5
)
language_input = gr.Dropdown(
label="Dil",
choices=["tr", "en", "es", "fr", "de", "it", "pt", "pl", "ru", "zh-cn", "ja", "ko"],
value="tr"
)
# --- DEĞİŞİKLİK ---
# Ses yükleme bileşeni kaldırıldı.
# --- DEĞİŞİKLİK SONU ---
clone_button = gr.Button("Sesi Klonla", variant="primary")
with gr.Column(scale=1):
output_audio = gr.Audio(
label="Klonlanmış Ses Çıktısı"
)
gr.Markdown(
"""
---
❤️ Bu uygulamayı faydalı bulduysanız, lütfen bir beğeni bırakmayı düşünün!
"""
)
clone_button.click(
fn=clone,
# --- DEĞİŞİKLİK ---
# Girdilerden 'audio_input' kaldırıldı.
inputs=[text_input, language_input],
# --- DEĞİŞİKLİK SONU ---
outputs=[output_audio],
queue=True
)
# Hugging Face Spaces'in arayüzü başlatabilmesi için 'demo.launch()' komutu
# 'if __name__ == "__main__":' bloğunun DIŞINDA olmalıdır.
demo.launch()