Woziii commited on
Commit
f5875da
·
verified ·
1 Parent(s): f190f5a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +110 -145
app.py CHANGED
@@ -3,148 +3,113 @@ import os
3
  import gradio as gr
4
  from TTS.api import TTS
5
 
6
- class TTSInterface:
7
- def __init__(self):
8
- # Initialisation du modèle TTS
9
- self.tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
10
- self.output_folder = "output_audio"
11
- os.makedirs(self.output_folder, exist_ok=True)
12
-
13
- def create_interface(self):
14
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
15
- # Variables d'état
16
- state = gr.State({
17
- "project_name": "",
18
- "sections": []
19
- })
20
-
21
- # En-tête
22
- gr.Markdown("""
23
- # 🎙️ Synthèse Vocale Margaux
24
- ## 👋 Bienvenue sur Margaux - Votre outil de synthèse vocale avancée
25
-
26
- Margaux vous permet de générer des voix off naturelles à partir de textes, structurées par sections pour une meilleure qualité audio.
27
-
28
- **Étapes principales :**
29
- 1. 🛠️ **Créer un projet** : Définissez le nom du projet et choisissez la voix.
30
- 2. ✍️ **Ajouter des sections** : Divisez votre texte en parties claires.
31
- 3. 🎧 **Générer les audios** : Chaque section est transformée en fichier audio.
32
- 4. 📁 **Sauvegardez le projet** : Finalisez et récupérez les fichiers.
33
- """)
34
-
35
- # Tabs pour les étapes
36
- with gr.Tabs() as tabs:
37
- # Étape 1: Configuration du projet
38
- with gr.Tab("🛠️ Création du Projet"):
39
- with gr.Column():
40
- gr.Markdown("### Configuration initiale")
41
- project_name = gr.Textbox(
42
- label="Nom du Projet",
43
- placeholder="Exemple : Capsule_Video_PLU",
44
- scale=1
45
- )
46
- speaker = gr.Dropdown(
47
- choices=["Margaux"],
48
- value="Margaux",
49
- label="Voix 🎙️",
50
- scale=1
51
- )
52
- terms = gr.Checkbox(
53
- label="✅ J'accepte les conditions d'utilisation"
54
- )
55
- create_btn = gr.Button("Créer le Projet ➡️", variant="primary")
56
- status_message = gr.Markdown("") # Pour afficher les messages de statut
57
-
58
- # Étape 2: Gestion des sections
59
- with gr.Tab("✍️ Sections"):
60
- with gr.Column():
61
- gr.Markdown("### Gestion des sections")
62
-
63
- # Template pour une section
64
- section_template = gr.DataFrame(
65
- headers=["Nom", "Texte"],
66
- row_count=0,
67
- col_count=2,
68
- interactive=True
69
- )
70
-
71
- with gr.Row():
72
- add_section = gr.Button("+ Ajouter une Section ➕")
73
- remove_section = gr.Button("- Supprimer la dernière Section ➖")
74
-
75
- # Étape 3: Génération des audios
76
- with gr.Tab("🎧 Génération"):
77
- with gr.Column():
78
- gr.Markdown("### Génération des audios")
79
- generate_all = gr.Button("Générer tous les audios ▶️", variant="primary")
80
- audio_output = gr.Audio(label="Audio généré") # Un seul composant Audio pour l'exemple
81
- status = gr.Markdown("") # Pour les messages de statut de génération
82
-
83
- # Fonctions de callback
84
- def update_project_info(name, terms):
85
- if not terms:
86
- return "⚠️ Veuillez accepter les conditions d'utilisation"
87
- if not name.strip():
88
- return "⚠️ Le nom du projet est requis"
89
- return f"✅ Projet '{name}' créé avec succès!"
90
-
91
- def add_new_section(data):
92
- if data is None:
93
- data = []
94
- new_row = [f"Section_{len(data) + 1}", ""]
95
- return data + [new_row]
96
-
97
- def remove_last_section(data):
98
- if data and len(data) > 0:
99
- return data[:-1]
100
- return data
101
-
102
- def generate_audio(text, project_name):
103
- try:
104
- if not text or not project_name:
105
- return None, "⚠️ Texte ou nom de projet manquant"
106
-
107
- output_path = os.path.join(self.output_folder, f"{project_name}_output.wav")
108
-
109
- # Génération de l'audio
110
- self.tts.tts_to_file(
111
- text=text,
112
- file_path=output_path,
113
- language="fr"
114
- )
115
-
116
- return output_path, "✅ Audio généré avec succès"
117
- except Exception as e:
118
- return None, f"⚠️ Erreur: {str(e)}"
119
-
120
- # Événements
121
- create_btn.click(
122
- fn=update_project_info,
123
- inputs=[project_name, terms],
124
- outputs=[status_message]
125
- )
126
-
127
- add_section.click(
128
- fn=add_new_section,
129
- inputs=[section_template],
130
- outputs=[section_template]
131
- )
132
-
133
- remove_section.click(
134
- fn=remove_last_section,
135
- inputs=[section_template],
136
- outputs=[section_template]
137
- )
138
-
139
- generate_all.click(
140
- fn=generate_audio,
141
- inputs=[project_name, speaker],
142
- outputs=[audio_output, status]
143
- )
144
-
145
- return demo
146
-
147
- if __name__ == "__main__":
148
- interface = TTSInterface()
149
- demo = interface.create_interface()
150
- demo.launch(debug=True)
 
3
  import gradio as gr
4
  from TTS.api import TTS
5
 
6
+ # Initialisation du modèle TTS avec GPU désactivé
7
+ tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
8
+
9
+ # Répertoire de sortie pour tous les fichiers audio
10
+ output_folder = "output_audio"
11
+ os.makedirs(output_folder, exist_ok=True)
12
+
13
+ # Fonction pour générer un fichier audio à partir d'une section
14
+ def generate_section_audio(project_name, section_name, text, speaker):
15
+ try:
16
+ project_path = os.path.join(output_folder, project_name)
17
+ os.makedirs(project_path, exist_ok=True)
18
+
19
+ file_name = f"{section_name}.wav"
20
+ output_path = os.path.join(project_path, file_name)
21
+
22
+ speaker_wav_paths = [os.path.join("examples", f) for f in os.listdir("examples") if f.startswith(speaker) and f.endswith(".wav")]
23
+ if not speaker_wav_paths:
24
+ raise ValueError(f"Aucun fichier audio trouvé pour le speaker : {speaker}")
25
+
26
+ tts.tts_to_file(
27
+ text=text,
28
+ file_path=output_path,
29
+ speaker_wav=speaker_wav_paths,
30
+ language="fr"
31
+ )
32
+
33
+ return output_path
34
+ except Exception as e:
35
+ return str(e)
36
+
37
+ # Fonction pour générer les audios de toutes les sections
38
+ def generate_all_audios(project_name, sections, speaker):
39
+ results = []
40
+ for section in sections:
41
+ name = section["name"]
42
+ text = section["text"]
43
+ audio_path = generate_section_audio(project_name, name, text, speaker)
44
+ results.append(audio_path)
45
+ return results
46
+
47
+ # Interface Gradio
48
+ with gr.Blocks() as demo:
49
+ gr.Markdown("""
50
+ # 🎙️ Synthèse Vocale Margaux
51
+ ## 👋 Bienvenue sur Margaux - Votre outil de synthèse vocale avancée
52
+ Margaux vous permet de générer des voix off naturelles à partir de textes, structurées par sections pour une meilleure qualité audio.
53
+ """)
54
+
55
+ # Étape 1 : Création du Projet
56
+ with gr.Box():
57
+ gr.Markdown("### 🛠️ Étape 1 : Création du Projet")
58
+
59
+ project_name = gr.Textbox(label="Nom du Projet", placeholder="Exemple : Capsule_Video_PLU")
60
+ speaker = gr.Dropdown(label="Voix 🎙️", choices=["Margaux"], value="Margaux")
61
+ agree = gr.Checkbox(label=" J'accepte les conditions d'utilisation")
62
+
63
+ next_step_btn = gr.Button("Suivant ➡️")
64
+
65
+ # Étape 2 : Ajout des Sections
66
+ with gr.Box():
67
+ gr.Markdown("### ✍️ Étape 2 : Ajoutez vos Sections")
68
+
69
+ sections = gr.State(value=[{"name": "Section_1", "text": ""}])
70
+
71
+ section_inputs = gr.Column() # Conteneur pour afficher les sections ajoutées
72
+
73
+ def update_section_list(sections):
74
+ return [gr.Row([
75
+ gr.Textbox(label=f"Nom : {s['name']}", value=s["name"], interactive=False),
76
+ gr.Textbox(label="Texte", value=s["text"], lines=2)
77
+ ]) for s in sections]
78
+
79
+ add_section_btn = gr.Button("+ Ajouter une Section ")
80
+ remove_section_btn = gr.Button("- Supprimer la dernière Section ➖")
81
+
82
+ add_section_btn.click(lambda sections: (sections + [{"name": f"Section_{len(sections) + 1}", "text": ""}], update_section_list(sections)), inputs=sections, outputs=[sections, section_inputs])
83
+
84
+ remove_section_btn.click(lambda sections: (sections[:-1], update_section_list(sections[:-1])) if len(sections) > 1 else (sections, update_section_list(sections)), inputs=sections, outputs=[sections, section_inputs])
85
+
86
+ # Étape 3 : Génération des Audios
87
+ with gr.Box():
88
+ gr.Markdown("### 🎧 Étape 3 : Génération des Audios")
89
+
90
+ generate_btn = gr.Button("Générer les Audios ▶️")
91
+
92
+ results_output = gr.Column() # Conteneur pour afficher les audios générés
93
+
94
+ def generate_audios_and_display(project_name, sections, speaker):
95
+ results = generate_all_audios(project_name, sections, speaker)
96
+ return [gr.Audio(label=f"Audio : {s['name']}", value=path) for s, path in zip(sections, results)]
97
+
98
+ generate_btn.click(generate_audios_and_display,
99
+ inputs=[project_name, sections, speaker],
100
+ outputs=[results_output])
101
+
102
+ # Sauvegarde du Projet
103
+ with gr.Box():
104
+ save_project_btn = gr.Button("Sauvegarder le Projet ✅")
105
+
106
+ def save_project(project_name):
107
+ project_path = os.path.join(output_folder, project_name)
108
+ if not os.path.exists(project_path):
109
+ return "⚠️ Aucun audio généré à sauvegarder."
110
+ return f"🎉 Projet '{project_name}' sauvegardé dans le dossier '{project_path}'."
111
+
112
+ save_project_btn.click(save_project, inputs=[project_name], outputs=[results_output])
113
+
114
+ # Lancement de l'interface
115
+ demo.launch(debug=True)