Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from kokoro import KPipeline | |
| import numpy as np | |
| import torch | |
| import os | |
| # Detectar hardware | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| # Inicializar pipeline - 'e' para español | |
| pipeline = KPipeline(lang_code='e', device=device) | |
| # Lista COMPLETA de voces del Space original | |
| VOICES = [ | |
| "af_alloy.pt", "af_aoede.pt", "af_bella.pt", "af_heart.pt", "af_jessica.pt", | |
| "af_kore.pt", "af_nicole.pt", "af_nova.pt", "af_river.pt", "af_sarah.pt", | |
| "af_sky.pt", "am_adam.pt", "am_echo.pt", "am_eric.pt", "am_fenrir.pt", | |
| "am_liam.pt", "am_michael.pt", "am_onyx.pt", "am_puck.pt", "bf_alice.pt", | |
| "bf_isabella.pt", "bf_lily.pt", "bm_daniel.pt", "bm_fable.pt", "bm_george.pt", | |
| "bm_lewis.pt", "ef_dora.pt", "em_alex.pt", "em_santa.pt", "ff_siwis.pt", | |
| "hf_alpha.pt", "hf_beta.pt", "hm_omega.pt", "hm_psi.pt", "if_sara.pt", | |
| "im_nicola.pt", "jf_alpha.pt", "jf_gongitsune.pt", "jf_nezumi.pt", | |
| "jf_tebukuro.pt", "jm_kumo.pt", "pf_dora.pt", "pm_alex.pt", "pm_santa.pt", | |
| "zf_xiaobei.pt", "zf_xiaoni.pt", "zf_xiaoyi.pt", "zm_yunjian.pt", | |
| "zm_yunxi.pt", "zm_yunxia.pt", "zm_yunyang.pt" | |
| ] | |
| def tts_pro(text, voice_name): | |
| if not text or not text.strip(): | |
| return None | |
| try: | |
| # Verificar si el archivo de voz existe | |
| voice_path = f"voices/{voice_name}" | |
| # Si no está en voices/, buscar en el directorio actual | |
| if not os.path.exists(voice_path): | |
| voice_path = voice_name | |
| print(f"Usando voz: {voice_path}") | |
| # Generar audio - pasar la ruta del archivo .pt como voz | |
| generator = pipeline(text, voice=voice_path, speed=1.0) | |
| audio_segments = [] | |
| for _, _, audio in generator: | |
| audio_segments.append(audio) | |
| if not audio_segments: | |
| return None | |
| # Concatenar audio | |
| final_audio = np.concatenate(audio_segments) | |
| return (24000, final_audio) | |
| except Exception as e: | |
| print(f"Error en la generación: {e}") | |
| return None | |
| # Crear la interfaz | |
| with gr.Blocks(title="Kokoro TTS - Aliah Plus", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🎤 Kokoro TTS v1.0") | |
| gr.Markdown("### Texto a Voz con múltiples voces") | |
| gr.Markdown("Escribe el texto y selecciona una voz para generar audio.") | |
| with gr.Row(): | |
| with gr.Column(): | |
| texto_input = gr.Textbox( | |
| label="Texto a convertir", | |
| placeholder="Escribe aquí el texto en español...", | |
| lines=4, | |
| max_lines=10 | |
| ) | |
| voz_seleccionada = gr.Dropdown( | |
| choices=VOICES, | |
| label="Selecciona una voz", | |
| value="af_bella.pt", | |
| info="Elige entre más de 50 voces diferentes" | |
| ) | |
| generar_btn = gr.Button("🎵 Generar Audio", variant="primary") | |
| with gr.Column(): | |
| audio_output = gr.Audio( | |
| label="Audio Generado", | |
| type="numpy", | |
| interactive=False | |
| ) | |
| # Ejemplos | |
| gr.Markdown("### Ejemplos rápidos:") | |
| ejemplos = gr.Examples( | |
| examples=[ | |
| ["Hola, ¿cómo estás? Soy una voz generada por inteligencia artificial.", "af_bella.pt"], | |
| ["Bienvenido al sistema de texto a voz más avanzado.", "af_nova.pt"], | |
| ["La tecnología de síntesis de voz ha avanzado mucho.", "am_adam.pt"] | |
| ], | |
| inputs=[texto_input, voz_seleccionada], | |
| outputs=audio_output, | |
| fn=tts_pro, | |
| cache_examples=False | |
| ) | |
| # Conectar el botón | |
| generar_btn.click( | |
| fn=tts_pro, | |
| inputs=[texto_input, voz_seleccionada], | |
| outputs=audio_output | |
| ) | |
| # Información adicional | |
| gr.Markdown("---") | |
| gr.Markdown(""" | |
| ### 📝 Notas: | |
| - Las voces están en formato `.pt` y se cargan desde la carpeta `voices/` | |
| - Tiempo de generación: ~5-10 segundos dependiendo del texto | |
| - Formato de audio: 24kHz, mono | |
| - Modelo: Kokoro TTS v1.0 | |
| """) | |
| if __name__ == "__main__": | |
| demo.launch( | |
| share=False, | |
| server_name="0.0.0.0" if os.getenv('SPACE_ID') else None, | |
| server_port=7860 | |
| ) |