IKRAMELHADI commited on
Commit
f02c7ee
·
1 Parent(s): 2528c44

modif interpretation results

Browse files
Files changed (1) hide show
  1. app.py +64 -40
app.py CHANGED
@@ -764,78 +764,102 @@ def predict_with_model_meta(model, df_input: pd.DataFrame, le=None):
764
 
765
  def predict_from_metadata_url(url: str):
766
  if not API_TOKEN:
767
- return "❌ Token FreeSound manquant. Ajoute FREESOUND_TOKEN (env / secret)."
 
 
 
768
 
769
  if not url or not url.strip():
770
- return "❌ Veuillez entrer une URL FreeSound."
 
 
 
771
 
772
  # 1) metadata brute
773
  try:
774
  df_raw = fetch_sound_metadata(url)
775
  except Exception as e:
776
- return f"Erreur API FreeSound: {e}"
777
-
778
- raw_lines = ["=== Métadonnées brutes ==="]
779
- for col in df_raw.columns:
780
- raw_lines.append(f"{col}: {df_raw[col].iloc[0]}")
781
- raw_str = "\n".join(raw_lines)
782
 
783
  # 2) durée
784
- dur = float(df_raw["duration"].iloc[0])
 
 
 
 
785
  if dur < MIN_EFFECT:
786
- return raw_str + f"\n\n❌ Son trop court ({dur} sec). Plage acceptée: {MIN_EFFECT}-{MAX_EFFECT} ou {MIN_MUSIC}-{MAX_MUSIC} sec"
 
 
 
 
 
 
 
787
  if (MAX_EFFECT < dur < MIN_MUSIC) or dur > MAX_MUSIC:
788
- return raw_str + f"\n\n❌ Son hors plage ({dur} sec). Plage acceptée: {MIN_EFFECT}-{MAX_EFFECT} ou {MIN_MUSIC}-{MAX_MUSIC} sec"
 
 
 
 
 
 
789
 
790
- # 3) preprocessing complet
791
  df_processed = preprocess_sound(df_raw)
792
  if isinstance(df_processed, str):
793
- return raw_str + "\n\n" + df_processed
794
 
 
795
  cols_to_remove = ["avg_rating", "num_downloads_class"]
796
- df_for_model = df_processed.drop(columns=[c for c in cols_to_remove if c in df_processed.columns])
 
 
 
797
 
798
- # 4) choisir modèles metadata
799
  if MIN_EFFECT <= dur <= MAX_EFFECT:
 
800
  model_nd = effect_model_num_downloads
801
  model_ar = effect_model_avg_rating
802
  model_features = effect_model_features
803
- sound_type = "EffectSound"
804
  current_le = effect_avg_rating_le_meta
805
  else:
 
806
  model_nd = music_model_num_downloads
807
  model_ar = music_model_avg_rating
808
  model_features = music_model_features
809
- sound_type = "Music"
810
  current_le = music_avg_rating_le_meta
811
 
812
- # 5) forcer colonnes exactes
813
  df_for_model = df_for_model.reindex(columns=model_features, fill_value=0.0).astype(float)
814
 
815
- # 6) prédictions
816
  pred_num_downloads_val = predict_with_model_meta(model_nd, df_for_model, le=None)
817
- NUM_DOWNLOADS_MAP = {0: "Low", 1: "Medium", 2: "High"}
818
- pred_num_downloads = NUM_DOWNLOADS_MAP.get(int(pred_num_downloads_val), str(pred_num_downloads_val))
819
 
820
- pred_avg_rating = predict_with_model_meta(model_ar, df_for_model, le=current_le)
 
 
821
 
822
- # 7) afficher features après preprocessing
823
- processed_lines = ["\n=== Features après preprocessing ==="]
824
- for col in df_processed.columns:
825
- processed_lines.append(f"{col}: {df_processed[col].iloc[0]}")
826
- processed_str = "\n".join(processed_lines)
827
 
828
- # 8) résultat
829
- prediction_lines = [
830
- "\n=== Prédictions ===",
831
- f"Type détecté : {sound_type}",
832
- f"📥 Num downloads prédit : {pred_num_downloads}",
833
- f"⭐ Avg rating prédit : {pred_avg_rating}",
834
- ]
835
- prediction_str = "\n".join(prediction_lines)
836
 
837
- return raw_str + processed_str + prediction_str
 
838
 
 
 
 
 
 
 
 
 
839
 
840
  # =========================
841
  # APP UI (3 onglets)
@@ -884,15 +908,15 @@ Trois modes : <b>Upload audio</b> (openSMILE), <b>URL FreeSound</b> (features AP
884
  btn_url.click(predict_from_freesound_url, inputs=url_in, outputs=out_url)
885
 
886
  # -------- TAB 3 --------
887
- with gr.Tab("3) URL FreeSound (metadata + preprocessing complet)"):
888
  with gr.Row():
889
  with gr.Column(scale=1):
890
  gr.Markdown("### Coller une URL FreeSound")
891
  url_meta = gr.Textbox(label="URL FreeSound", placeholder="https://freesound.org/s/123456/")
892
- btn_meta = gr.Button("📊 Prétraiter + prédire (metadata)", variant="primary")
893
  with gr.Column(scale=1):
894
- gr.Markdown("### Sortie détaillée (prédictions)")
895
- out_meta = gr.Textbox(label="Résultat", lines=22)
896
  btn_meta.click(predict_from_metadata_url, inputs=url_meta, outputs=out_meta)
897
 
898
  demo.launch(theme=theme)
 
764
 
765
  def predict_from_metadata_url(url: str):
766
  if not API_TOKEN:
767
+ return html_error(
768
+ "Token FreeSound manquant",
769
+ "Ajoute la variable d’environnement <code>FREESOUND_TOKEN</code> pour activer cet onglet."
770
+ )
771
 
772
  if not url or not url.strip():
773
+ return html_error(
774
+ "URL vide",
775
+ "Collez une URL FreeSound du type <code>https://freesound.org/s/123456/</code>"
776
+ )
777
 
778
  # 1) metadata brute
779
  try:
780
  df_raw = fetch_sound_metadata(url)
781
  except Exception as e:
782
+ return html_error("Erreur API FreeSound", f"Détail : <code>{e}</code>")
 
 
 
 
 
783
 
784
  # 2) durée
785
+ try:
786
+ dur = float(df_raw["duration"].iloc[0])
787
+ except Exception:
788
+ dur = 0.0
789
+
790
  if dur < MIN_EFFECT:
791
+ return html_error(
792
+ "Audio trop court",
793
+ f"Durée détectée : <b>{dur:.2f} s</b><br><br>"
794
+ f"Plages acceptées :<br>"
795
+ f"• Effet sonore : <b>{MIN_EFFECT}–{MAX_EFFECT} s</b><br>"
796
+ f"• Musique : <b>{MIN_MUSIC}–{MAX_MUSIC} s</b>"
797
+ )
798
+
799
  if (MAX_EFFECT < dur < MIN_MUSIC) or dur > MAX_MUSIC:
800
+ return html_error(
801
+ "Audio hors plage",
802
+ f"Durée détectée : <b>{dur:.2f} s</b><br><br>"
803
+ f"Plages acceptées :<br>"
804
+ f"• Effet sonore : <b>{MIN_EFFECT}–{MAX_EFFECT} s</b><br>"
805
+ f"• Musique : <b>{MIN_MUSIC}–{MAX_MUSIC} s</b>"
806
+ )
807
 
808
+ # 3) preprocessing complet (mais on NE L’AFFICHE PAS)
809
  df_processed = preprocess_sound(df_raw)
810
  if isinstance(df_processed, str):
811
+ return html_error("Preprocessing impossible", df_processed)
812
 
813
+ # 4) features pour modèles
814
  cols_to_remove = ["avg_rating", "num_downloads_class"]
815
+ df_for_model = df_processed.drop(
816
+ columns=[c for c in cols_to_remove if c in df_processed.columns],
817
+ errors="ignore"
818
+ )
819
 
820
+ # 5) choisir modèles metadata
821
  if MIN_EFFECT <= dur <= MAX_EFFECT:
822
+ badge = "🔊 Effet sonore (URL → metadata)"
823
  model_nd = effect_model_num_downloads
824
  model_ar = effect_model_avg_rating
825
  model_features = effect_model_features
 
826
  current_le = effect_avg_rating_le_meta
827
  else:
828
+ badge = "🎵 Musique (URL → metadata)"
829
  model_nd = music_model_num_downloads
830
  model_ar = music_model_avg_rating
831
  model_features = music_model_features
 
832
  current_le = music_avg_rating_le_meta
833
 
834
+ # 6) forcer colonnes exactes
835
  df_for_model = df_for_model.reindex(columns=model_features, fill_value=0.0).astype(float)
836
 
837
+ # 7) prédire
838
  pred_num_downloads_val = predict_with_model_meta(model_nd, df_for_model, le=None)
839
+ pred_num_downloads_val = int(pred_num_downloads_val) if str(pred_num_downloads_val).isdigit() else pred_num_downloads_val
 
840
 
841
+ # Mapping num downloads
842
+ NUM_DOWNLOADS_MAP = {0: "Faible", 1: "Moyen", 2: "Élevé"}
843
+ pred_downloads_text = NUM_DOWNLOADS_MAP.get(pred_num_downloads_val, str(pred_num_downloads_val))
844
 
845
+ # avg rating (label)
846
+ pred_avg_rating_label = predict_with_model_meta(model_ar, df_for_model, le=current_le)
 
 
 
847
 
848
+ # 8) transformer en classes (pour interprétation + cohérence visuelle)
849
+ avg_class = avg_label_to_class(pred_avg_rating_label)
850
+ dl_class = int(pred_num_downloads_val) if isinstance(pred_num_downloads_val, (int, np.integer)) else 0
 
 
 
 
 
851
 
852
+ rating_display = str(pred_avg_rating_label)
853
+ downloads_display = pred_downloads_text
854
 
855
+ conclusion = interpret_results(avg_class, dl_class)
856
+ extra = f"""
857
+ <div style="margin-top:12px; padding-top:10px; border-top:1px dashed #d1d5db">
858
+ {conclusion}
859
+ </div>
860
+ """
861
+
862
+ return html_result(badge, dur, rating_display, downloads_display, extra_html=extra)
863
 
864
  # =========================
865
  # APP UI (3 onglets)
 
908
  btn_url.click(predict_from_freesound_url, inputs=url_in, outputs=out_url)
909
 
910
  # -------- TAB 3 --------
911
+ with gr.Tab("3) URL FreeSound (metadata)"):
912
  with gr.Row():
913
  with gr.Column(scale=1):
914
  gr.Markdown("### Coller une URL FreeSound")
915
  url_meta = gr.Textbox(label="URL FreeSound", placeholder="https://freesound.org/s/123456/")
916
+ btn_meta = gr.Button("🚀 Prédire (URL metadata)", variant="primary")
917
  with gr.Column(scale=1):
918
+ gr.Markdown("### Résultat")
919
+ out_meta = gr.HTML()
920
  btn_meta.click(predict_from_metadata_url, inputs=url_meta, outputs=out_meta)
921
 
922
  demo.launch(theme=theme)