import gradio as gr import requests import os from dotenv import load_dotenv from datetime import datetime, timedelta from flask import Flask, jsonify # 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 uso usage_data = { 'message_count': 0, 'last_reset': datetime.now() } # Configuración de límites MESSAGE_LIMIT = 3 TIME_LIMIT = timedelta(hours=2) # Crear la aplicación Flask app = Flask(__name__) @app.route('/reset_usage', methods=['POST']) def reset_usage(): global usage_data usage_data = { 'message_count': 0, 'last_reset': datetime.now() } return jsonify({"success": "Usage reset."}), 200 def text_to_speech(text): global usage_data current_time = datetime.now() # Resetear el contador si ha pasado el tiempo límite if current_time - usage_data['last_reset'] > TIME_LIMIT: usage_data = { 'message_count': 0, 'last_reset': current_time } # Verificar si se ha alcanzado el límite de mensajes if usage_data['message_count'] >= MESSAGE_LIMIT: return "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) # Incrementar el contador de mensajes usage_data['message_count'] += 1 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", outputs="audio", title="Generador de Texto a Voz", description="Ingrese el texto para convertir a voz." ) # Ejecutar la interfaz if __name__ == "__main__": iface.launch()