xTTS-fr-cpu / app.py
Woziii's picture
Update app.py
0d2ec67 verified
raw
history blame
6.16 kB
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)