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