IKRAMELHADI
commited on
Commit
·
f02c7ee
1
Parent(s):
2528c44
modif interpretation results
Browse files
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
|
|
|
|
|
|
|
|
|
|
| 768 |
|
| 769 |
if not url or not url.strip():
|
| 770 |
-
return
|
|
|
|
|
|
|
|
|
|
| 771 |
|
| 772 |
# 1) metadata brute
|
| 773 |
try:
|
| 774 |
df_raw = fetch_sound_metadata(url)
|
| 775 |
except Exception as e:
|
| 776 |
-
return
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 785 |
if dur < MIN_EFFECT:
|
| 786 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 787 |
if (MAX_EFFECT < dur < MIN_MUSIC) or dur > MAX_MUSIC:
|
| 788 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 789 |
|
| 790 |
-
# 3) preprocessing complet
|
| 791 |
df_processed = preprocess_sound(df_raw)
|
| 792 |
if isinstance(df_processed, str):
|
| 793 |
-
return
|
| 794 |
|
|
|
|
| 795 |
cols_to_remove = ["avg_rating", "num_downloads_class"]
|
| 796 |
-
df_for_model = df_processed.drop(
|
|
|
|
|
|
|
|
|
|
| 797 |
|
| 798 |
-
#
|
| 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 |
-
#
|
| 813 |
df_for_model = df_for_model.reindex(columns=model_features, fill_value=0.0).astype(float)
|
| 814 |
|
| 815 |
-
#
|
| 816 |
pred_num_downloads_val = predict_with_model_meta(model_nd, df_for_model, le=None)
|
| 817 |
-
|
| 818 |
-
pred_num_downloads = NUM_DOWNLOADS_MAP.get(int(pred_num_downloads_val), str(pred_num_downloads_val))
|
| 819 |
|
| 820 |
-
|
|
|
|
|
|
|
| 821 |
|
| 822 |
-
#
|
| 823 |
-
|
| 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)
|
| 829 |
-
|
| 830 |
-
|
| 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 |
-
|
|
|
|
| 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 |
-
|
| 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("
|
| 893 |
with gr.Column(scale=1):
|
| 894 |
-
gr.Markdown("###
|
| 895 |
-
out_meta = gr.
|
| 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)
|