malek-messaoudii
feat: Enhance TTS functionality to support Base64 audio output alongside file response. Introduce new text_to_speech_base64 function for Base64 conversion and update generate_tts endpoint to handle return_base64 parameter.
4c992d0
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 request.return_base64:
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))
@router.post("/base64")
async def generate_tts_base64(request: TTSRequest):
"""
Convert text to speech and return as Base64.
"""
try:
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"]
}
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))