from typing import Literal import numpy as np from pydantic import BaseModel, Field, field_validator class OpenAICreateSpeechRequest(BaseModel): input: str model: str | None = None voice: Literal["alloy", "ash", "ballad", "coral", "echo", "fable", "onyx", "nova", "sage", "shimmer", "verse"] instructions: str | None = None response_format: Literal["wav", "pcm", "flac", "mp3", "aac", "opus"] speed: float | None = Field( default=1.0, ge=0.25, le=4.0, ) stream_format: Literal["sse", "audio"] | None = "audio" @field_validator("stream_format") @classmethod def validate_stream_format(cls, v: str) -> str: if v == "sse": raise ValueError("'sse' is not a supported stream_format yet. Please use 'audio'.") return v class CreateAudio(BaseModel): audio_tensor: np.ndarray sample_rate: int = 24000 response_format: str = "wav" speed: float = 1.0 stream_format: Literal["sse", "audio"] | None = "audio" base64_encode: bool = True class Config: arbitrary_types_allowed = True class AudioResponse(BaseModel): audio_data: bytes | str media_type: str