alex16052G commited on
Commit
6afdbbb
verified
1 Parent(s): 20e68c3

Update chat_ai.py

Browse files
Files changed (1) hide show
  1. chat_ai.py +131 -59
chat_ai.py CHANGED
@@ -1,10 +1,30 @@
1
- import gradio as gr
2
  import tempfile
 
 
3
  import numpy as np
4
- import torchaudio
5
  import soundfile as sf
6
- from transformers import AutoTokenizer
7
- from f5_tts.model import DiT
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  from f5_tts.infer.utils_infer import (
9
  load_vocoder,
10
  load_model,
@@ -13,18 +33,43 @@ from f5_tts.infer.utils_infer import (
13
  remove_silence_for_generated_wav,
14
  save_spectrogram,
15
  )
16
- from num2words import num2words
17
- import re
18
 
19
- # Cargar vocoder y modelo
20
  vocoder = load_vocoder()
 
 
21
  F5TTS_model_cfg = dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=512, conv_layers=4)
22
  F5TTS_ema_model = load_model(
23
- DiT, F5TTS_model_cfg, "hf://jpgallegoar/F5-Spanish/model_1200000.safetensors"
24
  )
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  def traducir_numero_a_texto(texto):
27
- """Convierte n煤meros a palabras en el texto."""
28
  texto_separado = re.sub(r'([A-Za-z])(\d)', r'\1 \2', texto)
29
  texto_separado = re.sub(r'(\d)([A-Za-z])', r'\1 \2', texto_separado)
30
 
@@ -36,24 +81,36 @@ def traducir_numero_a_texto(texto):
36
 
37
  return texto_traducido
38
 
 
 
39
  def infer(
40
- ref_audio_orig, ref_text, gen_text, remove_silence=False, cross_fade_duration=0.15, speed=1.0
41
  ):
42
- """Realiza la inferencia para convertir texto en voz."""
43
- ref_audio, ref_text = preprocess_ref_audio_text(ref_audio_orig, ref_text)
 
 
 
 
 
 
44
 
45
- gen_text = traducir_numero_a_texto(gen_text.lower())
 
46
 
47
  final_wave, final_sample_rate, combined_spectrogram = infer_process(
48
  ref_audio,
49
  ref_text,
50
  gen_text,
51
- F5TTS_ema_model,
52
  vocoder,
53
  cross_fade_duration=cross_fade_duration,
54
  speed=speed,
 
 
55
  )
56
 
 
57
  if remove_silence:
58
  with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as f:
59
  sf.write(f.name, final_wave, final_sample_rate)
@@ -68,57 +125,72 @@ def infer(
68
 
69
  return (final_sample_rate, final_wave), spectrogram_path
70
 
71
- def tts_pipeline(ref_audio, ref_text, gen_text, remove_silence, speed):
72
- """Pipeline para la interfaz de Gradio."""
73
- if not ref_audio:
74
- return None, "Por favor sube un audio de referencia."
75
 
76
- try:
77
- (sample_rate, audio), spectrogram_path = infer(
78
- ref_audio, ref_text, gen_text, remove_silence=remove_silence, speed=speed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  )
80
- with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp_audio:
81
- sf.write(tmp_audio.name, audio, sample_rate)
82
- return tmp_audio.name, spectrogram_path
83
- except Exception as e:
84
- return None, f"Error al generar audio: {str(e)}"
85
-
86
- # Crear interfaz con Gradio
87
- with gr.Blocks() as demo:
88
- gr.Markdown("""# Conversi贸n de Texto a Voz (TTS) en Espa帽ol
89
-
90
- Convierte texto en audio en espa帽ol usando un modelo de TTS. Proporciona un audio de referencia y el texto a convertir.
91
-
92
- **Instrucciones:**
93
- 1. Sube un audio de referencia (formato WAV o MP3, de 11 a 14 segundos).
94
- 2. Opcionalmente, ingresa el texto correspondiente al audio de referencia.
95
- 3. Escribe el texto que deseas convertir a voz.
96
- 4. Haz clic en "Generar Audio".
97
-
98
- *Nota: Los n煤meros en el texto ser谩n convertidos autom谩ticamente a palabras.*
99
- """)
100
-
101
- with gr.Row():
102
- ref_audio = gr.Audio(label="Audio de Referencia", type="filepath")
103
- ref_text = gr.Textbox(label="Texto de Referencia (Opcional)", placeholder="Transcripci贸n del audio de referencia")
104
 
105
- gen_text = gr.Textbox(label="Texto para Convertir a Voz", lines=4, placeholder="Escribe aqu铆 el texto a convertir")
 
106
 
107
- with gr.Row():
108
- remove_silence = gr.Checkbox(label="Eliminar Silencios", value=False)
109
- speed = gr.Slider(label="Velocidad", minimum=0.5, maximum=2.0, value=1.0, step=0.1)
 
 
 
 
 
 
 
 
 
 
110
 
111
- generate_btn = gr.Button("Generar Audio")
112
 
113
- with gr.Row():
114
- audio_output = gr.Audio(label="Audio Generado", type="filepath")
115
- spectrogram_output = gr.Image(label="Espectrograma")
 
116
 
117
- generate_btn.click(
118
- tts_pipeline,
119
- inputs=[ref_audio, ref_text, gen_text, remove_silence, speed],
120
- outputs=[audio_output, spectrogram_output],
121
  )
 
 
 
 
 
122
 
123
- # Ejecutar la aplicaci贸n en Spaces
124
- demo.launch()
 
1
+ import re
2
  import tempfile
3
+
4
+ import gradio as gr
5
  import numpy as np
 
6
  import soundfile as sf
7
+ import torchaudio
8
+ from cached_path import cached_path
9
+ from transformers import AutoModelForCausalLM, AutoTokenizer
10
+ from num2words import num2words
11
+
12
+ try:
13
+ import spaces
14
+
15
+ USING_SPACES = True
16
+ except ImportError:
17
+ USING_SPACES = False
18
+
19
+
20
+ def gpu_decorator(func):
21
+ if USING_SPACES:
22
+ return spaces.GPU(func)
23
+ else:
24
+ return func
25
+
26
+
27
+ from f5_tts.model import DiT, UNetT
28
  from f5_tts.infer.utils_infer import (
29
  load_vocoder,
30
  load_model,
 
33
  remove_silence_for_generated_wav,
34
  save_spectrogram,
35
  )
 
 
36
 
 
37
  vocoder = load_vocoder()
38
+
39
+ # Cargar modelos
40
  F5TTS_model_cfg = dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=512, conv_layers=4)
41
  F5TTS_ema_model = load_model(
42
+ DiT, F5TTS_model_cfg, str(cached_path("hf://jpgallegoar/F5-Spanish/model_1200000.safetensors"))
43
  )
44
 
45
+ chat_model_state = None
46
+ chat_tokenizer_state = None
47
+
48
+
49
+ @gpu_decorator
50
+ def generate_response(messages, model, tokenizer):
51
+ """Generar respuesta usando Qwen."""
52
+ text = tokenizer.apply_chat_template(
53
+ messages,
54
+ tokenize=False,
55
+ add_generation_prompt=True,
56
+ )
57
+
58
+ model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
59
+ generated_ids = model.generate(
60
+ **model_inputs,
61
+ max_new_tokens=512,
62
+ temperature=0.7,
63
+ top_p=0.95,
64
+ )
65
+
66
+ generated_ids = [
67
+ output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
68
+ ]
69
+ return tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
70
+
71
+
72
  def traducir_numero_a_texto(texto):
 
73
  texto_separado = re.sub(r'([A-Za-z])(\d)', r'\1 \2', texto)
74
  texto_separado = re.sub(r'(\d)([A-Za-z])', r'\1 \2', texto_separado)
75
 
 
81
 
82
  return texto_traducido
83
 
84
+
85
+ @gpu_decorator
86
  def infer(
87
+ ref_audio_orig, ref_text, gen_text, model, remove_silence, cross_fade_duration=0.15, speed=1, show_info=gr.Info
88
  ):
89
+ ref_audio, ref_text = preprocess_ref_audio_text(ref_audio_orig, ref_text, show_info=show_info)
90
+
91
+ ema_model = F5TTS_ema_model
92
+
93
+ if not gen_text.startswith(" "):
94
+ gen_text = " " + gen_text
95
+ if not gen_text.endswith(". "):
96
+ gen_text += ". "
97
 
98
+ gen_text = gen_text.lower()
99
+ gen_text = traducir_numero_a_texto(gen_text)
100
 
101
  final_wave, final_sample_rate, combined_spectrogram = infer_process(
102
  ref_audio,
103
  ref_text,
104
  gen_text,
105
+ ema_model,
106
  vocoder,
107
  cross_fade_duration=cross_fade_duration,
108
  speed=speed,
109
+ show_info=show_info,
110
+ progress=gr.Progress(),
111
  )
112
 
113
+ # Remover silencios
114
  if remove_silence:
115
  with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as f:
116
  sf.write(f.name, final_wave, final_sample_rate)
 
125
 
126
  return (final_sample_rate, final_wave), spectrogram_path
127
 
 
 
 
 
128
 
129
+ with gr.Blocks() as app_tts:
130
+ gr.Markdown("# TTS por Lotes")
131
+ ref_audio_input = gr.Audio(label="Audio de Referencia", type="filepath")
132
+ gen_text_input = gr.Textbox(label="Texto para Generar", lines=10)
133
+ model_choice = gr.Radio(choices=["F5-TTS"], label="Seleccionar Modelo TTS", value="F5-TTS")
134
+ generate_btn = gr.Button("Sintetizar", variant="primary")
135
+ with gr.Accordion("Configuraciones Avanzadas", open=False):
136
+ ref_text_input = gr.Textbox(
137
+ label="Texto de Referencia",
138
+ info="Deja en blanco para transcribir autom谩ticamente el audio de referencia. Si ingresas texto, sobrescribir谩 la transcripci贸n autom谩tica.",
139
+ lines=2,
140
+ )
141
+ remove_silence = gr.Checkbox(
142
+ label="Eliminar Silencios",
143
+ info="El modelo tiende a producir silencios, especialmente en audios m谩s largos. Podemos eliminar manualmente los silencios si es necesario. Ten en cuenta que esta es una caracter铆stica experimental y puede producir resultados extra帽os. Esto tambi茅n aumentar谩 el tiempo de generaci贸n.",
144
+ value=False,
145
+ )
146
+ speed_slider = gr.Slider(
147
+ label="Velocidad",
148
+ minimum=0.3,
149
+ maximum=2.0,
150
+ value=1.0,
151
+ step=0.1,
152
+ info="Ajusta la velocidad del audio.",
153
+ )
154
+ cross_fade_duration_slider = gr.Slider(
155
+ label="Duraci贸n del Cross-Fade (s)",
156
+ minimum=0.0,
157
+ maximum=1.0,
158
+ value=0.15,
159
+ step=0.01,
160
+ info="Establece la duraci贸n del cross-fade entre clips de audio.",
161
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
 
163
+ audio_output = gr.Audio(label="Audio Sintetizado")
164
+ spectrogram_output = gr.Image(label="Espectrograma")
165
 
166
+ generate_btn.click(
167
+ infer,
168
+ inputs=[
169
+ ref_audio_input,
170
+ ref_text_input,
171
+ gen_text_input,
172
+ model_choice,
173
+ remove_silence,
174
+ cross_fade_duration_slider,
175
+ speed_slider,
176
+ ],
177
+ outputs=[audio_output, spectrogram_output],
178
+ )
179
 
 
180
 
181
+ with gr.Blocks() as app:
182
+ gr.Markdown(
183
+ """
184
+ # Spanish-F5
185
 
186
+ Esta es una interfaz web para F5 TTS, con un finetuning para poder hablar en castellano.
187
+ """
 
 
188
  )
189
+ gr.TabbedInterface(
190
+ [app_tts],
191
+ ["TTS"],
192
+ )
193
+
194
 
195
+ if __name__ == "__main__":
196
+ app.queue().launch()