File size: 1,820 Bytes
c7e434a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
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
    
    # Results dari masing-masing analisis
    tempo: Optional[Dict[str, Any]] = None
    articulation: Optional[Dict[str, Any]] = None
    structure: Optional[Dict[str, Any]] = None
    keywords: Optional[Dict[str, Any]] = None
    
    # Summary
    overall_score: Optional[float] = None
    processing_time: Optional[float] = None