| """ |
| 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 |
| ) |
|
|