File size: 5,838 Bytes
a5c86e8
163771f
9883968
 
6bca271
549ef14
f31c7bc
edf2a53
549ef14
f31c7bc
 
 
549ef14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163771f
549ef14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163771f
549ef14
163771f
 
549ef14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc681ea
163771f
549ef14
 
 
 
 
 
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
import subprocess
import os
import gradio as gr
from TTS.api import TTS

# Initialisation du modèle TTS avec GPU désactivé
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)

# Répertoire de sortie pour tous les fichiers audio
output_folder = "output_audio"
os.makedirs(output_folder, exist_ok=True)

# Fonction pour générer un fichier audio à partir d'une section
def generate_section_audio(project_name, section_name, text, speaker):
    try:
        # Création du sous-dossier pour le projet
        project_path = os.path.join(output_folder, project_name)
        os.makedirs(project_path, exist_ok=True)

        # Définir le chemin de sortie pour cette section
        file_name = f"{section_name}.wav"
        output_path = os.path.join(project_path, file_name)

        # Vérifier la disponibilité des fichiers audio pour le speaker
        speaker_wav_paths = [os.path.join("examples", f) for f in os.listdir("examples") if f.startswith(speaker) and f.endswith(".wav")]
        if not speaker_wav_paths:
            raise ValueError(f"Aucun fichier audio trouvé pour le speaker : {speaker}")

        # Génération de l'audio
        tts.tts_to_file(
            text=text,
            file_path=output_path,
            speaker_wav=speaker_wav_paths,
            language="fr"
        )

        return output_path  # Retourne le chemin de l'audio généré
    except Exception as e:
        return str(e)  # Retourne l'erreur pour gestion dans l'interface

# Fonction pour gérer la visibilité des étapes
def update_steps(current_step, target_step):
    return {"visible": target_step == 1}, {"visible": target_step == 2}, {"visible": target_step == 3}

# Interface Gradio
with gr.Blocks() as demo:
    # État global pour gérer les sections
    sections = gr.State(value=[])

    # Introduction générale
    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, chacune avec un nom unique.
    3. 🎧 **Générer les audios** : Chaque section est transformée en fichier audio individuel.
    4. 📁 **Sauvegardez le projet** : Finalisez et récupérez les fichiers validés.
    """)

    # Étape 1 : Création du Projet
    with gr.Row(visible=True) as step1:
        gr.Markdown("### 🛠️ Étape 1 : Création du Projet")
        project_name = gr.Textbox(label="Nom du Projet", placeholder="Exemple : Capsule_Video_PLU")
        speaker = gr.Dropdown(label="Voix 🎙️", choices=["Margaux"], value="Margaux")  # Liste de voix
        agree = gr.Checkbox(label="✅ J'accepte les conditions d'utilisation")
        project_message = gr.Markdown(value="", visible=False)  # Composant pour afficher les messages
        next_btn_1 = gr.Button("Suivant ➡️")

    # Étape 2 : Gestion des Sections
    with gr.Row(visible=False) as step2:
        gr.Markdown("### ✍️ Étape 2 : Ajoutez vos Sections")
        sections_list = gr.Column()  # Conteneur pour afficher les sections ajoutées
        add_section_btn = gr.Button("+ Ajouter une Section ➕")
        remove_section_btn = gr.Button("- Supprimer la dernière Section ➖")
        prev_btn_2 = gr.Button("⬅️ Précédent")
        next_btn_2 = gr.Button("Suivant ➡️")

    # Étape 3 : Génération des Audios
    with gr.Row(visible=False) as step3:
        gr.Markdown("### 🎧 Étape 3 : Génération des Audios")
        results_output = gr.Column()  # Conteneur pour afficher les résultats
        generate_btn = gr.Button("Générer les Audios ▶️")
        prev_btn_3 = gr.Button("⬅️ Précédent")
        save_project_btn = gr.Button("Sauvegarder le Projet ✅")

    # Actions des Boutons
    def create_project(project_name, speaker, agree):
        if not agree:
            return "❗ Veuillez accepter les conditions d'utilisation.", False, False
        if not project_name:
            return "❗ Le nom du projet est obligatoire.", False, False
        os.makedirs(os.path.join(output_folder, project_name), exist_ok=True)
        return f"✅ Projet '{project_name}' créé avec succès !", True, False

    next_btn_1.click(
        create_project,
        inputs=[project_name, speaker, agree],
        outputs=[project_message, step1, step2],
    )

    def add_section(sections):
        section = {"name": f"Section_{len(sections) + 1}", "text": ""}
        sections.append(section)
        return sections

    add_section_btn.click(add_section, inputs=[sections], outputs=[sections_list])

    def remove_section(sections):
        if sections:
            sections.pop()
        return sections

    remove_section_btn.click(remove_section, inputs=[sections], outputs=[sections_list])

    def generate_audios(project_name, sections, speaker):
        results = []
        for section in sections:
            name = section["name"]
            text = section["text"]
            audio_path = generate_section_audio(project_name, name, text, speaker)
            results.append(audio_path)
        return results

    generate_btn.click(
        generate_audios,
        inputs=[project_name, sections, speaker],
        outputs=[results_output],
    )

    prev_btn_2.click(lambda: (True, False), inputs=None, outputs=[step1, step2])
    next_btn_2.click(lambda: (False, True), inputs=None, outputs=[step2, step3])
    prev_btn_3.click(lambda: (True, False), inputs=None, outputs=[step2, step3])

# Lancement de l'interface
demo.launch(debug=True)