""" Esquema de resultado esperado de modelos de transcripción. Propósito: Define el formato estándar de los resultados devueltos por los modelos de transcripción de audio, independientemente del proveedor de IA utilizado. Homologación: Garantiza que el resultado de la transcripción siempre se entregue en el mismo formato estándar para Qualidot. Pendiente (recomendación personal): - Definir mejor la estructura de cada segmento según las opciones avanzadas (diarization, timestamps, sentiment) - Delimitar los proveedores de IA soportados inicialmente """ from dataclasses import dataclass from fastapi import UploadFile from fastapi.params import File, Form from pydantic import BaseModel, Field from typing import List, Optional @dataclass class AudioRequestFile: """Modelo de solicitud para transcripción de audio.""" file: UploadFile = File(..., description="Archivo de audio a procesar (ej. mp3, wav)") provider: str = Form(..., description="Proveedor de IA a utilizar (ej. openai, assemblyai)") model: str = Form(..., description="Modelo de IA a utilizar (ej. whisper-1)") diarization: Optional[bool] = Form(False, description="Activa la separación e identificación de múltiples hablantes") timestamps: Optional[bool] = Form(False, description="Activa las marcas de tiempo exactas por cada segmento hablado") sentiment: Optional[bool] = Form(False, description="Activa el análisis de sentimiento (POSITIVO/NEGATIVO) por segmento") class TranscriptionSegment(BaseModel): """Modelo que representa un segmento de transcripción de audio detallado.""" text: str = Field( ..., description="Texto transcrito en este fragmento específico" ) speaker: Optional[str] = Field( None, description="Identificador del hablante (ej. 'Speaker A') si diarization está activo" ) start_time: Optional[float] = Field( None, description="Marca de tiempo en segundos donde inicia el segmento" ) end_time: Optional[float] = Field( None, description="Marca de tiempo en segundos donde termina el segmento" ) sentiment: Optional[str] = Field( None, description="Sentimiento detectado en el segmento (ej. 'POSITIVE', 'NEGATIVE')" ) class StandardTranscriptionResult(BaseModel): """Modelo que representa el resultado estándar de una transcripción de audio para Qualidot.""" status: str = Field( ..., description="Estado final de la petición ('success' o 'error')" ) original_filename: str = Field( ..., description="Nombre original del archivo de audio procesado" ) provider_used: str = Field( ..., description="Proveedor de IA que ejecutó la transcripción (ej. OpenAI)" ) model_used: str = Field( ..., description="Modelo específico utilizado para el proceso" ) full_transcript: Optional[str] = Field( None, description="Texto completo y continuo de toda la transcripción" ) segments: Optional[List[TranscriptionSegment]] = Field( None, description="Lista detallada de segmentos si se solicitaron opciones avanzadas (diarization, timestamps, sentiment)" ) confidence_score: Optional[float] = Field( None, description="Nivel de certeza global del modelo (valor entre 0.0 y 1.0)" )