# xiaozhi-webui **Repository Path**: dvlp-org/xiaozhi-webui ## Basic Information - **Project Name**: xiaozhi-webui - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-14 - **Last Updated**: 2025-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xiaozhi-webui > 本项目供学习交流使用,如果有问题欢迎联系 zamyang@qq.com ## 项目简介 声明:「小智」项目起源于 [虾哥](https://github.com/78/xiaozhi-esp32) 之手。 本项目 xiaozhi-webui 是一个使用 Python + Vue3 实现的小智语音 Web 端,旨在通过代码学习和在没有硬件条件下体验 AI 小智的对话功能。 本仓库使用 Vue3 基于 [xiaozhi-web-client](https://github.com/TOM88812/xiaozhi-web-client) 进行重构,并进行了一定的优化和拓展。 小智美美滴头像取自 [小红书 @涂丫丫](http://xhslink.com/a/ZWjAcoOzvzq9) ## 演示
## 常见问题
**1. WebSocket 连接错误**
如果看到类似下面的报错:
```
BaseEventLoop.create_connection() got an unexpected keyword argument 'extra_headers'
```
- 确保使用正确版本的 `websockets` 库(建议 >=15.0.1)
- 运行 `cd backend && uv sync` 重新安装依赖
**2. 中文字符显示乱码**
- 使用 PowerShell 或 Windows Terminal(推荐)
- 在 CMD 中执行 `chcp 65001` 切换编码
- 使用 VS Code 内置终端
**3. 端口占用问题**
- 前端默认端口:5173
- 后端默认端口:5000
- 如有冲突,请在配置文件中修改端口设置
## 项目实现框图
```
reconnect
+-----------+
| |
v |
Text message +------------+ | +-------------------+ +-------------------+
+-----------> | CONNECTING | ---+---> | | ---------> | |
| +------------+ | Websocket | | Xiaozhi |
| +------------+ | Proxy | | Server |
+------------ | AI_SPEAK | <------- | | <--------- | |
Speak complet +------------+ +-------------------+ +-------------------+
```
## 主要逻辑框图
本项目的小智语音通话部分主要使用 "状态驱动" 的设计模式,以下是主要逻辑框图:
```
state change process
+------------------+ +--------------------------+ +------------------+
| oldState.onExit | -----> | current_state = newState | -----> | newState.onEnter |
+------------------+ +--------------------------+ +------------------+
```
```
user speak process +--------------------------------+
| circulation |
v |
+--------------------+ +--------------------+ +------------------------+
| getUserMediaStream | -----> | detect audio level | -----> | handleUserAudioLevel() |
+--------------------+ +--------------------+ +------------------------+
```
```
ai speak process
+----------------------------------------------------------+
| audioQueue.empty() ? |
+----------------------------------------------------------+
| no | yes ^
v v |
+---------------------------+ +--------------+ |
| audio = audioQueue.pop() | | state = idle | |
+---------------------------+ +--------------+ |
| |
v |
+------------+ +------+
| play audio | -----------------------------------> | done |
+------------+ +------+
```
## 项目结构
```
├── backend/ # 后端目录
│ ├── app/
│ | ├── constant/ # 常量
│ | ├── proxy/ # websocket 代理
│ | ├── router/ # 路由
│ | ├── utils/ # 工具函数
│ │ └── config.py # 配置
│ ├── libs/ # 第三方库文件
│ ├── main.py # 后端入口
│ ├── pyproject.toml # Python 项目配置
│ └── uv.lock # Python 依赖锁定文件
├── src/ # 前端源码目录
│ ├── assets/ # 静态资源
│ ├── components/ # Vue 组件
│ ├── services/ # 模块化服务
│ ├── stores/ # 全局状态管理
│ ├── types/ # TypeScript 类型定义
│ ├── App.vue # 前端入口组件
│ └── main.ts # 前端入口文件
├── public/ # 公共静态资源
├── images/ # 项目展示图片
├── package.json # 前端项目配置
├── pnpm-lock.yaml # 前端依赖锁定文件
├── vite.config.ts # Vite 配置
├── tsconfig.json # TypeScript 配置
├── .gitignore
├── LICENSE
└── README.md
```
## 技术栈
**前端**
- 框架: Vue3 + TypeScript + Pinia
- 构建工具:Vite
- 包管理器:pnpm
- UI 组件:Element Plus
- Web API:WebSocket、Web Audio API、AudioWorklet
**后端**
- Python>=3.12 + FastAPI
- 包管理器:uv
**开发工具**
- concurrently:同时运行前后端服务
- TypeScript:类型安全
- Less:CSS 预处理器
## 贡献
欢迎提交问题报告和代码贡献。请确保遵循以下规范:
1. Python 代码风格符合 PEP8 规范
2. Vue 代码按单一指责进行模块化管理
3. 更新相关文档
## 感谢以下开源/分享人员(排名不分前后)
[虾哥](https://github.com/78)
[Huang-junsen](https://github.com/huangjunsen0406)
[TOM88812](https://github.com/TOM88812)
[小红书 @涂丫丫](http://xhslink.com/a/ZWjAcoOzvzq9)
## Star 历史
[](https://www.star-history.com/#yang-zhihang/xiaozhi-webui&Date)