Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -5,7 +5,6 @@ import os
|
|
5 |
import time
|
6 |
import torch
|
7 |
|
8 |
-
|
9 |
# Initialisation du modèle TTS avec GPU désactivé
|
10 |
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
|
11 |
|
@@ -41,89 +40,51 @@ def generate_section_audio(project_name, section_name, text, speaker):
|
|
41 |
except Exception as e:
|
42 |
return str(e) # Retourne l'erreur pour gestion dans l'interface
|
43 |
|
44 |
-
# Fonction pour
|
45 |
-
def
|
46 |
-
|
47 |
-
for section in sections:
|
48 |
-
section_name, text = section["name"], section["text"]
|
49 |
-
result = generate_section_audio(project_name, section_name, text, speaker)
|
50 |
-
results.append({"section": section_name, "result": result})
|
51 |
-
return results
|
52 |
-
|
53 |
-
# Fonction de validation des conditions d'utilisation
|
54 |
-
def validate_conditions(agree):
|
55 |
-
if not agree:
|
56 |
-
raise gr.Error("❗ Veuillez accepter les conditions d'utilisation pour continuer.")
|
57 |
|
58 |
# Interface Gradio
|
59 |
with gr.Blocks() as demo:
|
60 |
-
#
|
61 |
-
gr.
|
62 |
-
|
63 |
-
# Introduction et explication globale
|
64 |
-
gr.Markdown("""
|
65 |
-
## 👋 Bienvenue sur Margaux - Votre outil de synthèse vocale avancée
|
66 |
-
Margaux vous permet de générer des voix off naturelles à partir de textes, structurées par sections pour une meilleure qualité audio.
|
67 |
-
**Étapes principales :**
|
68 |
-
1. 🛠️ **Créer un projet** : Définissez le nom du projet et choisissez la voix.
|
69 |
-
2. ✍️ **Ajouter des sections** : Divisez votre texte en parties claires, chacune avec un nom unique.
|
70 |
-
3. 🎧 **Générer les audios** : Chaque section est transformée en fichier audio individuel.
|
71 |
-
4. 🔄 **Écoutez et ajustez** : Régénérez les audios si nécessaire, indépendamment des autres.
|
72 |
-
5. 📁 **Sauvegardez le projet** : Finalisez et récupérez les fichiers validés.
|
73 |
-
""")
|
74 |
|
75 |
# Étape 1 : Création du Projet
|
76 |
-
with gr.
|
77 |
gr.Markdown("### 🛠️ Étape 1 : Création du Projet")
|
78 |
-
gr.Markdown("**📂 Définissez les informations générales pour votre projet.**")
|
79 |
-
gr.Markdown("Le nom du projet servira à organiser vos fichiers dans un dossier dédié.")
|
80 |
project_name = gr.Textbox(label="Nom du Projet", placeholder="Exemple : Capsule_Video_PLU")
|
81 |
speaker = gr.Dropdown(label="Voix 🎙️", choices=["Margaux"], value="Margaux") # Liste de voix
|
82 |
agree = gr.Checkbox(label="✅ J'accepte les conditions d'utilisation")
|
83 |
-
|
84 |
|
85 |
# Étape 2 : Gestion des Sections
|
86 |
-
with gr.
|
87 |
gr.Markdown("### ✍️ Étape 2 : Ajoutez vos Sections")
|
88 |
-
gr.
|
89 |
-
**📝 Divisez votre script en plusieurs sections pour une meilleure qualité.**
|
90 |
-
Chaque section doit avoir :
|
91 |
-
- Un **nom unique** 🏷️ qui servira à nommer le fichier audio.
|
92 |
-
- Un **texte clair et concis** ✏️.
|
93 |
-
""")
|
94 |
-
sections = gr.State([]) # Liste des sections dynamiques
|
95 |
-
sections_list = gr.Column() # Conteneur pour les sections ajoutées dynamiquement
|
96 |
add_section_btn = gr.Button("+ Ajouter une Section ➕")
|
97 |
remove_section_btn = gr.Button("- Supprimer la dernière Section ➖")
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
- 🔄 Régénérez l’audio d’une section indépendamment si nécessaire.
|
105 |
-
- ⚠️ En cas d’erreur, seuls les audios de sections valides seront disponibles.
|
106 |
-
""")
|
107 |
generate_btn = gr.Button("Générer les Audios ▶️")
|
108 |
results_output = gr.Column() # Conteneur pour les audios générés
|
109 |
-
|
110 |
-
# Étape 4 : Sauvegarde Finale
|
111 |
-
with gr.Box():
|
112 |
-
gr.Markdown("### 📁 Étape 4 : Sauvegarde Finale")
|
113 |
-
gr.Markdown("""
|
114 |
-
**💾 Une fois satisfait des résultats :**
|
115 |
-
- Cliquez sur **Sauvegarder** pour conserver uniquement les fichiers validés.
|
116 |
-
- Les fichiers seront organisés dans un dossier au nom de votre projet.
|
117 |
-
""")
|
118 |
save_project_btn = gr.Button("Sauvegarder le Projet ✅")
|
119 |
|
120 |
# Actions des Boutons
|
121 |
def create_project(project_name, speaker, agree):
|
122 |
-
|
|
|
|
|
|
|
123 |
os.makedirs(os.path.join(output_folder, project_name), exist_ok=True)
|
124 |
-
return f"✅ Projet '{project_name}' créé avec succès !"
|
125 |
|
126 |
-
|
|
|
127 |
|
128 |
def add_section(sections):
|
129 |
section = {"name": f"Section_{len(sections) + 1}", "text": ""}
|
@@ -143,6 +104,11 @@ with gr.Blocks() as demo:
|
|
143 |
results = process_project(project_name, sections, speaker)
|
144 |
return results
|
145 |
|
|
|
|
|
|
|
|
|
|
|
146 |
generate_btn.click(generate_audios, inputs=[project_name, sections, speaker], outputs=[results_output])
|
147 |
|
148 |
# Lancement de l'interface
|
|
|
5 |
import time
|
6 |
import torch
|
7 |
|
|
|
8 |
# Initialisation du modèle TTS avec GPU désactivé
|
9 |
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
|
10 |
|
|
|
40 |
except Exception as e:
|
41 |
return str(e) # Retourne l'erreur pour gestion dans l'interface
|
42 |
|
43 |
+
# Fonction pour gérer l'état d'avancement de l'interface
|
44 |
+
def update_step(step):
|
45 |
+
return {"visible": step == 1}, {"visible": step == 2}, {"visible": step == 3}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
|
47 |
# Interface Gradio
|
48 |
with gr.Blocks() as demo:
|
49 |
+
step = gr.State(value=1) # État pour suivre l'étape active
|
50 |
+
sections = gr.State(value=[]) # Liste dynamique des sections
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
|
52 |
# Étape 1 : Création du Projet
|
53 |
+
with gr.Row(visible=True) as step1:
|
54 |
gr.Markdown("### 🛠️ Étape 1 : Création du Projet")
|
|
|
|
|
55 |
project_name = gr.Textbox(label="Nom du Projet", placeholder="Exemple : Capsule_Video_PLU")
|
56 |
speaker = gr.Dropdown(label="Voix 🎙️", choices=["Margaux"], value="Margaux") # Liste de voix
|
57 |
agree = gr.Checkbox(label="✅ J'accepte les conditions d'utilisation")
|
58 |
+
next_btn_1 = gr.Button("Suivant ➡️")
|
59 |
|
60 |
# Étape 2 : Gestion des Sections
|
61 |
+
with gr.Row(visible=False) as step2:
|
62 |
gr.Markdown("### ✍️ Étape 2 : Ajoutez vos Sections")
|
63 |
+
sections_list = gr.Column() # Conteneur pour les sections
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
add_section_btn = gr.Button("+ Ajouter une Section ➕")
|
65 |
remove_section_btn = gr.Button("- Supprimer la dernière Section ➖")
|
66 |
+
prev_btn_2 = gr.Button("⬅️ Précédent")
|
67 |
+
next_btn_2 = gr.Button("Suivant ➡️")
|
68 |
+
|
69 |
+
# Étape 3 : Génération des Audios et Sauvegarde
|
70 |
+
with gr.Row(visible=False) as step3:
|
71 |
+
gr.Markdown("### 🎧 Étape 3 : Génération et Sauvegarde")
|
|
|
|
|
|
|
72 |
generate_btn = gr.Button("Générer les Audios ▶️")
|
73 |
results_output = gr.Column() # Conteneur pour les audios générés
|
74 |
+
prev_btn_3 = gr.Button("⬅️ Précédent")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
save_project_btn = gr.Button("Sauvegarder le Projet ✅")
|
76 |
|
77 |
# Actions des Boutons
|
78 |
def create_project(project_name, speaker, agree):
|
79 |
+
if not agree:
|
80 |
+
return gr.Error("❗ Veuillez accepter les conditions d'utilisation.")
|
81 |
+
if not project_name:
|
82 |
+
return gr.Error("❗ Le nom du projet est obligatoire.")
|
83 |
os.makedirs(os.path.join(output_folder, project_name), exist_ok=True)
|
84 |
+
return f"✅ Projet '{project_name}' créé avec succès !", 2
|
85 |
|
86 |
+
next_btn_1.click(create_project, inputs=[project_name, speaker, agree], outputs=[None, step])
|
87 |
+
step.change(update_step, inputs=step, outputs=[step1, step2, step3])
|
88 |
|
89 |
def add_section(sections):
|
90 |
section = {"name": f"Section_{len(sections) + 1}", "text": ""}
|
|
|
104 |
results = process_project(project_name, sections, speaker)
|
105 |
return results
|
106 |
|
107 |
+
next_btn_2.click(lambda: 3, inputs=None, outputs=step)
|
108 |
+
prev_btn_2.click(lambda: 1, inputs=None, outputs=step)
|
109 |
+
step.change(update_step, inputs=step, outputs=[step1, step2, step3])
|
110 |
+
|
111 |
+
prev_btn_3.click(lambda: 2, inputs=None, outputs=step)
|
112 |
generate_btn.click(generate_audios, inputs=[project_name, sections, speaker], outputs=[results_output])
|
113 |
|
114 |
# Lancement de l'interface
|