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 )