421 lines
16 KiB
Markdown
Raw Normal View History

2025-07-18 13:14:28 +08:00
---
title: 旧版使用文档
description: py-xiaozhi项目的旧版使用文档提供早期版本的使用指南
outline: deep
---
# py-xiaozhi使用文档请认真阅读使用文档
![Image](https://github.com/user-attachments/assets/df8bd5d2-a8e6-4203-8084-46789fc8e9ad)
## 使用介绍
- 语音模式分为两种长按对话和自动对话,右下角按钮显示的是当前模式
- 长按对话:按住说话松手发送
- 自动对话:点击开始对话即可,当界面显示聆听中就表示到你说话了,说完会自行发送
- gui模式
- F2 键:长按说话
- F3 键:打断对话
- cli模式
- F2 键:按一次开始自动对话
- F3 键:打断对话
## 配置说明
### 项目基础配置
#### 配置文件说明
项目使用两种配置方式:初始配置模板和运行时配置文件。
1. **初始配置模板**
- 位置:`/src/utils/config_manager.py`
- 作用:提供默认配置模板,首次运行时会自动生成配置文件
- 使用场景:首次运行或需要重置配置时修改此文件
2. **运行时配置文件**
- 位置:`/config/config.json`
- 作用:存储实际运行时的配置信息
- 使用场景:日常使用时修改此文件
#### 配置项说明
- 需要什么加什么配置通过config_manager去获取就行了参考websocket或iot\things\temperature_sensor.py
- 例如获取 "MQTT_INFO"的"endpoint" , 通过这样 `config.get_config("MQTT_INFO.endpoint")`就能拿到**endpoint**
```json
{
"CLIENT_ID": "自动生成的客户端ID",
"DEVICE_ID": "设备MAC地址",
"NETWORK": {
"OTA_VERSION_URL": "OTA更新地址",
"WEBSOCKET_URL": "WebSocket服务器地址",
"WEBSOCKET_ACCESS_TOKEN": "访问令牌"
},
"MQTT_INFO": {
"endpoint": "MQTT服务器地址",
"client_id": "MQTT客户端ID",
"username": "MQTT用户名",
"password": "MQTT密码",
"publish_topic": "发布主题",
"subscribe_topic": "订阅主题"
},
"USE_WAKE_WORD": false, // 是否启用语音唤醒
"WAKE_WORDS": [ // 唤醒词列表
"小智",
"你好小明"
],
"WAKE_WORD_MODEL_PATH": "./models/vosk-model-small-cn-0.22", // 唤醒模型路径
"TEMPERATURE_SENSOR_MQTT_INFO": {
"endpoint": "你的Mqtt地址",
"port": 1883,
"username": "admin",
"password": "dtwin@123",
"publish_topic": "sensors/temperature/command",
"subscribe_topic": "sensors/temperature/device_001/state"
},
"CAMERA": { // 视觉配置
"camera_index": 0,
"frame_width": 640,
"frame_height": 480,
"fps": 30,
"Loacl_VL_url": "https://open.bigmodel.cn/api/paas/v4/", // 智普的申请地址 https://open.bigmodel.cn/
"VLapi_key": "你的key"
}
// ...可以添加任意配置
}
```
#### 配置修改指南
1. **首次使用配置**
- 直接运行程序,系统会自动生成默认配置文件
- 如需修改默认值,可编辑 `config_manager.py` 中的 `DEFAULT_CONFIG`
2. **更换服务器配置**
- 打开 `/config/config.json`
- 修改 `NETWORK.WEBSOCKET_URL` 为新的服务器地址
- 示例:
```json
"NETWORK": {
"WEBSOCKET_URL": "ws://你的服务器地址:端口号/"
}
```
3. **启用语音唤醒**
- 修改 `USE_WAKE_WORD``true`
- 可在 `WAKE_WORDS` 数组中添加或修改唤醒词
#### 注意事项
- 修改配置文件后需要重启程序才能生效
- WebSocket URL 必须以 `ws://``wss://` 开头
- 首次运行时会自动生成 CLIENT_ID建议不要手动修改
- DEVICE_ID 默认使用设备MAC地址可按需修改
- 配置文件使用 UTF-8 编码,请使用支持 UTF-8 的编辑器修改
## 启动说明
### 系统依赖安装
#### Windows
1. **安装 FFmpeg**
```bash
# 方法一:使用 Scoop 安装(推荐)
scoop install ffmpeg
# 方法二:手动安装
# 1. 访问 https://github.com/BtbN/FFmpeg-Builds/releases 下载
# 2. 解压并将 bin 目录添加到系统 PATH
```
2. **Opus 音频编解码库**
- 项目默认会自动引入 opus.dll无需手动安装
- 如遇问题,可将 `/libs/windows/opus.dll` 复制到以下位置之一:
- 应用程序目录
- `C:\Windows\System32`
#### Linux (Debian/Ubuntu)
```bash
# 安装系统依赖
sudo apt-get update
sudo apt-get install python3-pyaudio portaudio19-dev ffmpeg libopus0 libopus-dev
# 安装音量控制依赖(以下三选一)
# 1. PulseAudio 工具(推荐)
sudo apt-get install pulseaudio-utils
# 2. 或者 ALSA 工具
sudo apt-get install alsa-utils
# 3. 如果需要使用 alsamixer 方式,还需要安装 expect
sudo apt-get install alsa-utils expect
sudo apt install build-essential python3-dev
```
#### macOS
```bash
# 使用 Homebrew 安装系统依赖
brew install portaudio opus python-tk ffmpeg gfortran
brew upgrade tcl-tk
```
### Python 依赖安装
#### 方式一:使用 venv推荐
```bash
# 1. 创建虚拟环境
python -m venv .venv
# 2. 激活虚拟环境
# Windows
.venv\Scripts\activate
# Linux/macOS
source .venv/bin/activate
# 3. 安装依赖
# Windows/Linux
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
# macOS
pip install -r requirements_mac.txt -i https://mirrors.aliyun.com/pypi/simple
```
#### 方式二:使用 Conda
```bash
# 1. 创建 Conda 环境
conda create -n py-xiaozhi python=3.12
# 2. 激活环境
conda activate py-xiaozhi
# 3. 安装 Conda 特定依赖
conda install conda-forge::libopus
conda install conda-forge::ffmpeg
# 4. 安装 Python 依赖
# Windows/Linux
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
# macOS
pip install -r requirements_mac.txt -i https://mirrors.aliyun.com/pypi/simple
```
### 唤醒词模型
- [唤醒词模型下载](https://alphacephei.com/vosk/models)
- 下载完成后解压放至根目录/models
- 默认读取vosk-model-small-cn-0.22小模型
- ![Image](../images/唤醒词.png)
### IoT功能说明
#### IoT模块结构
```
├── iot # IoT设备相关模块
│ ├── things # 具体设备实现目录
│ │ ├── lamp.py # 智能灯控制实现
│ │ │ └── Lamp # 灯设备类,提供开关、调节亮度、改变颜色等功能
│ │ ├── music_player.py # 音乐播放器实现
│ │ │ └── MusicPlayer # 音乐播放器类,提供播放、暂停、切换歌曲等功能
│ │ └── speaker.py # 音量控制实现
│ │ └── Speaker # 扬声器类,提供音量调节、静音等功能
│ ├── thing.py # IoT设备基类定义
│ │ ├── Thing # 所有IoT设备的抽象基类
│ │ ├── Property # 设备属性类,定义设备的可变状态
│ │ ├── Action # 设备动作类,定义设备可执行的操作
│ │ └── Event # 设备事件类,定义设备可触发的事件
│ └── thing_manager.py # IoT设备管理器统一管理各类设备
│ └── ThingManager # 单例模式实现的设备管理器,负责设备注册、查找和命令分发
```
#### Iot 状态流转
```text
+----------------+
| 用户语音 |
| 指令 |
+-------+-------+
|
v
+-------+-------+
| 语音识别 |
| (STT) |
+-------+-------+
|
v
+-------+-------+
| LLM处理指令 |
| |
+-------+-------+
|
v
+-------+-------+
| 生成物联网命令 |
| |
+-------+-------+
|
v
+---------------+---------------+
| Application接收IoT消息 |
| _handle_iot_message() |
+---------------+---------------+
|
v
+---------------+---------------+
| ThingManager.invoke() |
+---------------+---------------+
|
+------------------+------------------+------------------+
| | | |
v v v v
+----------+-------+ +-------+--------+ +------+---------+ +----+-----------+
| Lamp | | Speaker | | MusicPlayer | | CameraVL |
| (控制灯设备) | | (控制音量设备) | | (播放音乐设备) | | (摄像头与视觉) |
+----------+-------+ +-------+--------+ +------+---------+ +----+-----------+
| | | |
| | | |
| | | |
| | | v
| | | +------+---------+
| | | | Camera.py |
| | | | (摄像头控制) |
| | | +------+---------+
| | | |
| | | v
| | | +------+---------+
| | | | VL.py |
| | | | (视觉识别处理) |
| | | +------+---------+
| | | |
+------------------+------------------+------------------+
|
v
+---------------+---------------+
| 执行设备操作 |
+---------------+---------------+
|
v
+---------------+---------------+
| 更新设备状态 |
| _update_iot_states() |
+---------------+---------------+
|
v
+---------------+---------------+
| 发送状态更新到服务器 |
| send_iot_states(states) |
+---------------+---------------+
|
v
+---------------+---------------+
| 服务器更新设备状态 |
+---------------+---------------+
|
v
+---------------+---------------+
| 返回执行结果给用户 |
| (语音或界面反馈) |
+-------------------------------+
```
#### IoT设备管理
- IoT模块采用灵活的多协议通信架构
- MQTT协议用于与标准物联网设备通信如智能灯、空调等
- HTTP协议用于与Web服务交互如获取在线音乐、调用多模态AI模型等
- 可扩展支持其他协议如WebSocket、TCP等
- 支持自动发现和管理IoT设备
- 可通过语音命令控制IoT设备例如
- "查看当前物联网设备"
- "打开客厅的灯"
- "关闭空调"
- "设置温度为26度"
- "打开摄像头"
- "关闭摄像头"
- "识别画面"
#### 添加新的IoT设备
1.`src/iot/things`目录下创建新的设备类
2. 继承`Thing`基类并实现必要方法
3.`thing_manager.py`中注册新设备
### 注意事项
1. 确保相应的服务器配置正确且可访问:
- MQTT服务器配置用于物联网设备
- API接口地址用于HTTP服务
2. 不同协议的设备/服务需实现对应的连接和通信逻辑
3. 建议为每个新增设备/服务添加基本的错误处理和重连机制
4. 可以通过扩展Thing基类来支持新的通信协议
5. 在添加新设备时,建议先进行通信测试,确保连接稳定
#### 在线音乐配置
- 接入在线音源了,无需自行配置默认可用
### 运行模式说明
#### GUI 模式运行(默认)
```bash
python main.py
```
#### CLI模式运行
```bash
python main.py --mode cli
```
#### 构建打包
使用PyInstaller打包为可执行文件
```bash
# Windows
python scripts/build.py
# macOS
python scripts/build.py
# Linux
python scripts/build.py
```
### 注意事项
1. 建议使用 Python 3.9.13+ 版本,推荐 3.12
2. Windows 用户无需手动安装 opus.dll项目会自动处理
3. 使用 Conda 环境时必须安装 ffmpeg 和 Opus
4. 使用 Conda 环境时请勿和esp32-server共用同一个Conda环境因为服务端websocket依赖版本高于本项目
5. 建议使用国内镜像源安装依赖,可以提高下载速度
6. macOS 用户需使用专门的 requirements_mac.txt
7. 确保系统依赖安装完成后再安装 Python 依赖
8. 如若使用xiaozhi-esp32-server作为服务端该项目只能自动对话才有反应
9. esp32-server视频部署教程 [新版小智ai服务端本地部署完整教程支持DeepSeek接入](https://www.bilibili.com/video/BV1GvQWYZEd2/?share_source=copy_web&vd_source=86370b0cff2da3ab6e3d26eb1cab13d3)
10. 音量控制功能需要安装特定依赖,程序会在启动时自动检查并提示缺少的依赖
### 音量控制功能说明
本应用支持调整系统音量,根据不同操作系统需要安装不同的依赖:
1. **Windows**: 使用 pycaw 和 comtypes 控制系统音量
2. **macOS**: 使用 applescript 控制系统音量
3. **Linux**: 根据系统环境使用 pactl (PulseAudio)、wpctl (PipeWire)、amixer (ALSA) 或 alsamixer 控制音量
应用程序会在启动时自动检查这些依赖是否已安装。如果缺少依赖,将会显示相应的安装指令。
#### 音量控制使用方法
- **GUI模式**: 使用界面上的音量滑块调节音量
- **CLI模式**: 使用 `v <音量值>` 命令调节音量,例如 `v 50` 将音量设置为50%
### 状态流转图
```
+----------------+
| |
v |
+------+ 唤醒词/按钮 +------------+ | +------------+
| IDLE | -----------> | CONNECTING | --+-> | LISTENING |
+------+ +------------+ +------------+
^ |
| | 语音识别完成
| +------------+ v
+--------- | SPEAKING | <-----------------+
完成播放 +------------+
```
## 获取帮助
如果遇到问题:
1. 优先查看 docs/异常汇总.md 文档
2. 通过 GitHub Issues 提交问题
3. 通过 AI 助手寻求帮助
4. 联系作者(主页有微信)(请自备 Todesk 链接并说明来意,作者工作日晚上处理)