> 技术文档 > 关于小智开源Java版实现流程及原理_小智java

关于小智开源Java版实现流程及原理_小智java


项目地址: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 典型流程:用户与设备对话

  1. 前端页面 用户在 web/src/views/page/Chat.vue 页面输入消息。
  2. 前端 API 调用 通过 web/src/services/api.js 发送请求到后端 /message 接口。
  3. 后端 Controller MessageController.java 接收请求,调用 DialogueService 处理。
  4. 业务服务 DialogueService.java 负责对话逻辑,可能调用 LLM、TTS、STT、设备通信等。
  5. 消息通信 通过 communication/server/websocket/WebSocketHandler.java 与设备进行 WebSocket 通信。
  6. 数据库操作 通过 dao/MessageMapper.java 读写消息记录。
  7. 响应前端 处理结果返回前端,前端页面展示。

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:消息分发与会话管理。
  • domain/ 目录下定义了各种消息格式。

3. 文字如何变成语音并到前端播放?

3.1 典型流程

  1. 用户在前端输入消息,通过 API 发送到后端。
  1. 后端 LLM 生成回复文本(如 ChatService 调用 LLM)。
  1. 后端调用 TTS 服务,将 LLM 生成的文本转为语音文件(如 MP3、WAV)。
  1. 后端将语音文件的 URL 或二进制数据返回给前端。
  1. 前端收到语音数据后,使用 
代码流程举例
  • 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 负责“把文字变成语音”。
  • STT 负责“把语音变成文字”。
  • 设备通信负责“和硬件设备实时交互”。
  • 文字转语音到前端播放的流程是:LLM 生成文字 → TTS 合成语音 → 后端返回音频 → 前端播放。