from __future__ import annotations from typing import Literal from pydantic import BaseModel, Field class WSMessage(BaseModel): type: Literal["start", "text", "stop", "ping"] class WSStartMessage(WSMessage): type: Literal["start"] = "start" model: str = "neutts-nano-q4-gguf" voice: str = "jo" response_format: Literal["mp3", "opus", "aac", "flac", "wav", "pcm"] = "pcm" sample_rate: int = 24000 class WSTextMessage(WSMessage): type: Literal["text"] = "text" text: str = Field(..., min_length=1) class WSStopMessage(WSMessage): type: Literal["stop"] = "stop" class WSPingMessage(WSMessage): type: Literal["ping"] = "ping" class WSResponseMessage(BaseModel): type: Literal["audio", "error", "done", "pong"] data: str | None = None message: str | None = None format: str | None = None