|
|
from fastapi import APIRouter, UploadFile, File, HTTPException |
|
|
from services.stt_service import speech_to_text |
|
|
from models.stt import STTResponse |
|
|
import tempfile |
|
|
import os |
|
|
|
|
|
router = APIRouter(prefix="/stt", tags=["Speech To Text"]) |
|
|
|
|
|
@router.post("/", response_model=STTResponse) |
|
|
async def convert_speech_to_text(file: UploadFile = File(...)): |
|
|
""" |
|
|
Convert uploaded audio file to text (English only) |
|
|
""" |
|
|
|
|
|
if not file.content_type or not file.content_type.startswith('audio/'): |
|
|
raise HTTPException(status_code=400, detail="File must be an audio file") |
|
|
|
|
|
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_file: |
|
|
temp_path = temp_file.name |
|
|
content = await file.read() |
|
|
|
|
|
if len(content) == 0: |
|
|
os.unlink(temp_path) |
|
|
raise HTTPException(status_code=400, detail="Audio file is empty") |
|
|
|
|
|
temp_file.write(content) |
|
|
|
|
|
try: |
|
|
|
|
|
text = speech_to_text(temp_path) |
|
|
|
|
|
|
|
|
os.unlink(temp_path) |
|
|
|
|
|
return STTResponse(text=text) |
|
|
|
|
|
except Exception as e: |
|
|
|
|
|
if os.path.exists(temp_path): |
|
|
os.unlink(temp_path) |
|
|
raise HTTPException(status_code=500, detail=str(e)) |