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