proz commited on
Commit
ded8778
·
verified ·
1 Parent(s): d8f3e66

Upload 4 files

Browse files
Files changed (4) hide show
  1. Dockerfile +29 -0
  2. app.py +62 -0
  3. download_model.py +6 -0
  4. requirements.txt +6 -0
Dockerfile ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 1. On part d'une version légère de Python
2
+ FROM python:3.9-slim
3
+
4
+ # 2. On installe les outils système pour l'audio (indispensable)
5
+ RUN apt-get update && apt-get install -y \
6
+ libsndfile1 \
7
+ ffmpeg \
8
+ && rm -rf /var/lib/apt/lists/*
9
+
10
+ # 3. On prépare le dossier de travail
11
+ WORKDIR /app
12
+
13
+ # 4. On installe les librairies Python (requirements.txt)
14
+ COPY requirements.txt .
15
+ RUN pip install --no-cache-dir -r requirements.txt
16
+
17
+ # 5. ASTUCE : On copie le script de téléchargement et on le lance MAINTENANT
18
+ # Le modèle sera ainsi gravé dans l'image Docker
19
+ COPY download_model.py .
20
+ RUN python download_model.py
21
+
22
+ # 6. On copie le reste de ton code (app.py)
23
+ COPY . .
24
+
25
+ # 7. On donne les droits (Hugging Face aime bien l'utilisateur 1000)
26
+ RUN chmod -R 777 /app
27
+
28
+ # 8. La commande de démarrage
29
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, File, UploadFile, HTTPException
2
+ from allosaurus.app import read_recognizer
3
+ from contextlib import asynccontextmanager
4
+ import aiofiles
5
+ import os
6
+ import uuid
7
+
8
+ # Variable globale pour stocker le modèle en mémoire
9
+ ai_context = {}
10
+
11
+ @asynccontextmanager
12
+ async def lifespan(app: FastAPI):
13
+ print("🚀 Démarrage de l'API...")
14
+ try:
15
+ # On charge le modèle en RAM. C'est très rapide car il est déjà sur le disque.
16
+ ai_context["model"] = read_recognizer()
17
+ print("✅ Allosaurus est chargé et prêt !")
18
+ except Exception as e:
19
+ print(f"❌ Erreur au chargement : {e}")
20
+ yield
21
+ ai_context.clear()
22
+
23
+ app = FastAPI(lifespan=lifespan)
24
+
25
+ @app.get("/")
26
+ def home():
27
+ return {"status": "En ligne", "info": "Envoie un fichier audio POST sur /transcribe"}
28
+
29
+ @app.post("/transcribe")
30
+ async def transcribe(file: UploadFile = File(...)):
31
+ # Vérifier que le modèle est bien là
32
+ if "model" not in ai_context:
33
+ raise HTTPException(status_code=500, detail="Le modèle n'est pas chargé.")
34
+
35
+ # 1. Créer un nom de fichier temporaire unique
36
+ temp_filename = f"temp_{uuid.uuid4()}.wav"
37
+
38
+ try:
39
+ # 2. Sauvegarder le fichier reçu sur le disque du serveur
40
+ async with aiofiles.open(temp_filename, 'wb') as out_file:
41
+ content = await file.read()
42
+ await out_file.write(content)
43
+
44
+ # 3. Lancer la reconnaissance
45
+ model = ai_context["model"]
46
+
47
+ # 'fra' force le modèle à utiliser l'inventaire phonétique français
48
+ phonemes = model.recognize(temp_filename, lang_id='fra')
49
+
50
+ return {
51
+ "ipa": phonemes,
52
+ "filename": file.filename
53
+ }
54
+
55
+ except Exception as e:
56
+ print(f"Erreur : {e}")
57
+ raise HTTPException(status_code=500, detail=str(e))
58
+
59
+ finally:
60
+ # 4. Nettoyage : Toujours supprimer le fichier temporaire
61
+ if os.path.exists(temp_filename):
62
+ os.remove(temp_filename)
download_model.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ from allosaurus.app import read_recognizer
2
+
3
+ print("⬇️ DÉBUT du téléchargement du modèle Allosaurus...")
4
+ # Cela télécharge le modèle 'uni2005' par défaut (environ 200Mo)
5
+ model = read_recognizer()
6
+ print("✅ FIN du téléchargement. Le modèle est prêt.")
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ python-multipart
4
+ aiofiles
5
+ allosaurus
6
+ torch --extra-index-url https://download.pytorch.org/whl/cpu