import subprocess import os import gradio as gr from TTS.api import TTS class TTSInterface: def __init__(self): # Initialisation du modèle TTS self.tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False) self.output_folder = "output_audio" os.makedirs(self.output_folder, exist_ok=True) def create_interface(self): with gr.Blocks(theme=gr.themes.Soft()) as demo: # Variables d'état state = gr.State({ "project_name": "", "sections": [] }) # En-tête gr.Markdown(""" # 🎙️ Synthèse Vocale Margaux ## 👋 Bienvenue sur Margaux - Votre outil de synthèse vocale avancée Margaux vous permet de générer des voix off naturelles à partir de textes, structurées par sections pour une meilleure qualité audio. **Étapes principales :** 1. 🛠️ **Créer un projet** : Définissez le nom du projet et choisissez la voix. 2. ✍️ **Ajouter des sections** : Divisez votre texte en parties claires. 3. 🎧 **Générer les audios** : Chaque section est transformée en fichier audio. 4. 📁 **Sauvegardez le projet** : Finalisez et récupérez les fichiers. """) # Tabs pour les étapes with gr.Tabs() as tabs: # Étape 1: Configuration du projet with gr.Tab("🛠️ Création du Projet"): with gr.Column(): gr.Markdown("### Configuration initiale") project_name = gr.Textbox( label="Nom du Projet", placeholder="Exemple : Capsule_Video_PLU", scale=1 ) speaker = gr.Dropdown( choices=["Margaux"], value="Margaux", label="Voix 🎙️", scale=1 ) terms = gr.Checkbox( label="✅ J'accepte les conditions d'utilisation" ) create_btn = gr.Button("Créer le Projet ➡️", variant="primary") status_message = gr.Markdown("") # Pour afficher les messages de statut # Étape 2: Gestion des sections with gr.Tab("✍️ Sections"): with gr.Column(): gr.Markdown("### Gestion des sections") # Template pour une section section_template = gr.DataFrame( headers=["Nom", "Texte"], row_count=0, col_count=2, interactive=True ) with gr.Row(): add_section = gr.Button("+ Ajouter une Section ➕") remove_section = gr.Button("- Supprimer la dernière Section ➖") # Étape 3: Génération des audios with gr.Tab("🎧 Génération"): with gr.Column(): gr.Markdown("### Génération des audios") generate_all = gr.Button("Générer tous les audios ▶️", variant="primary") audio_output = gr.Audio(label="Audio généré") # Un seul composant Audio pour l'exemple status = gr.Markdown("") # Pour les messages de statut de génération # Fonctions de callback def update_project_info(name, terms): if not terms: return "⚠️ Veuillez accepter les conditions d'utilisation" if not name.strip(): return "⚠️ Le nom du projet est requis" return f"✅ Projet '{name}' créé avec succès!" def add_new_section(data): if data is None: data = [] new_row = [f"Section_{len(data) + 1}", ""] return data + [new_row] def remove_last_section(data): if data and len(data) > 0: return data[:-1] return data def generate_audio(text, project_name): try: if not text or not project_name: return None, "⚠️ Texte ou nom de projet manquant" output_path = os.path.join(self.output_folder, f"{project_name}_output.wav") # Génération de l'audio self.tts.tts_to_file( text=text, file_path=output_path, language="fr" ) return output_path, "✅ Audio généré avec succès" except Exception as e: return None, f"⚠️ Erreur: {str(e)}" # Événements create_btn.click( fn=update_project_info, inputs=[project_name, terms], outputs=[status_message] ) add_section.click( fn=add_new_section, inputs=[section_template], outputs=[section_template] ) remove_section.click( fn=remove_last_section, inputs=[section_template], outputs=[section_template] ) generate_all.click( fn=generate_audio, inputs=[project_name, speaker], outputs=[audio_output, status] ) return demo if __name__ == "__main__": interface = TTSInterface() demo = interface.create_interface() demo.launch(debug=True)