Spaces:
Running
Running
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) |