File size: 6,162 Bytes
a5c86e8
163771f
9883968
 
6bca271
e7eb556
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d2ec67
e7eb556
 
 
 
 
 
0d2ec67
 
 
 
 
 
 
e7eb556
 
 
 
 
 
 
 
 
 
0d2ec67
 
e7eb556
 
 
 
0d2ec67
e7eb556
0d2ec67
 
e7eb556
0d2ec67
 
 
 
 
e7eb556
0d2ec67
 
 
 
e7eb556
0d2ec67
e7eb556
0d2ec67
 
 
 
e7eb556
0d2ec67
e7eb556
0d2ec67
e7eb556
 
 
 
0d2ec67
e7eb556
0d2ec67
e7eb556
 
 
0d2ec67
e7eb556
0d2ec67
e7eb556
 
 
0d2ec67
 
 
e7eb556
 
 
0d2ec67
 
 
e7eb556
 
 
0d2ec67
 
 
e7eb556
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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)