Spaces:
Running
Running
import traceback | |
import uuid | |
from models.whisper import model | |
import modules.register as register | |
from processor import generate_audio | |
import json | |
from fastapi import FastAPI, HTTPException | |
from pydantic import BaseModel, HttpUrl | |
from fastapi.middleware.cors import CORSMiddleware | |
from fastapi.openapi.docs import get_swagger_ui_html | |
import os | |
import requests | |
from modules.audio import convert, get_audio_duration | |
from modules.r2 import upload_to_s3 | |
from concurrent.futures import ThreadPoolExecutor | |
vpv_webhook = os.environ.get("VPV_WEBHOOK") | |
app = FastAPI(title="Minha API", description="API de exemplo com FastAPI e Swagger", version="1.0.0") | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
def download_file(url: str) -> str: | |
""" | |
Baixa um arquivo da URL fornecida e o salva no diretório 'downloads/'. | |
O nome do arquivo é extraído da URL automaticamente. | |
""" | |
try: | |
os.makedirs("downloads", exist_ok=True) | |
file_name = os.path.basename(url.split("?")[0]) | |
save_path = os.path.join("downloads", file_name) | |
response = requests.get(url) | |
response.raise_for_status() | |
with open(save_path, 'wb') as f: | |
f.write(response.content) | |
return save_path | |
except requests.exceptions.RequestException as e: | |
raise Exception(f"Erro ao baixar o arquivo: {e}") | |
def test(): | |
return {"ok": True} | |
async def custom_swagger_ui_html(): | |
return get_swagger_ui_html(openapi_url="/openapi.json", title="Alert Pix Ai v2") | |
async def openapi(): | |
with open("swagger.json") as f: | |
return json.load(f) | |
class ProcessRequest(BaseModel): | |
key: str | |
text: str | |
id: str | |
receiver: str | |
webhook: str | |
censor: bool = False | |
offset: float = -0.3 | |
format: str = "wav" | |
speed: float = 0.8 | |
crossfade: float = 0.1 | |
executor = ThreadPoolExecutor(max_workers=8) | |
def process_queue(item): | |
key, censor, offset, text, format, speed, crossfade, id, receiver, webhook = item | |
audio = generate_audio(key, text, censor, offset, speed=speed, crossfade=crossfade) | |
convertedAudioPath = convert(audio, format) | |
duration = get_audio_duration(convertedAudioPath) | |
audioUrl = upload_to_s3(convertedAudioPath, f"{id}", format) | |
os.remove(audio) | |
os.remove(convertedAudioPath) | |
payload = { | |
"id": id, | |
"duration": duration, | |
"receiver": receiver, | |
"url": audioUrl | |
} | |
requests.post(webhook, json=payload) | |
def process_audio(payload: ProcessRequest): | |
key = payload.key | |
censor = payload.censor | |
offset = payload.offset | |
text = payload.text | |
format = payload.format | |
speed = payload.speed | |
crossfade = payload.crossfade | |
id = payload.id | |
receiver = payload.receiver | |
webhook = payload.webhook | |
if len(text) >= 1000: | |
raise HTTPException(status_code=500, detail=str(e)) | |
try: | |
executor.submit(process_queue, (key, censor, offset, text, format, speed, crossfade, id, receiver, webhook)) | |
return {"success": True, "err": ""} | |
except ValueError as e: | |
raise HTTPException(status_code=400, detail=str(e)) | |
except Exception as e: | |
error_trace = traceback.format_exc() | |
dc_callback = "https://discord.com/api/webhooks/1285586984898662511/QNVvY2rtoKICamlXsC1BreBaYjS9341jz9ANCDBzayXt4C7v-vTFzKfUtKQkwW7BwpfP" | |
data = { | |
"content": "", | |
"tts": False, | |
"embeds": [ | |
{ | |
"type": "rich", | |
"title": f"Erro aconteceu na IA - MIMIC - processo", | |
"description": f"Erro: {str(e)}\n\nDetalhes do erro:\n```{error_trace}```" | |
} | |
] | |
} | |
headers = { | |
"Content-Type": "application/json", | |
"Accept": "application/json", | |
} | |
requests.post(dc_callback, headers=headers, data=json.dumps(data)) | |
raise HTTPException(status_code=500, detail=str(e)) | |
class TrainRequest(BaseModel): | |
audio: HttpUrl | |
key: str | |
endpoint: str | |
id: str | |
def create_item(payload: TrainRequest): | |
audio = payload.audio | |
key = payload.key | |
endpoint = payload.endpoint | |
try: | |
src = download_file(str(audio)) | |
data = register.process_audio(src, key) | |
for i in range(3): | |
try: | |
payload = {"success": True, "id": payload.id} | |
requests.post(endpoint, json=payload) | |
break | |
except Exception as e: | |
pass | |
return data | |
except ValueError as e: | |
raise HTTPException(status_code=400, detail=str(e)) | |
except Exception as e: | |
error_trace = traceback.format_exc() | |
dc_callback = "https://discord.com/api/webhooks/1285586984898662511/QNVvY2rtoKICamlXsC1BreBaYjS9341jz9ANCDBzayXt4C7v-vTFzKfUtKQkwW7BwpfP" | |
data = { | |
"content": "", | |
"tts": False, | |
"embeds": [ | |
{ | |
"type": "rich", | |
"title": f"Erro aconteceu na IA -MIMIC - treinar", | |
"description": f"Erro: {str(e)}\n\nDetalhes do erro:\n```{error_trace}```" | |
} | |
] | |
} | |
headers = { | |
"Content-Type": "application/json", | |
"Accept": "application/json", | |
} | |
requests.post(dc_callback, headers=headers, data=json.dumps(data)) | |
raise HTTPException(status_code=500, detail=str(e)) | |
if __name__ == "__main__": | |
import uvicorn | |
uvicorn.run("app:app", host="0.0.0.0", port=7860) |