Woziii commited on
Commit
fb0fda6
·
verified ·
1 Parent(s): af5d148

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -18
app.py CHANGED
@@ -8,27 +8,143 @@ except subprocess.CalledProcessError as e:
8
  print(f"Installation failed with error: {e}")
9
 
10
  import gradio as gr
11
- import torch
12
  from TTS.api import TTS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- # Get device
15
- device = "cuda" if torch.cuda.is_available() else "cpu"
 
 
 
16
 
17
- # Init TTS
18
- tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)
 
 
 
 
19
 
20
- def voice_clone(text: str, speaker_wav: str, language: str):
21
- # Run TTS
22
- print("Speaker wav:", speaker_wav)
23
- tts.tts_to_file(text=text, speaker_wav=speaker_wav, language=language, file_path="output.wav")
24
- return "output.wav"
25
 
26
- iface = gr.Interface(fn=voice_clone, theme="Nymbo/Nymbo_Theme",
27
- inputs=[gr.Textbox(lines=2, placeholder="Enter the text...", label="Text"),
28
- gr.Audio(type="filepath", label="Upload audio file"),
29
- gr.Radio(['ru', 'en', 'zh-cn', 'ja', 'de', 'fr', 'it', 'pt', 'pl', 'tr', 'ko', 'nl', 'cs', 'ar', 'es', 'hu'], label="language"),
30
- ],
31
- outputs=gr.Audio(type="filepath", label="Generated audio file"),
32
- title="Voice Cloning")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
- iface.launch()
 
8
  print(f"Installation failed with error: {e}")
9
 
10
  import gradio as gr
 
11
  from TTS.api import TTS
12
+ import os
13
+ import time
14
+ import torch
15
+ from torch.serialization import add_safe_globals
16
+ from TTS.tts.configs.xtts_config import XttsConfig
17
+
18
+ # Ajouter XttsConfig comme "safe global" pour éviter les erreurs de désérialisation
19
+ add_safe_globals([XttsConfig])
20
+
21
+ # Charger le modèle XTTS
22
+ tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
23
+
24
+ # Créer le dossier de sortie
25
+ output_folder = "output_audio"
26
+ os.makedirs(output_folder, exist_ok=True)
27
+
28
+ def predict(prompt, speaker, agree, subfolder_name, file_name):
29
+ if not agree:
30
+ raise gr.Error("Veuillez accepter les conditions d'utilisation.")
31
+
32
+ # Utiliser le nom fourni pour le sous-dossier ou en générer un par défaut
33
+ subfolder_name = subfolder_name.strip() or f"session_{int(time.time())}"
34
+ session_folder = os.path.join(output_folder, subfolder_name)
35
+ os.makedirs(session_folder, exist_ok=True)
36
+
37
+ # Utiliser le nom fourni pour le fichier ou un nom par défaut
38
+ file_name = file_name.strip() or "output.wav"
39
+ if not file_name.endswith(".wav"):
40
+ file_name += ".wav"
41
+
42
+ output_path = os.path.join(session_folder, file_name)
43
+
44
+ # Charger tous les fichiers WAV du speaker sélectionné
45
+ speaker_wav_paths = [os.path.join("examples", f) for f in os.listdir("examples") if f.startswith(speaker) and f.endswith(".wav")]
46
+
47
+ if not speaker_wav_paths:
48
+ raise gr.Error(f"Aucun fichier audio trouvé pour le speaker : {speaker}")
49
+
50
+ # Synthèse vocale
51
+ tts.tts_to_file(
52
+ text=prompt,
53
+ file_path=output_path,
54
+ speaker_wav=speaker_wav_paths, # Liste de fichiers .wav
55
+ language="fr",
56
+ split_sentences=False # Désactiver si le texte est court
57
+ )
58
+
59
+ # Générer une forme d'onde à partir de l'audio
60
+ waveform = gr.make_waveform(audio=output_path)
61
+
62
+ return 100, waveform, output_path
63
+
64
+ # Interface utilisateur
65
+ custom_css = """
66
+ .gradio-container {
67
+ font-family: 'Arial', sans-serif;
68
+ background-color: #f0f4f8;
69
+ }
70
+ .gr-form {
71
+ background-color: white;
72
+ border-radius: 10px;
73
+ padding: 20px;
74
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
75
+ }
76
+ .gr-button {
77
+ background-color: #4a90e2;
78
+ border: none;
79
+ }
80
+ .gr-button:hover {
81
+ background-color: #3a7bc8;
82
+ }
83
+ """
84
+
85
+ title = "Synthèse Vocale XTTS 🎙️"
86
 
87
+ description = """
88
+ <h3>Bienvenue sur notre outil de synthèse vocale XTTS !</h3>
89
+ <p>Cet outil vous permet de générer une voix naturelle à partir d'un texte en français.
90
+ Choisissez une voix, entrez votre texte, et écoutez le résultat !</p>
91
+ """
92
 
93
+ article = """
94
+ <div style='margin:20px auto; text-align: center;'>
95
+ <p>En utilisant cette démo, vous acceptez les conditions d'utilisation du modèle Coqui Public disponibles sur
96
+ <a href='https://coqui.ai/cpml' target='_blank'>https://coqui.ai/cpml</a></p>
97
+ </div>
98
+ """
99
 
100
+ # Générer la liste des speakers à partir des fichiers WAV dans le dossier examples
101
+ available_speakers = list(set([f.split('_')[0] for f in os.listdir("examples") if f.endswith(".wav")]))
 
 
 
102
 
103
+ with gr.Blocks(css=custom_css) as demo:
104
+ gr.Markdown(f"<h1 style='text-align: center;'>{title}</h1>")
105
+ gr.Markdown(description)
106
+
107
+ with gr.Row():
108
+ with gr.Column(scale=2):
109
+ prompt = gr.Textbox(
110
+ label="Texte pour la synthèse vocale",
111
+ info="Une ou deux phrases à la fois sont préférables* (max : 10)",
112
+ placeholder="Bonjour ! Comment allez-vous aujourd'hui ?",
113
+ lines=10
114
+ )
115
+ with gr.Column(scale=1):
116
+ speaker = gr.Dropdown(
117
+ label="Voix",
118
+ choices=available_speakers,
119
+ value=available_speakers[0] if available_speakers else None
120
+ )
121
+ agree = gr.Checkbox(
122
+ label="J'accepte les conditions d'utilisation",
123
+ value=False
124
+ )
125
+ subfolder_name = gr.Textbox(
126
+ label="Nom du sous-dossier (facultatif)",
127
+ placeholder="Nom du sous-dossier pour stocker l'audio"
128
+ )
129
+ file_name = gr.Textbox(
130
+ label="Nom du fichier (facultatif)",
131
+ placeholder="Nom du fichier audio généré"
132
+ )
133
+
134
+ generate_btn = gr.Button("Générer la voix", variant="primary")
135
+
136
+ progress = gr.Progress()
137
+
138
+ with gr.Row():
139
+ audio_output = gr.Audio(label="Audio généré")
140
+ waveform_output = gr.Video(label="Forme d'onde")
141
+
142
+ generate_btn.click(
143
+ predict,
144
+ inputs=[prompt, speaker, agree, subfolder_name, file_name],
145
+ outputs=[progress, waveform_output, audio_output]
146
+ )
147
+
148
+ gr.Markdown(article)
149
 
150
+ demo.launch(debug=True)