|
|
""" |
|
|
Pydantic models untuk request/response |
|
|
""" |
|
|
|
|
|
from pydantic import BaseModel, Field |
|
|
from typing import Optional, Dict, Any, List |
|
|
from enum import Enum |
|
|
|
|
|
|
|
|
class TaskStatus(str, Enum): |
|
|
"""Task status enum""" |
|
|
QUEUED = "queued" |
|
|
PROCESSING = "processing" |
|
|
COMPLETED = "completed" |
|
|
FAILED = "failed" |
|
|
|
|
|
|
|
|
class AnalysisRequest(BaseModel): |
|
|
"""Request untuk analisis audio""" |
|
|
reference_text: Optional[str] = Field(None, description="Teks referensi untuk perbandingan") |
|
|
topic_id: Optional[str] = Field(None, description="ID topik untuk analisis kata kunci") |
|
|
analyze_tempo: bool = Field(True, description="Analisis tempo dan jeda") |
|
|
analyze_articulation: bool = Field(True, description="Analisis artikulasi/pronunciation") |
|
|
analyze_structure: bool = Field(True, description="Analisis struktur berbicara") |
|
|
analyze_keywords: bool = Field(False, description="Analisis kata kunci (perlu topic_id)") |
|
|
|
|
|
|
|
|
class TaskResponse(BaseModel): |
|
|
"""Response untuk submit task""" |
|
|
task_id: str |
|
|
status: TaskStatus |
|
|
message: str |
|
|
|
|
|
|
|
|
class TaskStatusResponse(BaseModel): |
|
|
"""Response untuk check status task""" |
|
|
task_id: str |
|
|
status: TaskStatus |
|
|
progress: Optional[float] = None |
|
|
result: Optional[Dict[str, Any]] = None |
|
|
error: Optional[str] = None |
|
|
created_at: Optional[str] = None |
|
|
updated_at: Optional[str] = None |
|
|
|
|
|
|
|
|
class AnalysisResult(BaseModel): |
|
|
"""Full analysis result""" |
|
|
task_id: str |
|
|
status: str |
|
|
transcript: str |
|
|
|
|
|
|
|
|
tempo: Optional[Dict[str, Any]] = None |
|
|
articulation: Optional[Dict[str, Any]] = None |
|
|
structure: Optional[Dict[str, Any]] = None |
|
|
keywords: Optional[Dict[str, Any]] = None |
|
|
|
|
|
|
|
|
overall_score: Optional[float] = None |
|
|
processing_time: Optional[float] = None |
|
|
|