- InterviewSimulatorApplication.java: Spring Boot启动类
- application.yml: 应用配置文件(数据库、JWT、虚拟人配置等)
- AuthController.java: 用户认证控制器
/api/auth/register: 用户注册/api/auth/login: 用户登录/api/auth/validate: JWT验证
- InterviewController.java: 面试控制器
/api/interview/start: 开始面试/api/interview/end: 结束面试/api/interview/types: 获取面试类型/api/interview/history: 获取历史记录
- AvatarController.java: 虚拟人控制器
/api/avatar/start: 启动虚拟人/api/avatar/send: 发送消息(大模型交互)/api/avatar/stop: 关闭虚拟人
- GlobalExceptionHandler.java: 全局异常处理
- PythonController.java:音频视频模态分析脚本控制器
/api/python/analyze: 得到分析结果
- UserService.java: 用户业务逻辑
- LargeModelService.java: AI模型服务
- AvatarService.java: 虚拟人服务(核心)
- AiResponseService.java: AI回复缓存和保存服务(新增)
- CustomUserDetailsService.java: Spring Security用户服务
- PythonScriptService.java: 运行模态分析脚本
- User.java: 用户实体
- InterviewRecord.java: 面试记录实体
- AiResponse.java: AI回复实体(新增)
- InterviewType.java: 面试类型枚举
- AuthRequest.java: 认证请求DTO
- JwtResponse.java: JWT响应DTO
- QuestionResponse.java: 问题响应DTO
- AnswerRequest.java: 答案请求DTO
- ScoreResponse.java: 评分响应DTO
- ScoreFeedback.java: 评分反馈DTO
- UserRepository.java: 用户数据访问
- InterviewRecordRepository.java: 面试记录数据访问
- AiResponseRepository.java: AI回复数据访问(新增)
- SecurityConfig.java: 安全配置
- AvatarConfig.java: 虚拟人配置
- JwtAuthenticationFilter.java: JWT认证过滤器
- AvatarWebSocketClient.java: 虚拟人WebSocket客户端
- JwtUtil.java: JWT工具类
- AuthUtil.java: 讯飞认证工具类
- 创建MySQL数据库
- 配置application.yml(包括虚拟人配置)
- 运行
mvn spring-boot:run - 访问 http://localhost:8080
在 src/main/resources/application.yml 中配置:
avatar:
app_id: 你的appid
api_key: 你的apikey
api_secret: 你的apisecret
avatar_id: 你的avatarId
vcn: 你的vcn
scene_id: 你的scene_id
# python脚本配置
python:
interpreter: D:/miniconda3/envs/ship/python.exe,改成你的python运行环境
env: python3.9+torch+ffmpegMaven 依赖:
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.3</version>
</dependency>- 接口:
POST /api/avatar/start - 功能: 启动虚拟人会话,建立WebSocket连接
- 返回:
{ "api_url": "https://rtc-api.xf-yun.com/v1/rtc/play/", "session": "session_id", "stream_url": "webrtc://...", "status": "ok" }
- 接口:
POST /api/avatar/send - 参数:
sessionId: 会话IDtext: 消息内容
- 功能: 发送消息给虚拟人,触发大模型交互
- 返回:
{ "status": "ok", "msg": "消息已发送" }
- 接口:
POST /api/avatar/stop - 参数:
sessionId: 会话ID - 功能: 关闭虚拟人会话,释放资源
- 返回:
{ "status": "ok", "msg": "avatar会话已关闭" }
- 流式分片合并: 自动合并同一轮AI回复的多个流式片段
- JSON数组存储: 每轮完整AI回复作为JSON数组的一个元素
- 批量保存: 面试结束时一次性保存所有轮次的AI回复
- 内存缓存: 面试过程中AI回复缓存在内存,避免频繁数据库操作
- 分片接收: WebSocket接收AI回复的流式分片
- 分片缓存: 按
request_id分组缓存分片 - 片段合并: 当
status=2时合并该轮所有分片为完整回复 - 完整回复缓存: 将完整回复添加到面试的回复数组
- 批量保存: 面试结束时将回复数组保存为JSON格式
[
"第1轮完整AI回复内容",
"第2轮完整AI回复内容",
"第3轮完整AI回复内容"
]-- 查询第1轮AI回复
SELECT JSON_EXTRACT(ai_response, '$[0]') FROM ai_responses WHERE interview_record_id = 123;
-- 查询所有轮次
SELECT JSON_EXTRACT(ai_response, '$[*]') FROM ai_responses WHERE interview_record_id = 123;
-- 查询回复轮数
SELECT JSON_LENGTH(ai_response) FROM ai_responses WHERE interview_record_id = 123;-
启动阶段:
- 创建WebSocket连接到讯飞平台
- 发送start协议,配置虚拟人参数
- 等待stream_url返回
-
交互阶段:
- 接收用户消息
- 发送text_interact协议
- 虚拟人基于大模型生成回复
- AI回复自动缓存和合并(新增)
-
关闭阶段:
- 发送stop协议
- 关闭WebSocket连接
- 清理会话资源
- 批量保存AI回复到数据库(新增)
- 多会话管理: 支持多个用户同时使用虚拟人
- 自动资源管理: 自动清理过期会话
- 错误处理: 完善的异常处理和重连机制
- 协议兼容: 严格遵循讯飞官方协议规范
- 流式处理: 支持AI回复的流式分片合并
- JSON存储: 使用MySQL JSON类型存储AI回复数组
- 双缓存机制: 分片缓存 + 完整回复缓存,提高性能