Rthur2003 commited on
Commit
dc559f6
·
1 Parent(s): d51601e

feat: enhance fuse_scores function with CLAP and FST results integration

Browse files
Files changed (1) hide show
  1. 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
- Priority hierarchy:
59
- 1. External production models (music_ai, ses_analizi) if available
60
- 2. Local feature + vocal analysis (always available)
 
 
61
 
62
- When external models agree with local analysis, confidence is boosted.
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
- # ── External service scores ──────────────────────────────────────
 
 
 
 
 
 
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, ext_music_ai, ext_ses
 
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(