Texto_voz5 / app.py
Andro0s's picture
Update app.py
b3ce194 verified
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
)