|
|
""" |
|
|
Genie TTS API 主应用 |
|
|
整合所有模块,提供完整的API服务 |
|
|
""" |
|
|
|
|
|
import asyncio |
|
|
import logging |
|
|
from datetime import datetime |
|
|
|
|
|
from fastapi import FastAPI, HTTPException |
|
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
|
|
|
|
|
|
from tts_engine import GenieTTSInterface |
|
|
from voice_cloning import VoiceCloner |
|
|
from api_routes import ( |
|
|
basic_router, tts_router, voice_clone_router, character_router, set_engines |
|
|
) |
|
|
from models import create_error_response |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
api_app = FastAPI( |
|
|
title="Genie TTS API", |
|
|
description=""" |
|
|
# 🎵 Genie TTS API |
|
|
|
|
|
高质量日语文本转语音API服务,基于 GPT-SoVITS V2 架构 |
|
|
|
|
|
## ✨ 主要功能 |
|
|
- **🎯 文本转语音**: 使用预训练角色进行语音合成 |
|
|
- **🎭 语音克隆**: 基于参考音频快速克隆声音 |
|
|
- **📊 音频分析**: 分析音频质量和特征 |
|
|
- **🔄 批量处理**: 支持批量文本转语音 |
|
|
|
|
|
## 🌟 特色 |
|
|
- 零样本语音合成 |
|
|
- 轻量级ONNX推理 |
|
|
- CPU友好设计 |
|
|
- 支持日语语音合成 |
|
|
|
|
|
## 📚 使用指南 |
|
|
1. 查看 `/health` 确认服务状态 |
|
|
2. 使用 `/tts/synthesize` 进行基础语音合成 |
|
|
3. 通过 `/voice-clone/create` 创建个性化声音 |
|
|
4. 使用 `/voice-clone/synthesize` 进行克隆声音合成 |
|
|
""", |
|
|
version="1.0.0", |
|
|
docs_url="/docs", |
|
|
redoc_url="/redoc" |
|
|
) |
|
|
|
|
|
|
|
|
api_app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=["*"], |
|
|
allow_credentials=True, |
|
|
allow_methods=["*"], |
|
|
allow_headers=["*"], |
|
|
) |
|
|
|
|
|
|
|
|
tts_engine = None |
|
|
voice_cloner = None |
|
|
|
|
|
|
|
|
@api_app.on_event("startup") |
|
|
async def startup_event(): |
|
|
"""应用启动时初始化所有服务""" |
|
|
global tts_engine, voice_cloner |
|
|
|
|
|
logger.info("🚀 正在初始化Genie TTS API服务...") |
|
|
|
|
|
try: |
|
|
|
|
|
logger.info("📝 初始化TTS引擎...") |
|
|
tts_engine = GenieTTSInterface() |
|
|
await asyncio.get_event_loop().run_in_executor(None, tts_engine.initialize_engine) |
|
|
|
|
|
|
|
|
logger.info("🎭 初始化语音克隆器...") |
|
|
voice_cloner = VoiceCloner(tts_engine) |
|
|
|
|
|
|
|
|
set_engines(tts_engine, voice_cloner) |
|
|
|
|
|
logger.info("✅ Genie TTS API服务初始化成功") |
|
|
logger.info("🌐 API文档地址: /docs") |
|
|
logger.info("📖 ReDoc文档地址: /redoc") |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"❌ 初始化失败: {e}") |
|
|
tts_engine = None |
|
|
voice_cloner = None |
|
|
|
|
|
|
|
|
@api_app.on_event("shutdown") |
|
|
async def shutdown_event(): |
|
|
"""应用关闭时清理资源""" |
|
|
global tts_engine, voice_cloner |
|
|
|
|
|
logger.info("🧹 正在清理资源...") |
|
|
|
|
|
try: |
|
|
|
|
|
|
|
|
logger.info("✅ 资源清理完成") |
|
|
except Exception as e: |
|
|
logger.error(f"❌ 资源清理失败: {e}") |
|
|
|
|
|
|
|
|
|
|
|
api_app.include_router(basic_router) |
|
|
api_app.include_router(tts_router) |
|
|
api_app.include_router(voice_clone_router) |
|
|
api_app.include_router(character_router) |
|
|
|
|
|
|
|
|
|
|
|
@api_app.exception_handler(HTTPException) |
|
|
async def http_exception_handler(request, exc): |
|
|
"""HTTP异常处理器""" |
|
|
return create_error_response(exc.detail, exc.status_code) |
|
|
|
|
|
|
|
|
@api_app.exception_handler(Exception) |
|
|
async def general_exception_handler(request, exc): |
|
|
"""通用异常处理器""" |
|
|
logger.error(f"未处理的异常: {exc}") |
|
|
return create_error_response("内部服务器错误", 500) |
|
|
|
|
|
|
|
|
def create_api_interface(): |
|
|
"""创建API接口,用于与Gradio应用集成""" |
|
|
return api_app |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
import uvicorn |
|
|
|
|
|
logger.info("🔧 开发模式启动") |
|
|
uvicorn.run( |
|
|
api_app, |
|
|
host="0.0.0.0", |
|
|
port=8000, |
|
|
log_level="info", |
|
|
reload=True |
|
|
) |
|
|
|