Spaces:
Running
Running
feat: enhance fuse_scores function with CLAP and FST results integration
Browse files- app/services/score_fusion.py +21 -8
app/services/score_fusion.py
CHANGED
|
@@ -49,22 +49,28 @@ def fuse_scores(
|
|
| 49 |
features: AudioFeatures,
|
| 50 |
vocals: Optional[VocalFeatures] = None,
|
| 51 |
*,
|
|
|
|
|
|
|
| 52 |
external_music_ai: Optional[dict] = None,
|
| 53 |
external_ses_analizi: Optional[dict] = None,
|
| 54 |
) -> FusionResult:
|
| 55 |
"""
|
| 56 |
Fuse all analysis signals into a single detection result.
|
| 57 |
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
|
|
|
|
|
|
| 61 |
|
| 62 |
-
When
|
| 63 |
When they disagree, confidence is moderated.
|
| 64 |
|
| 65 |
Args:
|
| 66 |
features: Audio feature extraction results.
|
| 67 |
vocals: Vocal analysis results (None if skipped).
|
|
|
|
|
|
|
| 68 |
external_music_ai: Response from MusicAI service.
|
| 69 |
external_ses_analizi: Response from SesAnalizi service.
|
| 70 |
|
|
@@ -73,7 +79,7 @@ def fuse_scores(
|
|
| 73 |
"""
|
| 74 |
indicators: List[str] = []
|
| 75 |
|
| 76 |
-
# ── Local feature scores ───────────────────────────────
|
| 77 |
local_score = _compute_local_score(features, vocals)
|
| 78 |
|
| 79 |
vocal_ai_score = 0.0
|
|
@@ -81,20 +87,27 @@ def fuse_scores(
|
|
| 81 |
vocal_ai_score = vocals.vocal_ai_score
|
| 82 |
has_vocals = vocals is not None and vocals.has_vocals
|
| 83 |
|
| 84 |
-
# ──
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
ext_music_ai = _parse_external_music_ai(external_music_ai)
|
| 86 |
ext_ses = _parse_external_ses_analizi(external_ses_analizi)
|
| 87 |
|
| 88 |
# ── Fusion logic ─────────────────────────────────────────────────
|
| 89 |
confidence, decision_source, mode = _fuse(
|
| 90 |
-
local_score, ext_music_ai, ext_ses
|
| 91 |
)
|
| 92 |
|
| 93 |
is_ai = confidence > 0.5
|
| 94 |
|
| 95 |
# ── Build indicators ─────────────────────────────────────────────
|
| 96 |
indicators.extend(_build_indicators(
|
| 97 |
-
is_ai, confidence, features, vocals,
|
|
|
|
| 98 |
))
|
| 99 |
|
| 100 |
return FusionResult(
|
|
|
|
| 49 |
features: AudioFeatures,
|
| 50 |
vocals: Optional[VocalFeatures] = None,
|
| 51 |
*,
|
| 52 |
+
clap_result: Optional[CLAPResult] = None,
|
| 53 |
+
fst_result: Optional[FSTResult] = None,
|
| 54 |
external_music_ai: Optional[dict] = None,
|
| 55 |
external_ses_analizi: Optional[dict] = None,
|
| 56 |
) -> FusionResult:
|
| 57 |
"""
|
| 58 |
Fuse all analysis signals into a single detection result.
|
| 59 |
|
| 60 |
+
3-Layer architecture:
|
| 61 |
+
Layer 1: Local feature + vocal analysis (always available)
|
| 62 |
+
Layer 2: CLAP embedding classifier (optional)
|
| 63 |
+
Layer 3: FST external API (optional)
|
| 64 |
+
Legacy: music_ai / ses_analizi (optional)
|
| 65 |
|
| 66 |
+
When multiple layers agree, confidence is boosted.
|
| 67 |
When they disagree, confidence is moderated.
|
| 68 |
|
| 69 |
Args:
|
| 70 |
features: Audio feature extraction results.
|
| 71 |
vocals: Vocal analysis results (None if skipped).
|
| 72 |
+
clap_result: CLAP detector result (Layer 2).
|
| 73 |
+
fst_result: FST external result (Layer 3).
|
| 74 |
external_music_ai: Response from MusicAI service.
|
| 75 |
external_ses_analizi: Response from SesAnalizi service.
|
| 76 |
|
|
|
|
| 79 |
"""
|
| 80 |
indicators: List[str] = []
|
| 81 |
|
| 82 |
+
# ── Local feature scores (Layer 1) ───────────────────────────────
|
| 83 |
local_score = _compute_local_score(features, vocals)
|
| 84 |
|
| 85 |
vocal_ai_score = 0.0
|
|
|
|
| 87 |
vocal_ai_score = vocals.vocal_ai_score
|
| 88 |
has_vocals = vocals is not None and vocals.has_vocals
|
| 89 |
|
| 90 |
+
# ── CLAP score (Layer 2) ─────────────────────────────────────────
|
| 91 |
+
clap_ext = _parse_clap_result(clap_result)
|
| 92 |
+
|
| 93 |
+
# ── FST score (Layer 3) ──────────────────────────────────────────
|
| 94 |
+
fst_ext = _parse_fst_result(fst_result)
|
| 95 |
+
|
| 96 |
+
# ── Legacy external service scores ───────────────────────────────
|
| 97 |
ext_music_ai = _parse_external_music_ai(external_music_ai)
|
| 98 |
ext_ses = _parse_external_ses_analizi(external_ses_analizi)
|
| 99 |
|
| 100 |
# ── Fusion logic ─────────────────────────────────────────────────
|
| 101 |
confidence, decision_source, mode = _fuse(
|
| 102 |
+
local_score, clap_ext, fst_ext, ext_music_ai, ext_ses
|
| 103 |
)
|
| 104 |
|
| 105 |
is_ai = confidence > 0.5
|
| 106 |
|
| 107 |
# ── Build indicators ─────────────────────────────────────────────
|
| 108 |
indicators.extend(_build_indicators(
|
| 109 |
+
is_ai, confidence, features, vocals,
|
| 110 |
+
clap_ext, fst_ext, ext_music_ai, ext_ses,
|
| 111 |
))
|
| 112 |
|
| 113 |
return FusionResult(
|