""" API数据模型定义 包含所有API请求和响应的数据模型 """ from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime class TTSRequest(BaseModel): """TTS请求模型""" text: str = Field(..., description="要转换的文本", min_length=1, max_length=1000) character: str = Field(default="misono_mika", description="角色模型名称") speed: float = Field(default=1.0, description="语速倍率", ge=0.5, le=2.0) format: str = Field(default="wav", description="输出格式", pattern="^(wav|mp3)$") class TTSResponse(BaseModel): """TTS响应模型""" success: bool message: str audio_url: Optional[str] = None duration: Optional[float] = None character: str timestamp: str class VoiceCloneRequest(BaseModel): """语音克隆请求模型""" voice_name: str = Field(..., description="克隆声音名称", min_length=1, max_length=50) reference_audio_url: str = Field(..., description="参考音频文件URL或路径") reference_text: str = Field(..., description="参考音频对应的文本", min_length=3, max_length=500) description: Optional[str] = Field("", description="声音描述") class AudioAnalysisResponse(BaseModel): """音频分析响应模型""" duration: float sample_rate: int quality_score: float recommendations: List[str] class CharacterInfo(BaseModel): """角色信息模型""" name: str description: str type: str language: str model_size_mb: Optional[int] = None class HealthResponse(BaseModel): """健康检查响应模型""" status: str version: str engine_status: str available_characters: List[str] predefined_characters: int custom_characters: int cloned_voices: int timestamp: str class ErrorResponse(BaseModel): """错误响应模型""" success: bool = False error: str code: int timestamp: str class BatchTTSResponse(BaseModel): """批量TTS响应模型""" success: bool results: List[dict] total: int completed: int timestamp: str def create_success_response(message: str, data: dict = None) -> dict: """创建成功响应""" response = { "success": True, "message": message, "timestamp": datetime.now().isoformat() } if data: response.update(data) return response def create_error_response(error: str, code: int = 500) -> dict: """创建错误响应""" return { "success": False, "error": error, "code": code, "timestamp": datetime.now().isoformat() }