| from fastapi import FastAPI, HTTPException |
| from fastapi.responses import Response, StreamingResponse |
| from pydantic import BaseModel |
| import uvicorn |
|
|
| |
| from tts_engine import engine |
|
|
| app = FastAPI(title="Ani Voice API", version="1.0.0") |
|
|
| class SynthesizeRequest(BaseModel): |
| text: str |
| voice_style: str = "F5" |
| speed: float = 1.6 |
|
|
| @app.post("/api/v1/synthesize") |
| def synthesize_full_audio(request: SynthesizeRequest): |
| """ |
| Генерира аудио за целия текст и го връща като един WAV файл. |
| Подходящо за кратки съобщения. |
| """ |
| try: |
| audio_bytes = engine.synthesize_full(request.text, request.voice_style, request.speed) |
| if not audio_bytes: |
| raise HTTPException(status_code=400, detail="Неуспешно генериране на аудио (празен текст?).") |
| |
| return Response(content=audio_bytes, media_type="audio/wav") |
| except Exception as e: |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
| import base64 |
| import json |
|
|
| @app.post("/api/v1/synthesize/stream") |
| def synthesize_stream_audio(request: SynthesizeRequest): |
| """ |
| Стрийминг endpoint, който връща аудио на парчета (chunks). |
| Всеки ред е JSON обект: {"chunk_index": i, "audio_base64": "..."} |
| """ |
| def generate(): |
| try: |
| for i, audio_bytes in enumerate(engine.synthesize_stream(request.text, request.voice_style, request.speed)): |
| encoded = base64.b64encode(audio_bytes).decode("utf-8") |
| yield json.dumps({"chunk_index": i, "audio_base64": encoded}) + "\n" |
| except Exception as e: |
| print(f"Грешка по време на стрийминг: {e}") |
| yield json.dumps({"error": str(e)}) + "\n" |
| |
| return StreamingResponse(generate(), media_type="application/x-ndjson") |
|
|
| if __name__ == "__main__": |
| print("Стартиране на Ani Voice API сървър на порт 8000...") |
| uvicorn.run("api:app", host="0.0.0.0", port=8000, reload=False) |
|
|