QnxprU69yCNg8XJ commited on
Commit
44626f7
·
1 Parent(s): 0d28e32

we can start now

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ root_env filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -1,11 +1,22 @@
1
- from fastapi import FastAPI
 
 
2
 
3
  app = FastAPI()
4
 
5
  @app.get("/")
6
- def greet_json():
7
  return {"Hello": "World!"}
8
 
9
 
10
-
11
- # To run the app, use the command:
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, File, UploadFile
2
+ from utils.preprocessing import load_audio
3
+ from utils.inference import get_embeddings, predict_risk
4
 
5
  app = FastAPI()
6
 
7
  @app.get("/")
8
+ def hello():
9
  return {"Hello": "World!"}
10
 
11
 
12
+ @app.post("/predict")
13
+ async def predict(file: UploadFile = File(...)):
14
+ temp_path = f"/tmp/{file.filename}"
15
+ with open(temp_path, "wb") as f:
16
+ f.write(await file.read())
17
+
18
+ waveform, sr = load_audio(temp_path)
19
+ embeddings = get_embeddings(waveform, sr)
20
+ score = predict_risk(embeddings)
21
+
22
+ return {"risk_score": score}
notebooks/quick_start.ipynb ADDED
File without changes
requirements.txt CHANGED
@@ -1,2 +1,6 @@
1
  fastapi
2
  uvicorn[standard]
 
 
 
 
 
1
  fastapi
2
  uvicorn[standard]
3
+ torch
4
+ torchaudio
5
+ numpy
6
+ transformers
utils/inference.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from transformers import AutoFeatureExtractor, AutoModel
3
+
4
+ # Charger HeAR depuis Hugging Face
5
+ MODEL_NAME = "google/hear"
6
+ feature_extractor = AutoFeatureExtractor.from_pretrained(MODEL_NAME)
7
+ hear_model = AutoModel.from_pretrained(MODEL_NAME)
8
+ hear_model.eval()
9
+
10
+ def get_embeddings(waveform, sr):
11
+ """
12
+ Transforme un audio en embeddings HeAR
13
+ """
14
+ # Transformer waveform en input pour HeAR
15
+ inputs = feature_extractor(waveform, sampling_rate=sr, return_tensors="pt")
16
+ with torch.no_grad():
17
+ embeddings = hear_model(**inputs).last_hidden_state
18
+ # embeddings : (batch, sequence, features)
19
+ return embeddings
20
+
21
+ def predict_risk(embeddings):
22
+ """
23
+ Pour le moment : score factice basé sur la norme L2 des embeddings
24
+ Plus tard : utiliser ton classifieur pneumonie
25
+ """
26
+ score = torch.norm(embeddings, dim=-1).mean().item()
27
+ return score
utils/preprocessing.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import torchaudio
2
+
3
+ def load_audio(file_path, target_sr=16000):
4
+ waveform, sr = torchaudio.load(file_path)
5
+ if sr != target_sr:
6
+ waveform = torchaudio.transforms.Resample(orig_freq=sr, new_freq=target_sr)(waveform)
7
+ return waveform, target_sr