Spaces:
Sleeping
Sleeping
feat: enhance analysis result with estimated bitrate and XAI verdict integration
Browse files- 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=
|
| 508 |
-
confidence=
|
| 509 |
processingTime=processing_time,
|
| 510 |
modelVersion=fusion.model_version,
|
| 511 |
-
decisionSource=
|
| 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=
|
| 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=[])
|