From d515d4456bba9d6df183aee8fce79a7ffc372702 Mon Sep 17 00:00:00 2001 From: game-loader Date: Tue, 6 Jan 2026 16:32:16 +0800 Subject: [PATCH] feat(tts): add text-to-speech endpoint --- api/main.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/api/main.py b/api/main.py index 0e6ff80..0e0f08e 100644 --- a/api/main.py +++ b/api/main.py @@ -12,7 +12,13 @@ import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from chat_service import ChatService -from config import OPENAI_API_BASE_URL_CONFIG, OPENAI_API_KEY_FROM_CONFIG, OPENAI_LLM_MODEL +from config import ( + DEFAULT_USER_ID, + OPENAI_API_BASE_URL_CONFIG, + OPENAI_API_KEY_FROM_CONFIG, + OPENAI_LLM_MODEL, +) +from api.doubao_tts import text_to_speech from logging_config import setup_logging, get_logger # 设置日志 @@ -44,6 +50,19 @@ class ChatResponse(BaseModel): audio_error: Optional[str] = None +class TTSRequest(BaseModel): + text: str + user_id: Optional[str] = None + + +class TTSResponse(BaseModel): + success: bool + audio_data: Optional[str] = None # base64 编码的音频数据 + message: Optional[str] = None + user_id: Optional[str] = None + error: Optional[str] = None + + # 全局聊天服务实例 chat_service = ChatService() @@ -180,6 +199,38 @@ async def chat_stream_endpoint(request: Request): ) +@app.post("/tts", response_model=TTSResponse) +async def tts_endpoint(request: TTSRequest): + """ + 文本转语音接口 + + 仅负责将输入文本转为 base64 音频数据 + """ + text = request.text.strip() if request.text else "" + if not text: + raise HTTPException(status_code=400, detail="text is required") + + user_id = request.user_id or DEFAULT_USER_ID + + try: + success, message, base64_audio = text_to_speech(text, user_id) + if success and base64_audio: + return TTSResponse( + success=True, + audio_data=base64_audio, + message=message, + user_id=user_id + ) + return TTSResponse( + success=False, + message=message, + error=message or "TTS failed", + user_id=user_id + ) + except Exception as e: + raise HTTPException(status_code=500, detail=f"TTS error: {str(e)}") + + if __name__ == "__main__": uvicorn.run( "main:app",