File size: 2,969 Bytes
2f9ec6c 1f673e5 2f9ec6c 1f673e5 2f9ec6c 1f673e5 2f9ec6c 1f673e5 2f9ec6c acf58ab 2f9ec6c |
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import gradio as gr
import requests
import os
from dotenv import load_dotenv
from datetime import datetime, timedelta
# Cargar variables de entorno desde el archivo .env
load_dotenv()
# Constantes para el script
CHUNK_SIZE = 1024 # Tama帽o de los chunks para leer/escribir a la vez
XI_API_KEY = os.getenv("XI_API_KEY") # Tu clave API para autenticaci贸n
VOICE_ID = os.getenv("VOICE_ID") # ID del modelo de voz a utilizar
# Diccionario para almacenar la informaci贸n de los usuarios
user_data = {}
# Configuraci贸n de l铆mites
MESSAGE_LIMIT = 2
TIME_LIMIT = timedelta(hours=2)
def text_to_speech(text, user_id):
current_time = datetime.now()
if user_id not in user_data:
user_data[user_id] = {'messages': [], 'last_reset': current_time}
user_info = user_data[user_id]
# Resetear el contador si ha pasado el tiempo l铆mite
if current_time - user_info['last_reset'] > TIME_LIMIT:
user_info['messages'] = []
user_info['last_reset'] = current_time
# Verificar si el usuario ha alcanzado el l铆mite de mensajes
if len(user_info['messages']) >= MESSAGE_LIMIT:
return f"Error: L铆mite de mensajes alcanzado. Intenta nuevamente en 2 horas."
# URL para la solicitud de la API de Text-to-Speech
tts_url = f"https://api.elevenlabs.io/v1/text-to-speech/{VOICE_ID}/stream"
# Encabezados para la solicitud de la API, incluida la clave API para autenticaci贸n
headers = {
"Accept": "application/json",
"xi-api-key": XI_API_KEY
}
# Datos de carga 煤til para la solicitud de la API, incluidos los ajustes de texto y voz
data = {
"text": text,
"model_id": "eleven_multilingual_v2",
"voice_settings": {
"stability": 0.5,
"similarity_boost": 0.8,
"style": 0.0,
"use_speaker_boost": True
}
}
# Realizar la solicitud POST a la API de TTS con encabezados y datos, habilitando la respuesta en streaming
response = requests.post(tts_url, headers=headers, json=data, stream=True)
# Verificar si la solicitud fue exitosa
if response.ok:
# Crear un archivo temporal para guardar el audio
output_path = "output.mp3"
with open(output_path, "wb") as f:
# Leer la respuesta en chunks y escribir en el archivo
for chunk in response.iter_content(chunk_size=CHUNK_SIZE):
f.write(chunk)
# Registrar el nuevo mensaje
user_info['messages'].append({'message': text, 'time': current_time})
return output_path
else:
return f"Error: {response.text}"
# Crear una interfaz de Gradio para la entrada de texto y la generaci贸n de audio
iface = gr.Interface(
fn=text_to_speech,
inputs=["text", "text"], # A帽adir un segundo campo de texto para el user_id
outputs="audio",
title="",
description="texto"
)
# Ejecutar la interfaz
if __name__ == "__main__":
iface.launch()
|