Blakus commited on
Commit
f0b296c
·
verified ·
1 Parent(s): d2819b7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -4
app.py CHANGED
@@ -7,6 +7,8 @@ import scipy.io.wavfile as wavfile
7
  import torch
8
  import torchaudio
9
  import gradio as gr
 
 
10
  from TTS.api import TTS
11
  from TTS.tts.configs.xtts_config import XttsConfig
12
  from TTS.tts.models.xtts import Xtts
@@ -23,6 +25,9 @@ def check_and_install(package):
23
  print(f"{package} no está instalado. Instalando...")
24
  subprocess.check_call([sys.executable, "-m", "pip", "install", package])
25
 
 
 
 
26
  print("Descargando y configurando el modelo...")
27
  repo_id = "Blakus/Pedro_Lab_XTTS"
28
  local_dir = os.path.join(get_user_data_dir("tts"), "tts_models--multilingual--multi-dataset--xtts_v2")
@@ -47,7 +52,22 @@ model.cuda()
47
 
48
  print("Modelo cargado en GPU")
49
 
50
- def predict(prompt, language, reference_audio, speed):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  try:
52
  if len(prompt) < 2 or len(prompt) > 600:
53
  return None, "El texto debe tener entre 2 y 600 caracteres."
@@ -84,9 +104,12 @@ def predict(prompt, language, reference_audio, speed):
84
 
85
  output_path = "pedro_labattaglia_TTS.wav"
86
  # Guardar el audio directamente desde el output del modelo
87
- import scipy.io.wavfile as wavfile
88
  wavfile.write(output_path, config.audio["output_sample_rate"], out["wav"])
89
 
 
 
 
 
90
  audio_length = len(out["wav"]) / config.audio["output_sample_rate"] # duración del audio en segundos
91
  real_time_factor = inference_time / audio_length
92
 
@@ -123,6 +146,7 @@ Sintetizador de voz con la voz del locutor argentino Pedro Labattaglia.
123
  - Elija el idioma (Español o Inglés)
124
  - Elija un audio de referencia de la lista
125
  - Ajuste la velocidad del habla si lo desea
 
126
  - Escriba el texto que desea sintetizar
127
  - Presione generar voz
128
  """
@@ -142,12 +166,13 @@ with gr.Blocks(theme=theme) as demo:
142
  elem_id="image-container"
143
  )
144
 
145
- # Fila para seleccionar idioma, referencia, velocidad y generar voz
146
  with gr.Row():
147
  with gr.Column(scale=2):
148
  language_selector = gr.Dropdown(label="Idioma", choices=supported_languages)
149
  reference_audio = gr.Dropdown(label="Audio de referencia", choices=reference_audios)
150
  speed_slider = gr.Slider(minimum=0.5, maximum=2.0, value=1.0, step=0.1, label="Velocidad del habla")
 
151
  input_text = gr.Textbox(label="Texto a sintetizar", placeholder="Escribe aquí el texto que quieres convertir a voz...")
152
  generate_button = gr.Button("Generar voz", variant="primary")
153
 
@@ -158,7 +183,7 @@ with gr.Blocks(theme=theme) as demo:
158
  # Configuración del botón para generar voz
159
  generate_button.click(
160
  predict,
161
- inputs=[input_text, language_selector, reference_audio, speed_slider],
162
  outputs=[generated_audio, metrics_output]
163
  )
164
 
 
7
  import torch
8
  import torchaudio
9
  import gradio as gr
10
+ import numpy as np
11
+ import parselmouth
12
  from TTS.api import TTS
13
  from TTS.tts.configs.xtts_config import XttsConfig
14
  from TTS.tts.models.xtts import Xtts
 
25
  print(f"{package} no está instalado. Instalando...")
26
  subprocess.check_call([sys.executable, "-m", "pip", "install", package])
27
 
28
+ # Check and install parselmouth
29
+ check_and_install("parselmouth")
30
+
31
  print("Descargando y configurando el modelo...")
32
  repo_id = "Blakus/Pedro_Lab_XTTS"
33
  local_dir = os.path.join(get_user_data_dir("tts"), "tts_models--multilingual--multi-dataset--xtts_v2")
 
52
 
53
  print("Modelo cargado en GPU")
54
 
55
+ def adjust_pitch(audio_path, pitch_factor):
56
+ sound = parselmouth.Sound(audio_path)
57
+ manipulation = parselmouth.praat.call(sound, "To Manipulation", 0.01, 75, 600)
58
+
59
+ pitch_tier = parselmouth.praat.call(manipulation, "Extract pitch tier")
60
+
61
+ parselmouth.praat.call(pitch_tier, "Multiply frequencies", sound.xmin, sound.xmax, pitch_factor)
62
+
63
+ parselmouth.praat.call([pitch_tier, manipulation], "Replace pitch tier")
64
+ new_sound = parselmouth.praat.call(manipulation, "Get resynthesis (overlap-add)")
65
+
66
+ output_path = "pitch_adjusted_output.wav"
67
+ new_sound.save(output_path, parselmouth.SoundFileFormat.WAV)
68
+ return output_path
69
+
70
+ def predict(prompt, language, reference_audio, speed, pitch_factor):
71
  try:
72
  if len(prompt) < 2 or len(prompt) > 600:
73
  return None, "El texto debe tener entre 2 y 600 caracteres."
 
104
 
105
  output_path = "pedro_labattaglia_TTS.wav"
106
  # Guardar el audio directamente desde el output del modelo
 
107
  wavfile.write(output_path, config.audio["output_sample_rate"], out["wav"])
108
 
109
+ # Adjust pitch
110
+ if pitch_factor != 1.0:
111
+ output_path = adjust_pitch(output_path, pitch_factor)
112
+
113
  audio_length = len(out["wav"]) / config.audio["output_sample_rate"] # duración del audio en segundos
114
  real_time_factor = inference_time / audio_length
115
 
 
146
  - Elija el idioma (Español o Inglés)
147
  - Elija un audio de referencia de la lista
148
  - Ajuste la velocidad del habla si lo desea
149
+ - Ajuste el pitch de la voz si lo desea
150
  - Escriba el texto que desea sintetizar
151
  - Presione generar voz
152
  """
 
166
  elem_id="image-container"
167
  )
168
 
169
+ # Fila para seleccionar idioma, referencia, velocidad, pitch y generar voz
170
  with gr.Row():
171
  with gr.Column(scale=2):
172
  language_selector = gr.Dropdown(label="Idioma", choices=supported_languages)
173
  reference_audio = gr.Dropdown(label="Audio de referencia", choices=reference_audios)
174
  speed_slider = gr.Slider(minimum=0.5, maximum=2.0, value=1.0, step=0.1, label="Velocidad del habla")
175
+ pitch_slider = gr.Slider(minimum=0.5, maximum=2.0, value=1.0, step=0.1, label="Ajuste de pitch")
176
  input_text = gr.Textbox(label="Texto a sintetizar", placeholder="Escribe aquí el texto que quieres convertir a voz...")
177
  generate_button = gr.Button("Generar voz", variant="primary")
178
 
 
183
  # Configuración del botón para generar voz
184
  generate_button.click(
185
  predict,
186
+ inputs=[input_text, language_selector, reference_audio, speed_slider, pitch_slider],
187
  outputs=[generated_audio, metrics_output]
188
  )
189