Rthur2003 commited on
Commit
9e93437
·
1 Parent(s): 21d9516

feat: enhance analysis result with estimated bitrate and XAI verdict integration

Browse files
Files changed (1) hide show
  1. app/routes/analyze.py +26 -4
app/routes/analyze.py CHANGED
@@ -503,12 +503,31 @@ async def _analyze_file(
503
  indicators=vocals.indicators,
504
  )
505
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
506
  result = AnalysisResult(
507
- isAIGenerated=fusion.is_ai_generated,
508
- confidence=fusion.confidence,
509
  processingTime=processing_time,
510
  modelVersion=fusion.model_version,
511
- decisionSource=fusion.decision_source,
512
  analysisMode=fusion.analysis_mode,
513
  source={
514
  "kind": "file",
@@ -525,10 +544,13 @@ async def _analyze_file(
525
  audioInfo=AudioInfo(
526
  duration=round(features.duration_sec, 2),
527
  sampleRate=features.sample_rate,
528
- bitrate=128,
529
  format=content_type.replace("audio/", ""),
 
530
  ),
531
  vocalAnalysis=vocal_response,
 
 
532
  )
533
 
534
  return AnalyzeResponse(result=result, warnings=warnings, errors=[])
 
503
  indicators=vocals.indicators,
504
  )
505
 
506
+ # Estimate bitrate from file size + duration (kbps)
507
+ estimated_bitrate = 128
508
+ if features.duration_sec > 0:
509
+ estimated_bitrate = max(
510
+ 32, min(
511
+ int((file_size * 8) / (features.duration_sec * 1000)),
512
+ 2048,
513
+ )
514
+ )
515
+
516
+ # Prefer XAI verdict if available — it's the calibrated classifier
517
+ final_is_ai = fusion.is_ai_generated
518
+ final_confidence = fusion.confidence
519
+ final_decision = fusion.decision_source
520
+ if xai_payload is not None:
521
+ final_is_ai = xai_payload.probability >= xai_payload.threshold
522
+ final_confidence = round(xai_payload.probability, 4)
523
+ final_decision = f"auris_xai_{xai_payload.bestModel.lower()}"
524
+
525
  result = AnalysisResult(
526
+ isAIGenerated=final_is_ai,
527
+ confidence=final_confidence,
528
  processingTime=processing_time,
529
  modelVersion=fusion.model_version,
530
+ decisionSource=final_decision,
531
  analysisMode=fusion.analysis_mode,
532
  source={
533
  "kind": "file",
 
544
  audioInfo=AudioInfo(
545
  duration=round(features.duration_sec, 2),
546
  sampleRate=features.sample_rate,
547
+ bitrate=estimated_bitrate,
548
  format=content_type.replace("audio/", ""),
549
+ channels=1,
550
  ),
551
  vocalAnalysis=vocal_response,
552
+ xai=xai_payload,
553
+ towerScores=tower_scores,
554
  )
555
 
556
  return AnalyzeResponse(result=result, warnings=warnings, errors=[])