feat: 添加TTS语音合成功能 - Edge TTS方案完整实现,ChatTTS预留接口
This commit is contained in:
69
server.py
69
server.py
@@ -11,8 +11,13 @@ from datetime import datetime
|
||||
import aiohttp
|
||||
from fastapi import FastAPI, UploadFile, File, HTTPException, Form
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import FileResponse
|
||||
from pydantic import BaseModel
|
||||
|
||||
# 导入 TTS 服务
|
||||
from tts_service import tts_manager, AUDIO_DIR
|
||||
|
||||
# 配置
|
||||
MODEL_SERVICE_URL = os.getenv("MODEL_SERVICE_URL", "http://localhost:19018")
|
||||
PORT = int(os.getenv("PORT", "19019"))
|
||||
@@ -186,6 +191,70 @@ async def delete_conversation(conversation_id: str):
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
# ========== TTS 相关接口 ==========
|
||||
|
||||
class TTSSettings(BaseModel):
|
||||
"""TTS 设置"""
|
||||
provider: str = "none"
|
||||
voice: Optional[str] = None
|
||||
|
||||
|
||||
class TTSResponse(BaseModel):
|
||||
"""TTS 响应"""
|
||||
audio_url: Optional[str]
|
||||
provider: str
|
||||
|
||||
|
||||
@app.get("/tts/providers")
|
||||
async def get_tts_providers():
|
||||
"""获取可用的 TTS 方案列表"""
|
||||
providers = tts_manager.list_providers()
|
||||
voices = tts_manager.get_edge_voices()
|
||||
return {
|
||||
"providers": providers,
|
||||
"voices": voices,
|
||||
"current": tts_manager.current_provider
|
||||
}
|
||||
|
||||
|
||||
@app.post("/tts/settings")
|
||||
async def set_tts_settings(settings: TTSSettings):
|
||||
"""设置 TTS 方案"""
|
||||
tts_manager.set_provider(settings.provider)
|
||||
|
||||
# 设置音色(仅 Edge TTS)
|
||||
if settings.provider == "edge" and settings.voice:
|
||||
provider = tts_manager.get_provider("edge")
|
||||
if hasattr(provider, 'set_voice'):
|
||||
provider.set_voice(settings.voice)
|
||||
|
||||
return {
|
||||
"provider": settings.provider,
|
||||
"voice": settings.voice
|
||||
}
|
||||
|
||||
|
||||
@app.post("/tts/synthesize")
|
||||
async def synthesize_tts(text: str = Form(...), provider: Optional[str] = Form(None)):
|
||||
"""
|
||||
合成语音
|
||||
返回音频文件 URL
|
||||
"""
|
||||
try:
|
||||
audio_url = await tts_manager.synthesize(text, provider)
|
||||
return TTSResponse(
|
||||
audio_url=audio_url,
|
||||
provider=provider or tts_manager.current_provider
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"TTS synthesis error: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
# 挂载音频文件目录
|
||||
app.mount("/audio", StaticFiles(directory=AUDIO_DIR), name="audio")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=PORT)
|
||||
Reference in New Issue
Block a user