模型调整以及业务流程处理
This commit is contained in:
@@ -55,6 +55,11 @@ public class ChatWebSocketHandler {
|
||||
*/
|
||||
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/";
|
||||
|
||||
@@ -84,7 +89,9 @@ public class ChatWebSocketHandler {
|
||||
log.info("WebSocket session 链接已建立:{}", session.getId());
|
||||
cacheClientTts.put(clientId, new String());
|
||||
//初始化STT流式语音转换文本的socket链接
|
||||
createWhisperRealtimeSocket(clientId);
|
||||
createWhisperRealtimeSocket(session.getId());
|
||||
//是初次自我介绍后的问答环节
|
||||
cacheReplyFlag.put(session.getId(),"YES");
|
||||
//发送初始化面试官语音流
|
||||
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "opening.wav";
|
||||
try {
|
||||
@@ -111,21 +118,39 @@ public class ChatWebSocketHandler {
|
||||
String resultFlag = mapResult.get("msg");
|
||||
if ("done".equals(resultFlag)) {
|
||||
log.info("1、开始处理时间:{}", System.currentTimeMillis() / 1000);
|
||||
// //开始合并语音流
|
||||
//开始合并语音流
|
||||
//发送消息
|
||||
WebSocket webSocket = cacheWebSocket.get(clientId);
|
||||
WebSocket webSocket = cacheWebSocket.get(session.getId());
|
||||
if (webSocket != null) {
|
||||
|
||||
}
|
||||
webSocket.send("{\"type\": \"input_audio_buffer.commit\"}");
|
||||
webSocket.send("{\"type\": \"response.create\"}");
|
||||
|
||||
}
|
||||
String startFlag = cacheReplyFlag.get(session.getId());
|
||||
//语音结束,开始进行回答解析
|
||||
String cacheResultText = cacheClientTts.get(clientId);
|
||||
log.info("返回的结果为:{}", 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);
|
||||
//把提问的文字发送给CPT(流式处理)
|
||||
OpenAiStreamClient aiStreamClient = SpringUtils.getBean(OpenAiStreamClient.class);
|
||||
@@ -206,7 +231,7 @@ public class ChatWebSocketHandler {
|
||||
String pathOutUrl = RuoYiConfig.getProfile() + VOICE_STORAGE_DIR + fileOutName;
|
||||
handleAudioToPCM(pathUrl, pathOutUrl);
|
||||
//发送消息
|
||||
WebSocket webSocket = cacheWebSocket.get(clientId);
|
||||
WebSocket webSocket = cacheWebSocket.get(session.getId());
|
||||
log.info("获取的socket对象为:{}", webSocket);
|
||||
if (webSocket != null) {
|
||||
// 1. 启动音频缓冲
|
||||
@@ -235,10 +260,10 @@ public class ChatWebSocketHandler {
|
||||
@OnClose
|
||||
public void onClose(Session session, CloseReason reason) {
|
||||
System.out.println("WebSocket连接已关闭: " + session.getId() + ", 原因: " + reason.getReasonPhrase());
|
||||
// WebSocket webSocket = cacheWebSocket.get(clientId);
|
||||
// if(webSocket != null){
|
||||
// webSocket.close(1000,null);
|
||||
// }
|
||||
WebSocket webSocket = cacheWebSocket.get(session.getId());
|
||||
if (webSocket != null) {
|
||||
webSocket.close(1000, null);
|
||||
}
|
||||
}
|
||||
|
||||
// 发生错误时调用
|
||||
@@ -305,6 +330,7 @@ public class ChatWebSocketHandler {
|
||||
|
||||
/**
|
||||
* 创建STT WebSocket 客户端链接
|
||||
*
|
||||
* @param clientId 客户端ID
|
||||
*/
|
||||
private void createWhisperRealtimeSocket(String clientId) {
|
||||
@@ -386,6 +412,7 @@ public class ChatWebSocketHandler {
|
||||
|
||||
/**
|
||||
* 语音流文件格式转换
|
||||
*
|
||||
* @param pathUrl
|
||||
* @param outPathUrl
|
||||
*/
|
||||
|
||||
@@ -165,7 +165,7 @@ chatGpt:
|
||||
apiKey: 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
|
||||
apiUrl: https://api.openai.com/v1/chat/completions
|
||||
model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n
|
||||
role: user
|
||||
role: system
|
||||
|
||||
|
||||
http:
|
||||
|
||||
@@ -165,7 +165,7 @@ chatGpt:
|
||||
apiKey: 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
|
||||
apiUrl: https://api.openai.com/v1/chat/completions
|
||||
model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n
|
||||
role: user
|
||||
role: system
|
||||
|
||||
|
||||
http:
|
||||
|
||||
Reference in New Issue
Block a user