Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, Header, HTTPException | |
| from pydantic import BaseModel | |
| import base64 | |
| import numpy as np | |
| import pydub | |
| import tempfile | |
| import os | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| from models import detect_audio | |
| app = FastAPI(title="AI-Generated Voice Detection API - GUVI Hackathon") | |
| API_KEY = os.getenv("API_KEY") | |
| class AudioInput(BaseModel): | |
| language: str | |
| audioFormat: str | |
| audioBase64: str | |
| def detect_voice( | |
| input_data: AudioInput, | |
| x_api_key: str = Header(None, alias="x-api-key") | |
| ): | |
| if x_api_key != API_KEY: | |
| raise HTTPException(status_code=401, detail="Invalid API key") | |
| if input_data.audioFormat.lower() != "mp3": | |
| raise HTTPException(status_code=400, detail="Only mp3 supported") | |
| try: | |
| audio_bytes = base64.b64decode(input_data.audioBase64) | |
| with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as tmp: | |
| tmp.write(audio_bytes) | |
| tmp_path = tmp.name | |
| try: | |
| segment = pydub.AudioSegment.from_file(tmp_path, format="mp3") | |
| finally: | |
| os.remove(tmp_path) | |
| segment = segment.set_channels(1).set_frame_rate(16000) | |
| samples = segment.get_array_of_samples() | |
| y = np.array(samples, dtype=np.float32) / 32768.0 | |
| classification, confidence, explanation = detect_audio(y) | |
| return { | |
| "status": "success", | |
| "languageProvided": input_data.language, | |
| "classification": classification, | |
| "confidenceScore": confidence, | |
| "explanation": explanation | |
| } | |
| except Exception as e: | |
| raise HTTPException(status_code=400, detail=str(e)) | |
| def health(): | |
| return {"status": "healthy"} | |
| def root(): | |
| return {"message": "AI Voice Detection API - Ready"} | |