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