Djibi972 commited on
Commit
3a33f11
·
verified ·
1 Parent(s): e58911d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -43
app.py CHANGED
@@ -1,48 +1,59 @@
1
  import gradio as gr
 
 
2
  from perch_hoplite.zoo import model_configs
3
- import inspect
4
-
5
- # --- Début du code de diagnostic ---
6
-
7
- def get_available_models_from_library():
8
- """
9
- Cette fonction ne charge pas de modèle.
10
- Elle inspecte l'énumération ModelConfigName pour lister les noms de modèles valides.
11
- """
12
- try:
13
- # On accède à la classe Enum qui contient les noms de modèles
14
- model_enum = model_configs.ModelConfigName
15
-
16
- # On récupère la liste de toutes les valeurs possibles (les noms des modèles)
17
- available_names = [member.value for member in model_enum]
18
-
19
- if not available_names:
20
- return {
21
- "ERREUR Critique": "L'énumération 'ModelConfigName' est vide.",
22
- "Hypothèse": "La bibliothèque installée est peut-être corrompue ou une version inattendue."
23
- }
24
-
25
- return {
26
- "Message": "Voici les SEULS noms de modèles valides trouvés dans la bibliothèque actuellement installée :",
27
- "Modèles Disponibles": available_names
28
- }
29
- except Exception as e:
30
- return {
31
- "ERREUR Critique": "Impossible d'inspecter la bibliothèque perch_hoplite.",
32
- "Détails de l'erreur": str(e),
33
- "Traceback": inspect.format_exc()
34
- }
35
-
36
- # --- Fin du code de diagnostic ---
37
-
38
-
39
- # Interface Gradio pour afficher le résultat de notre inspection
 
 
 
 
 
 
 
 
 
40
  demo = gr.Interface(
41
- fn=get_available_models_from_library,
42
- inputs=[],
43
- outputs=gr.JSON(label="Contenu Réel de la Bibliothèque"),
44
- title="Inspecteur de la Bibliothèque Perch-Hoplite",
45
- description="Cette application de diagnostic ne fait qu'une seule chose : elle affiche les noms de modèles que la bibliothèque installée prétend connaître. Le résultat nous donnera la solution."
46
  )
47
 
48
- demo.launch()
 
1
  import gradio as gr
2
+ import numpy as np
3
+ import librosa
4
  from perch_hoplite.zoo import model_configs
5
+
6
+ # LA SOLUTION FINALE : Utiliser le nom de modèle "perch_8"
7
+ MODEL = model_configs.load_model_by_name("perch_8")
8
+ SR = 32000
9
+ WIN = 5 * SR
10
+
11
+ def _prep(wav, sr):
12
+ if wav.ndim > 1:
13
+ wav = np.mean(wav, axis=1)
14
+ if sr != SR:
15
+ wav = librosa.resample(wav.astype(np.float32), orig_sr=sr, target_sr=SR)
16
+ if len(wav) < WIN:
17
+ wav = np.pad(wav, (0, WIN - len(wav)))
18
+ else:
19
+ wav = wav[:WIN]
20
+ return wav.astype(np.float32)
21
+
22
+ def infer(audio):
23
+ if audio is None:
24
+ return {"error": "no audio"}
25
+ sr, wav = audio
26
+ wav = _prep(wav, sr)
27
+
28
+ out = MODEL.embed(wav)
29
+ logits = out.logits["label"]
30
+ labels = out.label_names.get("label")
31
+
32
+ idx = np.argsort(logits)[::-1][:3]
33
+ topk = []
34
+
35
+ top_logits = logits[idx]
36
+ exp_logits = np.exp(top_logits - np.max(top_logits))
37
+ sum_exp_logits = np.sum(exp_logits)
38
+
39
+ for i in range(len(idx)):
40
+ class_index = idx[i]
41
+ name = labels[class_index] if labels is not None and class_index < len(labels) else f"classe_{int(class_index)}"
42
+ prob = float(exp_logits[i] / sum_exp_logits)
43
+ topk.append({"label": name, "score": round(prob, 4)})
44
+
45
+ return {
46
+ "topk": topk,
47
+ "embedding_dim": int(out.embeddings.shape[-1]),
48
+ "note": "Scores non calibrés; régler un seuil selon votre usage."
49
+ }
50
+
51
  demo = gr.Interface(
52
+ fn=infer,
53
+ inputs=gr.Audio(type="numpy", sources=["microphone", "upload"]),
54
+ outputs=gr.JSON(label="Perch 8 Inference"),
55
+ title="Perch Bioacoustics",
56
+ allow_flagging="never"
57
  )
58
 
59
+ demo.queue(api_open=True).launch()