Randriamiandry commited on
Commit
bc155b3
·
1 Parent(s): 1069e69

Ajout de l'API Pocket TTS avec FastAPI

Browse files
Files changed (3) hide show
  1. Dockerfile +18 -0
  2. app.py +54 -0
  3. requirements.txt +4 -0
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ # Empêche Python de créer des fichiers .pyc et active les logs en temps réel
4
+ ENV PYTHONDONTWRITEBYTECODE=1
5
+ ENV PYTHONUNBUFFERED=1
6
+
7
+ # Définit le répertoire de travail
8
+ WORKDIR /app
9
+
10
+ # Copie et installe les dépendances
11
+ COPY requirements.txt .
12
+ RUN pip install --no-cache-dir -r requirements.txt
13
+
14
+ # Copie le reste du code
15
+ COPY . .
16
+
17
+ # Commande pour lancer le serveur FastAPI avec Uvicorn
18
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import io
2
+ from fastapi import FastAPI, HTTPException
3
+ from fastapi.responses import Response
4
+ from pydantic import BaseModel
5
+ from pocket_tts import TTSModel
6
+ import scipy.io.wavfile
7
+ import numpy as np
8
+
9
+ # --- Chargement du modèle (une seule fois au démarrage) ---
10
+ print("Chargement du modèle Pocket TTS...")
11
+ tts_model = TTSModel.load_model()
12
+
13
+ # Sélection d'une voix pré-définie. La liste est disponible ici :
14
+ # https://huggingface.co/kyutai/tts-voices
15
+ # Tu peux aussi utiliser un fichier audio local (.wav)
16
+ VOICE_NAME = "alba" # Choisis parmi 'alba', 'gentle', 'friendly', etc.
17
+ voice_state = tts_model.get_state_for_audio_prompt(VOICE_NAME)
18
+ print("Modèle chargé et prêt !")
19
+ # --- Fin du chargement ---
20
+
21
+ app = FastAPI(title="API Pocket TTS",
22
+ description="Une API simple pour générer de la parole à partir de texte avec Pocket TTS.",
23
+ version="1.0")
24
+
25
+ # Modèle de données pour la requête POST
26
+ class TTSRequest(BaseModel):
27
+ text: str
28
+
29
+ @app.get("/")
30
+ def root():
31
+ return {"message": "Bienvenue sur l'API Pocket TTS. Utilisez l'endpoint /tts pour générer de l'audio."}
32
+
33
+ @app.post("/tts")
34
+ async def generate_speech(request: TTSRequest):
35
+ """
36
+ Reçoit du texte et retourne un fichier audio WAV.
37
+ """
38
+ text = request.text
39
+ if not text:
40
+ raise HTTPException(status_code=400, detail="Le texte ne peut pas être vide.")
41
+
42
+ print(f"Génération de l'audio pour : {text[:50]}...")
43
+
44
+ # Générer l'audio : le résultat est un tenseur PyTorch
45
+ audio_tensor = tts_model.generate_audio(voice_state, text)
46
+
47
+ # Convertir le tenseur en tableau NumPy et le sauvegarder dans un buffer en mémoire
48
+ audio_numpy = audio_tensor.numpy().astype(np.int16)
49
+ buffer = io.BytesIO()
50
+ scipy.io.wavfile.write(buffer, tts_model.sample_rate, audio_numpy)
51
+ buffer.seek(0) # Retourner au début du buffer
52
+
53
+ # Retourner le fichier audio WAV
54
+ return Response(content=buffer.read(), media_type="audio/wav")
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ fastapi
2
+ uvicorn[standard]
3
+ pocket-tts
4
+ scipy