Download app.py from igna7/tts: direct link, hf CLI and curl.
- Browser
- Download file 2.86 kB
-
https://huggingface.co/spaces/igna7/tts/resolve/main/app.py
- Command line
-
hf download hf://spaces/igna7/tts/app.py
-
curl -L -o app.py https://huggingface.co/spaces/igna7/tts/resolve/main/app.py
2.86 kB
| """ | |
| Espacio de Hugging Face: Text-to-Speech (MMS-TTS) | |
| ================================================== | |
| Modelo: facebook/mms-tts-spa | |
| Entrada: Texto en español | |
| Salida: Audio WAV | |
| """ | |
| import gradio as gr | |
| import numpy as np | |
| import tempfile | |
| import os | |
| from transformers import pipeline | |
| class TTSService: | |
| def __init__(self): | |
| print("Cargando modelo TTS (facebook/mms-tts-spa)...") | |
| self.synthesizer = pipeline( | |
| "text-to-speech", | |
| model="facebook/mms-tts-spa", | |
| device=-1, # CPU | |
| ) | |
| print("Modelo TTS cargado correctamente.") | |
| def synthesize(self, text: str) -> str: | |
| """Genera audio a partir del texto y devuelve la ruta del archivo.""" | |
| output = self.synthesizer(text) | |
| if isinstance(output, list): | |
| output = output[0] | |
| waveform = np.asarray(output["audio"]) | |
| sampling_rate = int(output["sampling_rate"]) | |
| # Normalizar forma del audio | |
| if waveform.ndim == 2: | |
| if waveform.shape[0] <= 8 and waveform.shape[1] > waveform.shape[0]: | |
| waveform = waveform.T | |
| if waveform.shape[1] == 1: | |
| waveform = waveform[:, 0] | |
| # Convertir a int16 | |
| if waveform.dtype.kind == "f": | |
| waveform = np.clip(waveform, -1.0, 1.0) | |
| waveform_int16 = (waveform * 32767).astype(np.int16) | |
| else: | |
| waveform_int16 = waveform.astype(np.int16) | |
| # Guardar como WAV temporal | |
| import scipy.io.wavfile | |
| temp_file = tempfile.NamedTemporaryFile(suffix=".wav", delete=False) | |
| scipy.io.wavfile.write(temp_file.name, sampling_rate, waveform_int16) | |
| return temp_file.name | |
| # Inicializar servicio | |
| print("Inicializando servicio TTS...") | |
| service = TTSService() | |
| print("Servicio listo.") | |
| def texto_a_voz(texto: str) -> str: | |
| """Función principal para Gradio.""" | |
| if not texto or not texto.strip(): | |
| return None | |
| try: | |
| audio_path = service.synthesize(texto) | |
| return audio_path | |
| except Exception as e: | |
| print(f"Error: {e}") | |
| return None | |
| # Interfaz Gradio | |
| iface = gr.Interface( | |
| fn=texto_a_voz, | |
| inputs=gr.Textbox( | |
| lines=5, | |
| placeholder="Escribe el texto que quieres escuchar...", | |
| label="Texto" | |
| ), | |
| outputs=gr.Audio(label="Audio Generado", type="filepath"), | |
| title="🔊 Text-to-Speech (MMS-TTS)", | |
| description="Convierte texto en español a voz usando el modelo MMS-TTS de Facebook.", | |
| examples=[ | |
| ["Hola, esto es una prueba del sistema de texto a voz."], | |
| ["La inteligencia artificial está revolucionando el mundo."] | |
| ], | |
| flagging_mode="never", | |
| ) | |
| if __name__ == "__main__": | |
| iface.launch() | |