GENIE / api.py
Tom1986's picture
feat: Implement Genie TTS API with text-to-speech and voice cloning functionalities
9bc318e
"""
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
@api_app.on_event("startup")
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
@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__":
# 直接运行API服务(仅用于开发测试)
import uvicorn
logger.info("🔧 开发模式启动")
uvicorn.run(
api_app,
host="0.0.0.0",
port=8000,
log_level="info",
reload=True
)