Spaces:
Sleeping
Sleeping
| """ | |
| 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__) | |
| # 创建FastAPI应用 | |
| 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" | |
| ) | |
| # 添加CORS中间件 | |
| api_app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], # 生产环境中应该限制具体域名 | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # 全局引擎实例 | |
| tts_engine = None | |
| voice_cloner = None | |
| async def startup_event(): | |
| """应用启动时初始化所有服务""" | |
| global tts_engine, voice_cloner | |
| logger.info("🚀 正在初始化Genie TTS API服务...") | |
| try: | |
| # 1. 初始化TTS引擎 | |
| logger.info("📝 初始化TTS引擎...") | |
| tts_engine = GenieTTSInterface() | |
| await asyncio.get_event_loop().run_in_executor(None, tts_engine.initialize_engine) | |
| # 2. 初始化语音克隆器 | |
| logger.info("🎭 初始化语音克隆器...") | |
| voice_cloner = VoiceCloner(tts_engine) | |
| # 3. 设置路由引擎 | |
| 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 | |
| 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) | |
| # 全局异常处理器 | |
| async def http_exception_handler(request, exc): | |
| """HTTP异常处理器""" | |
| return create_error_response(exc.detail, exc.status_code) | |
| 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__": | |
| # 直接运行API服务(仅用于开发测试) | |
| import uvicorn | |
| logger.info("🔧 开发模式启动") | |
| uvicorn.run( | |
| api_app, | |
| host="0.0.0.0", | |
| port=8000, | |
| log_level="info", | |
| reload=True | |
| ) | |