from pydantic import AliasChoices, Field, field_validator from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") @field_validator("webrtc_host", mode="before") @classmethod def normalize_listen_host(cls, value: str) -> str: host = str(value or "0.0.0.0").strip().lower() if host in {"127.0.0.1", "localhost", "::1"}: return "0.0.0.0" return host or "0.0.0.0" hf_token: str = "" llm_api_key: str = Field( default="", validation_alias=AliasChoices("LLM_API_KEY", "DEEPSEEK_API_KEY", "OPENAI_API_KEY"), ) llm_base_url: str = Field( default="https://api.deepseek.com/v1", validation_alias=AliasChoices("LLM_BASE_URL", "DEEPSEEK_BASE_URL", "OPENAI_BASE_URL"), ) llm_model: str = Field( default="deepseek-chat", validation_alias=AliasChoices("LLM_MODEL", "DEEPSEEK_MODEL", "OPENAI_MODEL"), ) llm_timeout: int = 8 llm_max_tokens: int = 150 llm_temperature: float = 0.55 llm_system_prompt: str = ( "你是一个自然、友好的中文语音助手。" "请像真人当面聊天一样回答,口语化、简洁、自然,通常 1 到 2 句。" "不要使用书面公告腔,不要分点,不要长段解释,不要夸张语气词。" "不要虚构身份关系,不要自称家人、恋人或其他私人身份。" "避免客服套话,比如‘随时为你服务’、‘很高兴为你服务’、‘请问有什么可以帮您’。" "优先使用短句和自然停顿,适合直接语音播报。" ) tts_voice: str = "zf_xiaoxiao" tts_speed: float = 0.9 tts_sentence_max_len: int = 64 tts_segment_pause_ms: int = 90 tts_fade_ms: int = 12 webrtc_host: str = "0.0.0.0" webrtc_port: int = 8080 avatar_fps: int = 25 avatar_driver_mode: str = "blendshape_stream" avatar_control_protocol: str = "ws" avatar_blendshape_schema: str = "arkit" stun_url: str = "stun:stun.l.google.com:19302" cors_origins: str = "*" ssl_certfile: str = "" ssl_keyfile: str = "" # Legacy MuseTalk settings retained for migration reference only. musetalk_enabled: bool = True musetalk_repo_dir: str = "/home/xsl/work/MuseTalk" musetalk_infer_script: str = "/home/xsl/work/MuseTalk/scripts/inference.py" musetalk_source_video: str = "/home/xsl/work/MuseTalk/data/video/yongen.mp4" musetalk_unet_model: str = "/home/xsl/work/MuseTalk/models/musetalkV15/unet.pth" musetalk_unet_config: str = "/home/xsl/work/MuseTalk/models/musetalkV15/musetalk.json" musetalk_whisper_dir: str = "/home/xsl/work/MuseTalk/models/whisper" musetalk_result_dir: str = "/home/xsl/work/MuseTalk/results/visual-chat" settings = Settings()