Spaces:
Running
Running
import os | |
import gradio as gr | |
import uvicorn | |
from sound_generator import generate_sound, generate_music | |
from fastapi import FastAPI, HTTPException | |
from fastapi.middleware.cors import CORSMiddleware | |
from fastapi.responses import FileResponse, RedirectResponse, HTMLResponse | |
from pydantic import BaseModel | |
# Create the FastAPI app with custom docs URL | |
app = FastAPI(docs_url="/api/docs") | |
# Configuraci贸n de CORS | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Define a Pydantic model to handle the input prompt | |
class AudioRequest(BaseModel): | |
prompt: str | |
# Prueba para verificar si la API funciona - la dejamos por ahora para debugging | |
def status(): | |
return {"status": "API running", "version": "1.0"} | |
async def generate_sound_endpoint(request: AudioRequest): | |
try: | |
# Llamada a la funci贸n para generar el sonido | |
audio_file_path = generate_sound(request.prompt) | |
# Verifica si el archivo se ha generado correctamente | |
if not os.path.exists(audio_file_path): | |
raise HTTPException( | |
status_code=404, detail="Archivo de audio no encontrado." | |
) | |
# Regresar el archivo generado como una respuesta de descarga | |
return FileResponse( | |
audio_file_path, media_type="audio/wav", filename="generated_audio.wav" | |
) | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
async def generate_music_endpoint(request: AudioRequest): | |
try: | |
# Call the synchronous generate_music function | |
audio_file_path = generate_music(request.prompt) | |
# Verifies if the file has been generated correctly | |
if not os.path.exists(audio_file_path): | |
raise HTTPException( | |
status_code=404, detail="Archivo de audio no encontrado." | |
) | |
# Return the generated file as a download response | |
return FileResponse( | |
audio_file_path, media_type="audio/wav", filename="generated_audio.wav" | |
) | |
except Exception as e: | |
raise HTTPException(status_code=500, detail=str(e)) | |
# IMPORTANTE: Configurar Gradio con server_port y server_name expl铆citamente | |
# para evitar problemas de puerto | |
with gr.Blocks( | |
theme=gr.themes.Default(), # Asegurar que se cargue el tema | |
) as demo: | |
gr.Markdown("# 馃幍 API de Sonidos Generativos") | |
gr.Markdown("Esta interfaz permite interactuar con la API de generaci贸n de sonidos.") | |
with gr.Tab("Informaci贸n de la API"): | |
gr.Markdown(""" | |
## Documentaci贸n completa | |
Puedes acceder a la documentaci贸n detallada de la API en: | |
- [Documentaci贸n Swagger](/api/docs) | |
- [Documentaci贸n ReDoc](/api/redoc) | |
## Endpoints disponibles | |
- `GET /api/health` - Verificar el estado del servicio | |
- `POST /api/generate-sound` - Generar sonido a partir de descripci贸n | |
- `POST /api/generate-music` - Generar m煤sica a partir de descripci贸n | |
""") | |
# Integrar FastAPI con Gradio | |
def start_fastapi(): | |
uvicorn.run(app, host="0.0.0.0", port=8000) | |
# Agregar una interfaz m铆nima de Gradio para cumplir con los requisitos de Hugging Face | |
with gr.Blocks() as demo: | |
gr.Markdown("# API de Sonidos Generativos") | |
gr.Markdown("Esta API usa FastAPI y est谩 desplegada en Hugging Face Spaces.") | |
# Ejecutar FastAPI dentro de Gradio | |
if __name__ == "__main__": | |
import threading | |
threading.Thread(target=start_fastapi).start() | |
demo.launch(server_port=7860) | |