File size: 6,553 Bytes
a5c86e8
fb0fda6
 
9883968
 
fb0fda6
 
f31c7bc
 
edf2a53
f31c7bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
edf2a53
f31c7bc
9883968
2eba633
 
f31c7bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2eba633
f31c7bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
edf2a53
f31c7bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2eba633
 
f31c7bc
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
import subprocess
import os
import time
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 traiter un projet complet
def process_project(project_name, sections, speaker):
    results = []
    for section in sections:
        section_name, text = section["name"], section["text"]
        result = generate_section_audio(project_name, section_name, text, speaker)
        results.append({"section": section_name, "result": result})
    return results

# Fonction de validation des conditions d'utilisation
def validate_conditions(agree):
    if not agree:
        raise gr.Error("❗ Veuillez accepter les conditions d'utilisation pour continuer.")

# Interface Gradio
with gr.Blocks() as demo:
    # Titre principal
    gr.Markdown("# 🎙️ Synthèse Vocale Margaux")

    # Introduction et explication globale
    gr.Markdown("""
    ## 👋 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. 🔄 **Écoutez et ajustez** : Régénérez les audios si nécessaire, indépendamment des autres.
    5. 📁 **Sauvegardez le projet** : Finalisez et récupérez les fichiers validés.
    """)

    # Étape 1 : Création du Projet
    with gr.Box():
        gr.Markdown("### 🛠️ Étape 1 : Création du Projet")
        gr.Markdown("**📂 Définissez les informations générales pour votre projet.**")
        gr.Markdown("Le nom du projet servira à organiser vos fichiers dans un dossier dédié.")
        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")
        create_project_btn = gr.Button("Créer le Projet 🚀")

    # Étape 2 : Gestion des Sections
    with gr.Box():
        gr.Markdown("### ✍️ Étape 2 : Ajoutez vos Sections")
        gr.Markdown("""
        **📝 Divisez votre script en plusieurs sections pour une meilleure qualité.**  
        Chaque section doit avoir :  
        - Un **nom unique** 🏷️ qui servira à nommer le fichier audio.  
        - Un **texte clair et concis** ✏️.  
        """)
        sections = gr.State([])  # Liste des sections dynamiques
        sections_list = gr.Column()  # Conteneur pour les sections ajoutées dynamiquement
        add_section_btn = gr.Button("+ Ajouter une Section ➕")
        remove_section_btn = gr.Button("- Supprimer la dernière Section ➖")
    
    # Étape 3 : Validation des Sections et Génération des Audios
    with gr.Box():
        gr.Markdown("### 🎧 Étape 3 : Génération des Audios")
        gr.Markdown("""
        **🎶 Générez un fichier audio pour chaque section.**  
        - 🔄 Régénérez l’audio d’une section indépendamment si nécessaire.  
        - ⚠️ En cas d’erreur, seuls les audios de sections valides seront disponibles.  
        """)
        generate_btn = gr.Button("Générer les Audios ▶️")
        results_output = gr.Column()  # Conteneur pour les audios générés
    
    # Étape 4 : Sauvegarde Finale
    with gr.Box():
        gr.Markdown("### 📁 Étape 4 : Sauvegarde Finale")
        gr.Markdown("""
        **💾 Une fois satisfait des résultats :**  
        - Cliquez sur **Sauvegarder** pour conserver uniquement les fichiers validés.  
        - Les fichiers seront organisés dans un dossier au nom de votre projet.  
        """)
        save_project_btn = gr.Button("Sauvegarder le Projet ✅")

    # Actions des Boutons
    def create_project(project_name, speaker, agree):
        validate_conditions(agree)
        os.makedirs(os.path.join(output_folder, project_name), exist_ok=True)
        return f"✅ Projet '{project_name}' créé avec succès !"

    create_project_btn.click(create_project, inputs=[project_name, speaker, agree], outputs=[])

    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 = process_project(project_name, sections, speaker)
        return results

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

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