# oxa-server **Repository Path**: ReviewClouds/oxa-server ## Basic Information - **Project Name**: oxa-server - **Description**: testtesteste - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-08 - **Last Updated**: 2025-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Oxa-Server: 小爱同学 Docker 定制增强脚本 [中文](#中文) | [English](#english) --- ## 中文 ### 简介 本项目是一个基于 [open-xiaoai](https://github.com/idootop/open-xiaoai) 项目 `xiaozhi` 示例的深度定制增强方案。 它旨在通过 Docker Volume 挂载的方式,以**最小的侵入性**,极大地增强和自定义小爱同学的功能。你无需修改原版 Docker 镜像,只需在官方运行命令的基础上,额外挂载你自己的 `config.py` 文件和 `oxa_ext` 扩展目录,即可实现免唤醒、组合指令、执行自定义 Python 代码等高级功能。 ### ✨ 特性 - **最小侵入**:只需额外挂载 `config.py` 和 `oxa_ext` 目录,即可在原版功能基础上无缝增强。 - **结构化配置**:使用 `AppConfigBuilder` 构建器,配置逻辑更清晰、更易于维护。 - **免唤醒指令**:将常用指令配置为免唤醒关键词,直接说出即可执行,无需先说 "小爱同学"。 - **强大的指令映射**:轻松将一句口语指令映射到一个或多个动作(原生指令或自定义函数)。 - **Python 函数无缝集成**:可以直接在指令中调用自定义的 Python 函数(同步或异步),实现网络唤醒(WOL)、API 调用、执行 Shell 命令等复杂操作。 - **依赖自动安装**:如果自定义函数需要新的 Python 包,脚本会自动尝试安装,简化部署。 ### 🚀 如何使用 #### 1. 准备工作:成功运行原版 `open-xiaoai` 本项目是 `open-xiaoai` 的一个**增强配置**,而非独立应用。因此,你 **必须** 首先根据官方文档成功部署并运行 `open-xiaoai` 的 `xiaozhi` 示例。这一步是为了确保你的基础环境、设备连接和 Token 等都是正常的。 > **重要**: 请严格参考官方 `xiaozhi` 示例的部署指南完成基础配置。所有关于设备 ID、Token 获取、设备绑定等问题,均以官方文档为准。 > > **官方文档地址**: [https://github.com/idootop/open-xiaoai/tree/main/examples/xiaozhi](https://github.com/idootop/open-xiaoai/tree/main/examples/xiaozhi) 在确认你的 `open-xiaoai` 容器可以正常工作后,停止并移除该临时容器,再进行下一步。 ```bash # 停止并移除用于测试的官方容器 docker stop oxa-server && docker rm oxa-server ``` #### 2. 使用本项目进行增强部署 与官方步骤几乎完全一样,唯一的区别是**额外挂载了本项目的 `config.py` 和 `oxa_ext` 目录**。 1. **下载文件**: 将本项目的 `config.py` 文件和 `oxa_ext` 整个目录下载到你的服务器上。 2. **修改配置**: 打开 `config.py`,根据你的需求修改指令映射和相关配置。 3. **启动增强版容器**: 在 `config.py` 和 `oxa_ext` 所在的目录下,执行以下命令启动容器。 > **核心提示**: 对比官方命令,我们只增加了两个 `-v` 参数来挂载我们自己的逻辑,其他保持不变。 ```bash # 基础命令与官方一致,仅增加 volume 挂载 docker run -itd \ --name oxa-server \ -p 4399:4399 \ -v "$(pwd)/config.py:/app/config.py" \ -v "$(pwd)/oxa_ext:/app/oxa_ext" \ --restart=always \ idootop/open-xiaoai:xiaozhi ``` ### ⚙️ 配置说明 所有配置均在 `config.py` 中完成,核心是 `AppConfigBuilder` 构建器。 ```python # config.py APP_CONFIG = AppConfigBuilder( # 1. 免唤醒直接执行的指令 direct_vad_command_map={ # a. 将多个指令映射到同一个动作 **map_all_to(("调整颜色", "切换色温", "请开夜灯", "请关夜灯"), ["色温分段"]), # b. 批量生成开关指令 **map_the_switches(*lights_all, *appliances_extra), # 上一行等同于: # "请开空调": ["打开空调"], "请关空调": ["关闭空调"], # "请开风扇": ["打开风扇"], "请关风扇": ["关闭风扇"], # ... # c. 将指令映射到自定义的 Python 函数 "空调升速": ["空调风速升高"], "空调降速": ["空调风速降低"], "空调降温": ["空调温度降低"], "空调升温": ["空调温度升高"], "风扇定时": ["风扇计时器"], "风扇风类": ["调整风类"], "点亮阳台": on(*lights_balcony), "熄灭阳台": off(*lights_balcony), "灯光全灭": off(*lights_all), "关灯空调": off(*lights_all, "空调"), "全部关闭": off(*appliances_all), "请开电脑": [wake_up_computer], "请关电脑": ["关闭我的电脑"], "重启电脑": ["我的电脑设置为一"], "切换屏幕": ["我的电脑设置为三"], "测试电脑": ["我的电脑设置为七"], "联合关闭": ["关闭我的电脑", "关闭电视"], "联合启动": [wake_up_computer, "打开电视"], }, # 2. 用于“唤醒”小智,进入连续对话模式的关键词 direct_vad_wakeup_keywords=["小智小智"], # 3. 在小爱原生对话中,用于“抢麦”并唤醒小智的关键词 xiaoai_wakeup_keywords=["召唤小智"], on_execute_play_text="", # 禁用执行指令后的提示音,保持安静 # ... 其他配置,请参考 config.py 文件 ... ).build() ``` #### `wol(computer_mac, broadcast_ip)` 一个辅助函数,用于生成网络唤醒 (Wake-on-LAN) 的指令。它会发送一个魔法包来启动指定 MAC 地址的电脑。 ```python # config.py wake_up_computer = wol(computer_mac="08BFB8A67CE2", broadcast_ip="192.168.100.255") # ... 然后在 direct_vad_command_map 中使用 "请开电脑": [wake_up_computer], ``` #### `on(*devices)` 和 `off(*devices)` 这两个辅助函数用于快速生成针对一组设备的“打开”或“关闭”小爱原生指令列表。在 `config.py` 中,你可以先定义好不同位置或类别的设备列表,然后直接使用 `on()` 或 `off()` 来生成组合指令。 例如,在 `config.py` 中: ```python lights_balcony = ["台灯", "副灯"] appliances_extra = ["空调", "风扇", "电视"] lights_all = [*lights_balcony, "主灯"] appliances_all = [*lights_all, *appliances_extra, "我的电脑"] # ... 然后在 direct_vad_command_map 中使用 "点亮阳台": on(*lights_balcony), "熄灭阳台": off(*lights_balcony), "灯光全灭": off(*lights_all), "全部关闭": off(*appliances_all), ``` 这使得管理大量设备的开关指令变得非常简洁和灵活。 #### `direct_vad_command_map` 这是最核心的**免唤醒指令表**。当小爱同学识别到这里的键(key),会直接执行对应的值(value),无需先说“小爱同学”。 - **值(Actions)** 可以是: - `["小爱原生指令"]`: 一个包含字符串的列表,将执行小爱音箱的原生指令。 - `[自定义函数]`: 一个包含 Python 函数的列表,将直接调用你定义的函数。 - 混合列表: `[自定义函数, "小爱原生指令", ...]`,将按顺序执行。 #### `map_the_switches(*devices)` 一个辅助函数,用于快速生成设备的标准“开/关”指令。例如 `map_the_switches("空调", "灯")` 会自动创建 `请开空调`、`请关空调`、`请开灯`、`请关灯` 四个指令。 #### 进阶配置 (可选) `AppConfigBuilder` 还提供了一些可选参数,用于微调小智的行为。 - **`xiaoai_extension_command_map`**: 定义一组特殊的指令。当你在和小爱同学正常对话时,如果说出这里的指令,小智会**中断**小爱的当前任务并执行该指令。这对于需要立即响应的控制非常有用。 - **`wakeup_timeout`**: 唤醒超时(秒)。当使用 `direct_vad_wakeup_keywords` 唤醒小智后,它会在此时间内等待你的下一条指令,超时后会自动退出唤醒状态。默认为 `5` 秒。 - **`on_wakeup_play_text`**: 唤醒提示音。唤醒小智后播放的文本。默认为 `"小智来了"`。 - **`on_execute_play_text`**: 执行提示音。当一个免唤醒指令执行完毕后播放的文本。默认为 `"已执行"`。 - **`on_exit_play_text`**: 退出提示音。小智退出唤醒状态时播放的文本。默认为 `"主人再见"`。 ### 🐍 自定义 Python 函数 你可以在 `config.py` 的顶部自由编写自己的 Python 异步函数,并在 `direct_vad_command_map` 中引用它们。 ```python # config.py import asyncio from oxa_ext.utils import ensure_dependencies, ... # 示例:一个网络唤醒电脑的函数 async def wake_up_computer(_): # 确保依赖已安装 ensure_dependencies(["wakeonlan"]) # 你的逻辑... print("已发送网络唤醒包。") # ... 在 AppConfigBuilder 中使用 # "请开电脑": [wake_up_computer], ``` `ensure_dependencies` 函数会自动检查并使用 `pip` 安装缺失的库,让你的自定义功能开箱即用。 ### Roadmap + [ ] 改造 cut_in_xiaoai,创建 windows 专门客户端,便于控制电脑 + [ ] 接入连续对话支持。创建遥控器模式。 + [ ] 层级命令,开启某个关键词后,可以直接识别一些操作。(如两次-> *,电视遥控->电视遥控操作) ### 🔗 关联项目 - **[open-xiaoai](https://github.com/idootop/open-xiaoai)**: 本项目的基础,一个功能强大的小米智能音箱开放平台项目。 --- ## English ### Introduction This project provides a deeply customized enhancement solution based on the `xiaozhi` example from the [open-xiaoai](https://github.com/idootop/open-xiaoai) project. It is designed to significantly enhance and customize the functionality of your Xiaoai Speaker with **minimal intrusion** using Docker volume mounting. You don't need to modify the original Docker image. Simply add extra volume mounts for your `config.py` file and the `oxa_ext` directory to the official run command to enable features like wake-word-free commands, command chains, and custom Python code execution. ### ✨ Features - **Minimal Intrusion**: Seamlessly enhances original functionality by just adding extra mounts for `config.py` and the `oxa_ext` directory. - **Structured Configuration**: Uses the `AppConfigBuilder` for a cleaner and more maintainable configuration logic. - **Wake-Word-Free Commands**: Configure frequently used commands to be executed directly without saying the "Xiaoai Tongxue" wake-word first. - **Powerful Command Mapping**: Easily map a spoken phrase to one or more actions (native commands or custom functions). - **Seamless Python Function Integration**: Directly call custom Python functions (sync or async) within commands to perform complex operations like Wake-on-LAN (WOL), API calls, or executing shell commands. - **Automatic Dependency Installation**: If a custom function requires a new Python package, the script will automatically attempt to install it, simplifying deployment. ### 🚀 How to Use #### 1. Prerequisite: Successfully Run the Original `open-xiaoai` This project is an **enhanced configuration** for `open-xiaoai`, not a standalone application. Therefore, you **must** first successfully deploy and run the `xiaozhi` example according to the official documentation. This step ensures that your basic environment, device connection, and Token are all working correctly. > **Important**: Please strictly follow the official `xiaozhi` example's deployment guide for the basic setup. All issues related to Device ID, Token acquisition, and device binding should refer to the official documentation. > > **Official Documentation**: [https://github.com/idootop/open-xiaoai/tree/main/examples/xiaozhi](https://github.com/idootop/open-xiaoai/tree/main/examples/xiaozhi) After confirming that your `open-xiaoai` container works, stop and remove that temporary container before proceeding. ```bash # Stop and remove the official container used for testing docker stop oxa-server && docker rm oxa-server ``` #### 2. Enhanced Deployment with This Project The process is almost identical to the official steps, with the only difference being the **additional mounting of this project's `config.py` and `oxa_ext` directory**. 1. **Download Files**: Download this project's `config.py` file and the entire `oxa_ext` directory to your server. 2. **Modify Configuration**: Open `config.py` and modify the command mappings and other settings to suit your needs. 3. **Start the Enhanced Container**: In the directory where `config.py` and `oxa_ext` are located, run the following command. > **Key Tip**: Compared to the official command, we only add two `-v` flags to mount our custom logic; everything else remains the same. ```bash # The base command is the same as the official one, just with added volume mounts docker run -itd \ --name oxa-server \ -p 4399:4399 \ -v "$(pwd)/config.py:/app/config.py" \ -v "$(pwd)/oxa_ext:/app/oxa_ext" \ --restart=always \ idootop/open-xiaoai:xiaozhi ``` ### ⚙️ Configuration Explanation All configurations are done in `config.py`, with the `AppConfigBuilder` being the core component. ```python # config.py APP_CONFIG = AppConfigBuilder( # 1. Wake-word-free commands that execute directly direct_vad_command_map={ # a. Map multiple phrases to the same action **map_all_to(("adjust color", "switch color temperature", "turn on night light", "turn off night light"), ["color temperature segment"]), # b. Batch generate on/off commands **map_the_switches(*lights_all, *appliances_extra), # The line above is equivalent to: # "turn on AC": ["turn on AC"], "turn off AC": ["turn off AC"], # "turn on Fan": ["turn on Fan"], "turn off Fan": ["turn off Fan"], # ... # c. Map a command to a custom Python function "AC speed up": ["AC fan speed up"], "AC speed down": ["AC fan speed down"], "AC cool down": ["AC temperature down"], "AC heat up": ["AC temperature up"], "fan timer": ["fan timer"], "fan mode": ["adjust fan mode"], "light up balcony": on(*lights_balcony), "turn off balcony lights": off(*lights_balcony), "all lights off": off(*lights_all), "turn off AC lights": off(*lights_all, "AC"), "turn all off": off(*appliances_all), "turn on PC": [wake_up_computer], "turn off PC": ["turn off my PC"], "restart PC": ["set my PC to one"], "switch screen": ["set my PC to three"], "test PC": ["set my PC to seven"], "joint shutdown": ["turn off my PC", "turn off TV"], "joint startup": [wake_up_computer, "turn on TV"], # 2. Keywords to "wake up" Xiaozhi for continuous dialogue direct_vad_wakeup_keywords=["hey zhi"], # 3. Keywords to "interrupt" native Xiaoai and wake up Xiaozhi xiaoai_wakeup_keywords=["summon xiaozhi"], on_execute_play_text="", # Disable the prompt sound after command execution for quiet operation # ... other configurations, please refer to the config.py file ... ).build() ``` #### `wol(computer_mac, broadcast_ip)` A helper function to generate Wake-on-LAN (WOL) commands. It sends a magic packet to start a computer with the specified MAC address. ```python # config.py wake_up_computer = wol(computer_mac="08BFB8A67CE2", broadcast_ip="192.168.100.255") # ... then use in direct_vad_command_map "turn on PC": [wake_up_computer], ``` #### `on(*devices)` and `off(*devices)` These two helper functions are used to quickly generate lists of native Xiaoai "turn on" or "turn off" commands for a group of devices. In `config.py`, you can first define lists of devices by location or category, and then directly use `on()` or `off()` to generate combined commands. For example, in `config.py`: ```python lights_balcony = ["balcony lamp", "side lamp"] appliances_extra = ["AC", "Fan", "TV"] lights_all = [*lights_balcony, "main light"] appliances_all = [*lights_all, *appliances_extra, "my PC"] # ... then use in direct_vad_command_map "light up balcony": on(*lights_balcony), "turn off balcony lights": off(*lights_balcony), "all lights off": off(*lights_all), "turn all off": off(*appliances_all), ``` This makes managing on/off commands for a large number of devices very concise and flexible. #### `direct_vad_command_map` This is the core **wake-word-free command table**. When Xiaoai Speaker recognizes a key from this map, it will execute the corresponding value directly. - **Value (Actions)** can be: - `["Native Xiaoai Command"]`: A list of strings for native commands. - `[custom_function]`: A list containing a Python function to be called. - A mixed list: `[custom_function, "Native Command", ...]`, executed in sequence. #### `map_the_switches(*devices)` A helper function to quickly generate standard "on/off" commands for devices. For example, `map_the_switches("AC", "Light")` will automatically create commands for `turn on AC`, `turn off AC`, `turn on Light`, and `turn off Light`. #### Advanced Configuration (Optional) `AppConfigBuilder` also provides several optional parameters to fine-tune Xiaozhi's behavior. - **`xiaoai_extension_command_map`**: Defines a special set of commands. If you say one of these commands during a normal conversation with the native Xiaoai, Xiaozhi will **interrupt** the current task and execute the command. This is useful for controls that require immediate response. - **`wakeup_timeout`**: Wake-up timeout (in seconds). After waking up Xiaozhi with a keyword from `direct_vad_wakeup_keywords`, it will wait for your next command for this duration before automatically exiting the awakened state. Defaults to `5` seconds. - **`on_wakeup_play_text`**: Text played upon wake-up. Defaults to `"Xiaozhi is here"`. - **`on_execute_play_text`**: Text played after a wake-word-free command is executed. Defaults to `"Done"`. - **`on_exit_play_text`**: Text played when Xiaozhi exits the awakened state. Defaults to `"Goodbye, master"`. ### 🐍 Custom Python Functions You can write your own async Python functions at the top of `config.py` and reference them in the `direct_vad_command_map`. ```python # config.py import asyncio from oxa_ext.utils import ensure_dependencies, ... # Example: A function to wake up a computer via Wake-on-LAN async def wake_up_computer(_): ensure_dependencies(["wakeonlan"]) # Your logic here... print("Magic packet sent.") # ... Use it in AppConfigBuilder # "turn on PC": [wake_up_computer], ``` The `ensure_dependencies` function automatically checks and installs missing libraries, making your custom features work out of the box. ### Roadmap + [ ] 改造 cut_in_xiaoai,创建 windows 专门客户端,便于控制电脑 + [ ] 接入连续对话支持。创建遥控器模式。 + [ ] 层级命令,开启某个关键词后,可以直接识别一些操作。(如两次-> *,电视遥控->电视遥控操作) ### 🔗 Related Projects - **[open-xiaoai](https://github.com/idootop/open-xiaoai)**: The foundation of this project, a powerful open platform for Xiaomi smart speakers.