模型调整以及业务流程处理

This commit is contained in:
2025-10-25 11:59:24 +08:00
parent b51a69f3ea
commit 9a2c8d7de1
3 changed files with 90 additions and 63 deletions

View File

@@ -55,6 +55,11 @@ public class ChatWebSocketHandler {
*/ */
private final Map<String, WebSocket> cacheWebSocket = new ConcurrentHashMap<>(); private final Map<String, WebSocket> cacheWebSocket = new ConcurrentHashMap<>();
/**
* 缓存客户端,标记是否是自我介绍后的初次问答
*/
private final Map<String,String> cacheReplyFlag = new ConcurrentHashMap<>();
// 语音文件保存目录 // 语音文件保存目录
private static final String VOICE_STORAGE_DIR = "/voice_files/"; private static final String VOICE_STORAGE_DIR = "/voice_files/";
@@ -84,7 +89,9 @@ public class ChatWebSocketHandler {
log.info("WebSocket session 链接已建立:{}", session.getId()); log.info("WebSocket session 链接已建立:{}", session.getId());
cacheClientTts.put(clientId, new String()); cacheClientTts.put(clientId, new String());
//初始化STT流式语音转换文本的socket链接 //初始化STT流式语音转换文本的socket链接
createWhisperRealtimeSocket(clientId); createWhisperRealtimeSocket(session.getId());
//是初次自我介绍后的问答环节
cacheReplyFlag.put(session.getId(),"YES");
//发送初始化面试官语音流 //发送初始化面试官语音流
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "opening.wav"; String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "opening.wav";
try { try {
@@ -111,21 +118,39 @@ public class ChatWebSocketHandler {
String resultFlag = mapResult.get("msg"); String resultFlag = mapResult.get("msg");
if ("done".equals(resultFlag)) { if ("done".equals(resultFlag)) {
log.info("1、开始处理时间:{}", System.currentTimeMillis() / 1000); log.info("1、开始处理时间:{}", System.currentTimeMillis() / 1000);
// //开始合并语音流 //开始合并语音流
//发送消息 //发送消息
WebSocket webSocket = cacheWebSocket.get(clientId); WebSocket webSocket = cacheWebSocket.get(session.getId());
if (webSocket != null) { if (webSocket != null) {
}
webSocket.send("{\"type\": \"input_audio_buffer.commit\"}"); webSocket.send("{\"type\": \"input_audio_buffer.commit\"}");
webSocket.send("{\"type\": \"response.create\"}"); webSocket.send("{\"type\": \"response.create\"}");
}
String startFlag = cacheReplyFlag.get(session.getId());
//语音结束,开始进行回答解析 //语音结束,开始进行回答解析
String cacheResultText = cacheClientTts.get(clientId); String cacheResultText = cacheClientTts.get(clientId);
log.info("返回的结果为:{}", cacheResultText); log.info("返回的结果为:{}", cacheResultText);
if (StrUtil.isEmpty(cacheResultText)) { if (StrUtil.isEmpty(cacheResultText)) {
cacheResultText = "Hello , How are you?"; cacheResultText = "Hi.";
} }
if("YES".equals(startFlag)) {
//自我介绍结束后马上返回一个Good
//发送初始化面试官语音流
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "good.wav";
try {
//文件转换成文件流
ByteBuffer outByteBuffer = convertFileToByteBuffer(openingPathUrl);
//发送文件流数据
session.getBasicRemote().sendBinary(outByteBuffer);
// 发送响应确认
log.info("初始化返回面试官语音信息:{}", System.currentTimeMillis() / 1000);
} catch (IOException e) {
e.printStackTrace();
}
cacheResultText = "你是面试官根据Construction Labourer候选人回答生成追问。只要一个问题";
}
//获取完问答数据,直接清空缓存数据
cacheClientTts.put(clientId,"");
cacheReplyFlag.put(session.getId(),"");
log.info("1、开始进行AI回答时间:{}", System.currentTimeMillis() / 1000); log.info("1、开始进行AI回答时间:{}", System.currentTimeMillis() / 1000);
//把提问的文字发送给CPT(流式处理) //把提问的文字发送给CPT(流式处理)
OpenAiStreamClient aiStreamClient = SpringUtils.getBean(OpenAiStreamClient.class); OpenAiStreamClient aiStreamClient = SpringUtils.getBean(OpenAiStreamClient.class);
@@ -206,7 +231,7 @@ public class ChatWebSocketHandler {
String pathOutUrl = RuoYiConfig.getProfile() + VOICE_STORAGE_DIR + fileOutName; String pathOutUrl = RuoYiConfig.getProfile() + VOICE_STORAGE_DIR + fileOutName;
handleAudioToPCM(pathUrl, pathOutUrl); handleAudioToPCM(pathUrl, pathOutUrl);
//发送消息 //发送消息
WebSocket webSocket = cacheWebSocket.get(clientId); WebSocket webSocket = cacheWebSocket.get(session.getId());
log.info("获取的socket对象为:{}", webSocket); log.info("获取的socket对象为:{}", webSocket);
if (webSocket != null) { if (webSocket != null) {
// 1. 启动音频缓冲 // 1. 启动音频缓冲
@@ -235,10 +260,10 @@ public class ChatWebSocketHandler {
@OnClose @OnClose
public void onClose(Session session, CloseReason reason) { public void onClose(Session session, CloseReason reason) {
System.out.println("WebSocket连接已关闭: " + session.getId() + ", 原因: " + reason.getReasonPhrase()); System.out.println("WebSocket连接已关闭: " + session.getId() + ", 原因: " + reason.getReasonPhrase());
// WebSocket webSocket = cacheWebSocket.get(clientId); WebSocket webSocket = cacheWebSocket.get(session.getId());
// if(webSocket != null){ if (webSocket != null) {
// webSocket.close(1000,null); webSocket.close(1000, null);
// } }
} }
// 发生错误时调用 // 发生错误时调用
@@ -305,6 +330,7 @@ public class ChatWebSocketHandler {
/** /**
* 创建STT WebSocket 客户端链接 * 创建STT WebSocket 客户端链接
*
* @param clientId 客户端ID * @param clientId 客户端ID
*/ */
private void createWhisperRealtimeSocket(String clientId) { private void createWhisperRealtimeSocket(String clientId) {
@@ -386,6 +412,7 @@ public class ChatWebSocketHandler {
/** /**
* 语音流文件格式转换 * 语音流文件格式转换
*
* @param pathUrl * @param pathUrl
* @param outPathUrl * @param outPathUrl
*/ */

View File

@@ -165,7 +165,7 @@ chatGpt:
apiKey: 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 apiKey: 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
apiUrl: https://api.openai.com/v1/chat/completions apiUrl: https://api.openai.com/v1/chat/completions
model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n
role: user role: system
http: http:

View File

@@ -165,7 +165,7 @@ chatGpt:
apiKey: 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 apiKey: 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
apiUrl: https://api.openai.com/v1/chat/completions apiUrl: https://api.openai.com/v1/chat/completions
model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n
role: user role: system
http: http: