项目地址:https://github.com/joey-zhou/xiaozhi-esp32-server-java
1. 项目整体结构与功能模块说明
1.1 顶层目录结构
- src/ Java主代码目录,包含所有后端业务逻辑、控制器、服务、实体、工具类等。
- web/ 前端 Vue 项目,包含页面、组件、服务等。
- db/ 数据库初始化和迁移 SQL 脚本。
- models/、lib/ 语音/AI相关模型和本地库。
- audio/、uploads/、logs/ 存放音频、上传文件、日志等。
- Dockerfile-*、docker-compose.yml Docker 部署相关文件。
- README.md、LICENSE、CHANGELOG.md 项目说明、协议、变更日志等。
1.2 后端 Java 代码结构(src/main/java/com/xiaozhi/)
- common/ 通用配置、异常、拦截器、Web工具等。
- communication/ 设备/消息通信协议、WebSocket、消息处理等。
- controller/ 各种 REST API 控制器。
- dao/ MyBatis Mapper 接口。
- dialogue/ 对话、LLM、语音识别/合成、工具调用等。
- entity/ 数据库实体类。
- enums/ 枚举类型。
- event/ 事件定义。
- mapper/ MyBatis XML 映射文件。
- security/ 认证相关。
- service/ 业务服务接口与实现。
- utils/ 工具类。
- XiaozhiApplication.java Spring Boot 启动类。
1.3 前端 Vue 代码结构(web/)
- src/components/ 通用组件。
- src/views/ 页面视图。
- src/services/ API、WebSocket等服务。
- src/store/ Vuex 状态管理。
- src/utils/ 工具函数。
- src/router/ 路由配置。
2. 核心业务流程梳理
2.1 典型流程:用户与设备对话
- 前端页面 用户在 web/src/views/page/Chat.vue 页面输入消息。
- 前端 API 调用 通过 web/src/services/api.js 发送请求到后端 /message 接口。
- 后端 Controller MessageController.java 接收请求,调用 DialogueService 处理。
- 业务服务 DialogueService.java 负责对话逻辑,可能调用 LLM、TTS、STT、设备通信等。
- 消息通信 通过 communication/server/websocket/WebSocketHandler.java 与设备进行 WebSocket 通信。
- 数据库操作 通过 dao/MessageMapper.java 读写消息记录。
- 响应前端 处理结果返回前端,前端页面展示。
1. 各术语含义
- LLM(Large Language Model):大语言模型,比如 ChatGPT、文心一言等,用于理解和生成自然语言文本。
- TTS(Text To Speech):文本转语音,把文字内容合成语音。
- STT(Speech To Text):语音转文本,把用户说的话识别成文字。
- 设备通信:指后端与物联网设备(如 ESP32)之间的数据交互,通常用 WebSocket、MQTT 等协议。
2. 项目中各模块实现位置
2.1 LLM(大语言模型)
- 主要在 src/main/java/com/xiaozhi/dialogue/llm/ 目录下实现。
- ChatService.java:对话主逻辑,负责与 LLM 交互。
- providers/ 目录下有不同 LLM 平台的适配器,如 CozeChatModel.java、DifyChatModel.java。
- factory/ChatModelFactory.java:根据配置选择不同 LLM。
2.2 TTS(文本转语音)
- 主要在 src/main/java/com/xiaozhi/dialogue/tts/ 目录下实现。
- TtsService.java:TTS 服务接口。
- providers/ 目录下有不同 TTS 平台的实现,如 AliyunTtsService.java、EdgeTtsService.java、MiniMaxTtsService.java。
- factory/TtsServiceFactory.java:TTS 服务工厂,选择具体实现。
2.3 STT(语音转文本)
- 主要在 src/main/java/com/xiaozhi/dialogue/stt/ 目录下实现。
- SttService.java:STT 服务接口。
- providers/ 目录下有不同 STT 平台的实现,如 AliyunSttService.java、FunASRSttService.java、TencentSttService.java。
- factory/SttServiceFactory.java:STT 服务工厂,选择具体实现。
2.4 设备通信
- 主要在 src/main/java/com/xiaozhi/communication/ 目录下实现。
- server/websocket/WebSocketHandler.java:WebSocket 服务器端处理。
- common/MessageHandler.java、SessionManager.java:消息分发与会话管理。
3. 文字如何变成语音并到前端播放?
3.1 典型流程
- 用户在前端输入消息,通过 API 发送到后端。
- 后端 LLM 生成回复文本(如 ChatService 调用 LLM)。
- 后端调用 TTS 服务,将 LLM 生成的文本转为语音文件(如 MP3、WAV)。
- 后端将语音文件的 URL 或二进制数据返回给前端。
- 前端收到语音数据后,使用
代码流程举例
- DialogueService.java 负责整体对话流程,收到文本后会调用 TTS 服务。
- TTS 服务(如 AliyunTtsService.java)生成音频文件,保存到服务器或直接返回音频流。
- Controller(如 MessageController.java)将音频文件的访问地址或音频数据返回给前端。
- 前端(如 ChatComponent.vue 或 AudioPlayer.vue)拿到音频地址后,自动播放。
4. 相关文件/类快速索引
功能 |
主要目录/文件 |
LLM |
dialogue/llm/ChatService.java、dialogue/llm/providers/ |
TTS |
dialogue/tts/TtsService.java、dialogue/tts/providers/ |
STT |
dialogue/stt/SttService.java、dialogue/stt/providers/ |
设备通信 |
communication/server/websocket/WebSocketHandler.java、communication/common/ |
5. 总结
- 文字转语音到前端播放的流程是:LLM 生成文字 → TTS 合成语音 → 后端返回音频 → 前端播放。