File size: 2,005 Bytes
ded8778
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from fastapi import FastAPI, File, UploadFile, HTTPException
from allosaurus.app import read_recognizer
from contextlib import asynccontextmanager
import aiofiles
import os
import uuid

# Variable globale pour stocker le modèle en mémoire
ai_context = {}

@asynccontextmanager
async def lifespan(app: FastAPI):
    print("🚀 Démarrage de l'API...")
    try:
        # On charge le modèle en RAM. C'est très rapide car il est déjà sur le disque.
        ai_context["model"] = read_recognizer()
        print("✅ Allosaurus est chargé et prêt !")
    except Exception as e:
        print(f"❌ Erreur au chargement : {e}")
    yield
    ai_context.clear()

app = FastAPI(lifespan=lifespan)

@app.get("/")
def home():
    return {"status": "En ligne", "info": "Envoie un fichier audio POST sur /transcribe"}

@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...)):
    # Vérifier que le modèle est bien là
    if "model" not in ai_context:
        raise HTTPException(status_code=500, detail="Le modèle n'est pas chargé.")

    # 1. Créer un nom de fichier temporaire unique
    temp_filename = f"temp_{uuid.uuid4()}.wav"
    
    try:
        # 2. Sauvegarder le fichier reçu sur le disque du serveur
        async with aiofiles.open(temp_filename, 'wb') as out_file:
            content = await file.read()
            await out_file.write(content)

        # 3. Lancer la reconnaissance
        model = ai_context["model"]
        
        # 'fra' force le modèle à utiliser l'inventaire phonétique français
        phonemes = model.recognize(temp_filename, lang_id='fra')
        
        return {
            "ipa": phonemes,
            "filename": file.filename
        }

    except Exception as e:
        print(f"Erreur : {e}")
        raise HTTPException(status_code=500, detail=str(e))
        
    finally:
        # 4. Nettoyage : Toujours supprimer le fichier temporaire
        if os.path.exists(temp_filename):
            os.remove(temp_filename)