File size: 2,400 Bytes
63f1d6d 6e4e2fe 63f1d6d 8529fe9 63f1d6d 8529fe9 63f1d6d 6e4e2fe 63f1d6d 6e4e2fe 63f1d6d 6e4e2fe 63f1d6d 6e4e2fe 63f1d6d 8529fe9 6e4e2fe d81bde6 63f1d6d 6e4e2fe d81bde6 63f1d6d 6e4e2fe 63f1d6d 6e4e2fe d81bde6 63f1d6d 4f5115c 63f1d6d 8529fe9 6e4e2fe 8529fe9 63f1d6d 8529fe9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import gradio as gr
import edge_tts
import asyncio
import tempfile
import os
async def get_voices():
# Obtiene la lista de voces disponibles
voices = await edge_tts.list_voices()
return {f"{v['ShortName']} - {v['Locale']} ({v['Gender']})": v['ShortName'] for v in voices}
async def text_to_speech(text, voice, rate, pitch):
if not text.strip():
return None, "Please enter text to convert."
if not voice:
return None, "Please select a voice."
# Corregida la identación y extracción del nombre
voice_short_name = voice.split(" - ")[0]
rate_str = f"{rate:+d}%"
pitch_str = f"{pitch:+d}Hz"
communicate = edge_tts.Communicate(text, voice_short_name, rate=rate_str, pitch=pitch_str)
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
tmp_path = tmp_file.name
await communicate.save(tmp_path)
return tmp_path, None
async def tts_interface(text, voice, rate, pitch):
audio, warning = await text_to_speech(text, voice, rate, pitch)
if warning:
# Lanzar la advertencia y devolver None para el audio
gr.Warning(warning)
return None, warning
# Devolver el audio y limpiar el campo de Markdown
return audio, ""
async def create_demo():
voices = await get_voices()
description = "Convert text to speech using Edge TTS. Adjust speech rate and pitch."
demo = gr.Interface(
fn=tts_interface,
inputs=[
gr.Textbox(label="Input Text", lines=5),
gr.Dropdown(choices=[""] + list(voices.keys()), label="Select Voice", value=""),
gr.Slider(minimum=-50, maximum=50, value=0, label="Speech Rate Adjustment (%)", step=1),
gr.Slider(minimum=-20, maximum=20, value=0, label="Pitch Adjustment (Hz)", step=1)
],
outputs=[
gr.Audio(label="Generated Audio", type="filepath"),
gr.Markdown(label="Status") # Cambiado para recibir el mensaje de texto/error
],
title="Free-TTS Unlimited",
description=description,
analytics_enabled=False,
api_name=None
)
return demo
async def main():
demo = await create_demo()
# Gradio 5: queue ya no requiere obligatoriamente default_concurrency_limit
demo.queue()
demo.launch(show_api=False)
if __name__ == "__main__":
asyncio.run(main())
|