你现在是一个资深的 Python 后端架构师和音视频流媒体专家。请帮我从零搭建一个名为 openclaw-proxy 的轻量级异步 WebSocket 中间件服务。 项目背景: 这个服务将运行在我的 Linux 云服务器上,作为“小智 ESP32 语音硬件”和“OpenClaw 智能体 (Butler)”之间的翻译网关。 核心架构与功能需求: 基础框架:请使用 FastAPI 配合 websockets 模块搭建服务端,监听 0.0.0.0:8000 的 /chat 路由。使用 FastAPI 是为了以后方便扩展 HTTP 管理接口。 协议分离处理:小智的 WebSocket 连接会混合发送两种数据: JSON 文本帧:包含硬件状态(如按键按下、松开、唤醒词触发等)。 二进制帧 (Binary):Opus 编码的音频流。 请写一个强壮的 Router,能够精确区分并分别处理这两种帧。 核心三段式管线 (Mock 优先): 为了让我能快速跑通软硬件握手,请帮我把处理管线模块化,并用 Mock(假数据)填充核心函数: async def process_stt(audio_bytes) -> str: 接收 Opus 音频流,返回 Mock 文本 "测试语音输入"。请在注释里写明后续如何用 ffmpeg-python 或 pydub 将 Opus 转为 WAV 的思路。 async def call_openclaw(text) -> str: 模拟调用大模型,使用 asyncio.sleep(2) 模拟思考延迟,返回 Mock 文本 "这是来自 Butler 的测试回复"。 async def process_tts(text) -> bytes: 模拟文本转音频,返回一段空的或写死的二进制音频流,代表生成的 Opus 音频。 硬件状态安抚 (UX 优化): 在进入 call_openclaw 模拟思考的 2 秒钟内,必须通过 WebSocket 向客户端(小智)下发至少一次状态 JSON(例如 {"type": "state", "status": "thinking"}),用来触发硬件的呼吸灯状态。 日志规范: 使用 Python 标准的 logging 模块,设置 INFO 级别。在“收到连接”、“开始 STT”、“发给大模型”、“开始 TTS”、“推送音频”这几个关键节点打上清晰的日志,方便我看着终端排查握手协议。 输出要求: 请帮我生成完整的 main.py 代码,并提供 requirements.txt。代码必须是异步、非阻塞的,保持极简和高内聚。