h-rand commited on
Commit
f0e0a1d
·
verified ·
1 Parent(s): df28ccb

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -0
app.py ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, Response, HTTPException
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from melo.api import TTS
4
+ import os
5
+
6
+ app = FastAPI()
7
+
8
+ app.add_middleware(
9
+ CORSMiddleware,
10
+ allow_origins=["*"],
11
+ allow_methods=["*"],
12
+ allow_headers=["*"],
13
+ )
14
+
15
+ # Stockage des modèles chargés
16
+ models = {}
17
+ device = 'cpu'
18
+
19
+ print("⏳ Initialisation de MeloTTS...")
20
+
21
+ try:
22
+ # On pré-charge le Français et l'Anglais
23
+ # C'est rapide et léger avec Melo
24
+ print(" - Chargement FR...")
25
+ models['FR'] = TTS(language='FR', device=device)
26
+
27
+ print(" - Chargement EN...")
28
+ models['EN'] = TTS(language='EN', device=device)
29
+
30
+ print("✅ MeloTTS Prêt (FR + EN) !")
31
+ except Exception as e:
32
+ print(f"❌ Erreur au chargement : {e}")
33
+
34
+ @app.post("/tts")
35
+ async def generate_speech(data: dict):
36
+ text = data.get("text", "")
37
+ lang = data.get("lang", "FR").upper() # Par défaut FR
38
+ speed = data.get("speed", 1.0)
39
+
40
+ if not text:
41
+ raise HTTPException(status_code=400, detail="Texte vide")
42
+
43
+ # Vérification si la langue est chargée
44
+ if lang not in models:
45
+ # Tentative de chargement dynamique (si vous demandez ES ou ZH par exemple)
46
+ try:
47
+ print(f"⏳ Chargement dynamique de {lang}...")
48
+ models[lang] = TTS(language=lang, device=device)
49
+ except Exception as e:
50
+ raise HTTPException(status_code=400, detail=f"Langue {lang} non supportée ou erreur: {e}")
51
+
52
+ model = models[lang]
53
+ speaker_ids = model.hps.data.spk2id
54
+
55
+ # MeloTTS utilise souvent le code langue comme ID speaker (ex: 'FR')
56
+ # Mais parfois c'est 'EN-US', 'EN-BR', etc. pour l'anglais.
57
+ # On prend le premier dispo si la clé exacte n'existe pas.
58
+ spk_id = speaker_ids.get(lang, list(speaker_ids.values())[0])
59
+
60
+ output_path = f"/tmp/output_{os.getpid()}.wav"
61
+
62
+ try:
63
+ model.tts_to_file(text, spk_id, output_path, speed=speed)
64
+
65
+ with open(output_path, "rb") as f:
66
+ audio_data = f.read()
67
+
68
+ return Response(content=audio_data, media_type="audio/wav")
69
+
70
+ except Exception as e:
71
+ print(f"❌ Erreur génération : {e}")
72
+ return Response(content=str(e), status_code=500)
73
+
74
+ @app.get("/")
75
+ def home():
76
+ return {"status": "MeloTTS API Ready", "loaded_langs": list(models.keys())}