| from fastapi import FastAPI, Response |
| from pydantic import BaseModel |
| from kokoro import KPipeline |
| import soundfile as sf |
| import numpy as np |
| import io |
|
|
| app = FastAPI() |
|
|
| |
| |
| pipeline = KPipeline(lang_code='f') |
|
|
| class TTSRequest(BaseModel): |
| input: str |
| voice: str = "ff_siwis" |
| speed: float = 1.0 |
|
|
| @app.get("/") |
| def home(): |
| return { |
| "status": "En ligne", |
| "astuce": "Utilisez le format 'voix1+voix2' pour fusionner des voix avec un accent !" |
| } |
| @app.post("/v1/audio/speech") |
| def generate_audio(request: TTSRequest): |
| |
| if "+" in request.voice: |
| |
| voice_names = request.voice.split("+") |
| tensors = [] |
| for name in voice_names: |
| try: |
| |
| t = pipeline.load_voice(name.strip()) |
| tensors.append(t) |
| except Exception as e: |
| print(f"Erreur avec la voix {name}: {e}") |
| |
| |
| if tensors: |
| voice_param = sum(tensors) / len(tensors) |
| else: |
| voice_param = "ff_siwis" |
| else: |
| |
| voice_param = request.voice |
|
|
| |
| generator = pipeline(request.input, voice=voice_param, speed=request.speed) |
| |
| |
| audio_chunks = [] |
| for _, _, audio in generator: |
| audio_chunks.append(audio) |
| |
| if not audio_chunks: |
| return Response(status_code=500, content="Erreur lors de la génération") |
| |
| |
| final_audio = np.concatenate(audio_chunks) |
| |
| |
| out = io.BytesIO() |
| sf.write(out, final_audio, 24000, format='wav') |
| return Response(content=out.getvalue(), media_type="audio/wav") |