File size: 2,108 Bytes
c45f0d6
2da4544
 
4c992d0
27ee35f
2da4544
 
 
 
a71355d
c45f0d6
9c9026a
4c992d0
c45f0d6
 
4c992d0
9930d31
4c992d0
 
 
 
 
9930d31
4c992d0
 
 
 
 
 
 
 
 
9930d31
4c992d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c9026a
4c992d0
 
 
 
c45f0d6
 
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
from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse
from models.tts import TTSRequest
from services.tts_service import text_to_speech, text_to_speech_base64
from pathlib import Path

router = APIRouter(prefix="/tts", tags=["Text To Speech"])

@router.post("/")
async def generate_tts(request: TTSRequest):
    """
    Convert text to speech using the free gTTS backend (MP3 only).
    Can return either Base64 or file based on return_base64 parameter.
    """
    try:
        # Option 1: Return Base64
        if getattr(request, "return_base64", False):
            result = text_to_speech_base64(
                text=request.text,
                voice=request.voice,
                fmt=request.format,
            )

            return {
                "success": True,
                "audio_base64": result["audio_base64"],
                "mime_type": result["mime_type"],
                "format": result["format"],
                "filename": result["filename"],
                "size_bytes": result["size_bytes"],
                "size_base64": result["size_base64"]
            }

        # Option 2: Return file (default behavior)
        else:
            audio_path = text_to_speech(
                text=request.text,
                voice=request.voice,
                fmt=request.format,
            )

            if not Path(audio_path).exists():
                raise HTTPException(status_code=500, detail="Audio file generation failed")

            media_type = "audio/mpeg"

            return FileResponse(
                path=audio_path,
                filename=f"speech.{request.format}",
                media_type=media_type,
                headers={
                    "Content-Disposition": f"attachment; filename=speech.{request.format}"
                },
            )

    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))