auralis-api / api /routes.py
Khubaib01's picture
auralis model & files
36e0dea verified
from fastapi import File, UploadFile, APIRouter
from audio.preprocessing import load_audio, extract_features
from model.ecapa import ECAPAENCODER
# from model.scorer import fatigue_score_0_to_100, prosody_score ## for prosody scoring
from model.scorer import fatigue_score_0_to_100
from fastapi.responses import JSONResponse
import numpy as np
from utils.logger import logger
from utils.file_utils import save_temp_audio
from core.config import LOW_PERCENTILE, HIGH_PERCENTILE, FATIGUE_AXIS, REF_C_H, MAX_DURATION_SEC
# from audio.feature_extractor import get_prosody_stats
from fastapi import HTTPException, status
from audio.validators import validate_audio_duration, validate_audio_file, AudioValidationError
C_h = np.load(REF_C_H)
fatigue_axis = np.load(FATIGUE_AXIS)
low = float(np.load(LOW_PERCENTILE)["arr_0"])
high = float(np.load(HIGH_PERCENTILE)["arr_0"])
router = APIRouter()
encoder = ECAPAENCODER()
@router.post("/score")
async def score_voice(file: UploadFile = File(...)):
try:
path = save_temp_audio(file)
validate_audio_file(
file_path=path,
original_filename=file.filename
)
wav = load_audio(path)
# prosody_features = get_prosody_stats(wav)
# p_score, report = prosody_score(prosody_features)
features = extract_features(wav)
wav = wav.squeeze()
emb = encoder.encode(wav)
score = float(fatigue_score_0_to_100(emb, C_h, fatigue_axis, low, high))
# return {"fatigue_score": score, "prosody_score": p_score, "prosody_report": report}
return {"fatigue_score" : score}
except AudioValidationError as e:
logger.warning(str(e))
raise HTTPException(
status_code= status.HTTP_400_BAD_REQUEST,
detail = str(e)
)
except Exception as e:
logger.exception("Unexpected server error")
raise HTTPException(
status_code= status.HTTP_500_INTERNAL_SERVER_ERROR,
detail = "Unexpected server error."
)