Spaces:
Sleeping
Sleeping
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) |