feat(tts): add text-to-speech endpoint
Some checks failed
Build and Push Docker / build-and-push (push) Failing after 28s
Some checks failed
Build and Push Docker / build-and-push (push) Failing after 28s
This commit is contained in:
53
api/main.py
53
api/main.py
@@ -12,7 +12,13 @@ import sys
|
|||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from chat_service import ChatService
|
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
|
from logging_config import setup_logging, get_logger
|
||||||
|
|
||||||
# 设置日志
|
# 设置日志
|
||||||
@@ -44,6 +50,19 @@ class ChatResponse(BaseModel):
|
|||||||
audio_error: Optional[str] = None
|
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()
|
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__":
|
if __name__ == "__main__":
|
||||||
uvicorn.run(
|
uvicorn.run(
|
||||||
"main:app",
|
"main:app",
|
||||||
|
|||||||
Reference in New Issue
Block a user