import subprocess import gradio as gr from TTS.api import TTS import os import time import torch tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=True) output_folder = "output_audio" os.makedirs(output_folder, exist_ok=True) def predict(prompt, speaker, agree, subfolder_name, file_name): if not agree: raise gr.Error("Veuillez accepter les conditions d'utilisation.") subfolder_name = subfolder_name.strip() or f"session_{int(time.time())}" session_folder = os.path.join(output_folder, subfolder_name) os.makedirs(session_folder, exist_ok=True) file_name = file_name.strip() or "output.wav" if not file_name.endswith(".wav"): file_name += ".wav" output_path = os.path.join(session_folder, file_name) speaker_wav_paths = [os.path.join("examples", f) for f in os.listdir("examples") if f.startswith(speaker) and f.endswith(".wav")] if not speaker_wav_paths: raise gr.Error(f"Aucun fichier audio trouvé pour le speaker : {speaker}") tts.tts_to_file( text=prompt, file_path=output_path, speaker_wav=speaker_wav_paths, language="fr" ) return output_path custom_css = """ .gradio-container { font-family: 'Roboto', sans-serif; background-color: #f7f9fc; } .gr-form { background-color: white; border-radius: 15px; padding: 30px; box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); } .gr-button { background-color: #4a90e2; border: none; color: white; font-weight: bold; transition: all 0.3s ease; } .gr-button:hover { background-color: #3a7bc8; transform: translateY(-2px); } .gr-input, .gr-dropdown { border: 1px solid #e0e0e0; border-radius: 8px; padding: 10px; } .gr-checkbox { margin-top: 10px; } .gr-form > div { margin-bottom: 20px; } """ title = "🎙️ Synthèse Vocale XTTS" description = """
Générez une voix naturelle à partir de votre texte en français. Choisissez une voix, entrez votre texte, et écoutez le résultat !
""" article = """En utilisant cette démo, vous acceptez les conditions d'utilisation du modèle Coqui Public