TTS key 修改
This commit is contained in:
@@ -177,7 +177,7 @@ public class ChatWebSocketHandler {
|
|||||||
OpenAiStreamClient aiStreamClient = SpringUtils.getBean(OpenAiStreamClient.class);
|
OpenAiStreamClient aiStreamClient = SpringUtils.getBean(OpenAiStreamClient.class);
|
||||||
log.info("AI提示词为:{}", promptJson);
|
log.info("AI提示词为:{}", promptJson);
|
||||||
//先获取回答的评分,是否符合要求
|
//先获取回答的评分,是否符合要求
|
||||||
Boolean isEndFlag = getInterviewScore(promptJson, session, "");
|
Boolean isEndFlag = getInterviewScore(clientId,promptJson, session, "");
|
||||||
if(isEndFlag){
|
if(isEndFlag){
|
||||||
log.info("面试回答符合条件规则,继续追问啦!!!!!");
|
log.info("面试回答符合条件规则,继续追问啦!!!!!");
|
||||||
aiStreamClient.streamChat(promptJson, new OpenAiStreamListenerService() {
|
aiStreamClient.streamChat(promptJson, new OpenAiStreamListenerService() {
|
||||||
@@ -190,20 +190,22 @@ public class ChatWebSocketHandler {
|
|||||||
content = "";
|
content = "";
|
||||||
}
|
}
|
||||||
resultNum = resultNum+1;
|
resultNum = resultNum+1;
|
||||||
String contentData = content.replaceAll("\n", "");
|
log.info("提问的问题:{}",content);
|
||||||
|
// String contentData = content.replaceAll("\n", "");
|
||||||
//返回是追问的问题
|
//返回是追问的问题
|
||||||
//获取的是追问的问题
|
//获取的是追问的问题
|
||||||
if (StrUtil.isNotEmpty(contentData)) {
|
if (StrUtil.isNotEmpty(content)) {
|
||||||
//对问题进行数据缓存
|
//对问题进行数据缓存
|
||||||
cacheQuestionResult.put(session.getId(), contentData);
|
cacheQuestionResult.put(session.getId(), content);
|
||||||
//开始进行语音输出-流式持续输出
|
//开始进行语音输出-流式持续输出
|
||||||
sendTTSBuffer(clientId, contentData, session);
|
sendTTSBuffer(clientId, content, session);
|
||||||
// 实时输出内容
|
// 实时输出内容
|
||||||
try {
|
try {
|
||||||
//把文本也给前端返回去
|
//把文本也给前端返回去
|
||||||
Map<String, String> dataText = new HashMap<>();
|
Map<String, String> dataText = new HashMap<>();
|
||||||
dataText.put("type", "question");
|
dataText.put("type", "question");
|
||||||
dataText.put("content", contentData);
|
dataText.put("content", content);
|
||||||
|
log.info("提问的问题文本发送啦:{}",JSONUtil.toJsonStr(dataText));
|
||||||
session.getBasicRemote().sendText(JSONUtil.toJsonStr(dataText));
|
session.getBasicRemote().sendText(JSONUtil.toJsonStr(dataText));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -245,7 +247,7 @@ public class ChatWebSocketHandler {
|
|||||||
}
|
}
|
||||||
} else if ("end".equals(resultFlag)) {
|
} else if ("end".equals(resultFlag)) {
|
||||||
log.info("面试结束啦!!!!!");
|
log.info("面试结束啦!!!!!");
|
||||||
handleInterviewEnd(session,"");
|
handleInterviewEnd(clientId,session,"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -329,6 +331,7 @@ public class ChatWebSocketHandler {
|
|||||||
ElevenLabsClient elevenLabsClient = SpringUtils.getBean(ElevenLabsClient.class);
|
ElevenLabsClient elevenLabsClient = SpringUtils.getBean(ElevenLabsClient.class);
|
||||||
elevenLabsClient.handleTextToVoice(content, resultPathUrl);
|
elevenLabsClient.handleTextToVoice(content, resultPathUrl);
|
||||||
//持续返回数据流给客户端
|
//持续返回数据流给客户端
|
||||||
|
log.info("发送语音流成功啦!!!!!!!");
|
||||||
sendVoiceBuffer(resultPathUrl, session);
|
sendVoiceBuffer(resultPathUrl, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,6 +343,7 @@ public class ChatWebSocketHandler {
|
|||||||
*/
|
*/
|
||||||
private void initializationQuestion(String clientId, Session session) {
|
private void initializationQuestion(String clientId, Session session) {
|
||||||
try {
|
try {
|
||||||
|
log.info("开始获取到clientid :{}",clientId);
|
||||||
//自我介绍结束后马上返回一个Good
|
//自我介绍结束后马上返回一个Good
|
||||||
//发送初始化面试官语音流
|
//发送初始化面试官语音流
|
||||||
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "good.wav";
|
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "good.wav";
|
||||||
@@ -355,6 +359,7 @@ public class ChatWebSocketHandler {
|
|||||||
HotakeProblemBaseInfo queryPro = new HotakeProblemBaseInfo();
|
HotakeProblemBaseInfo queryPro = new HotakeProblemBaseInfo();
|
||||||
queryPro.setUserId(Long.valueOf(clientId));
|
queryPro.setUserId(Long.valueOf(clientId));
|
||||||
List<HotakeProblemBaseInfo> baseInfoList = problemBaseInfoService.selectHotakeProblemBaseInfoList(queryPro);
|
List<HotakeProblemBaseInfo> baseInfoList = problemBaseInfoService.selectHotakeProblemBaseInfoList(queryPro);
|
||||||
|
log.info("准备进行第一个问题的提问:{}",JSONUtil.toJsonStr(baseInfoList));
|
||||||
if (CollectionUtil.isNotEmpty(baseInfoList)) {
|
if (CollectionUtil.isNotEmpty(baseInfoList)) {
|
||||||
HotakeProblemBaseInfo baseInfo = baseInfoList.get(0);
|
HotakeProblemBaseInfo baseInfo = baseInfoList.get(0);
|
||||||
if (StrUtil.isNotEmpty(baseInfo.getContents())) {
|
if (StrUtil.isNotEmpty(baseInfo.getContents())) {
|
||||||
@@ -366,7 +371,9 @@ public class ChatWebSocketHandler {
|
|||||||
mapEntityQ.put("role", "user");
|
mapEntityQ.put("role", "user");
|
||||||
mapEntityQ.put("content", "Question:" + question + "\\nCandidate Answer:{}");
|
mapEntityQ.put("content", "Question:" + question + "\\nCandidate Answer:{}");
|
||||||
list.add(mapEntityQ);
|
list.add(mapEntityQ);
|
||||||
|
log.info("开始提问啦:{}",JSONUtil.toJsonStr(list));
|
||||||
//直接对该问题进行转换处理返回语音流
|
//直接对该问题进行转换处理返回语音流
|
||||||
|
log.info("第一个问题为:{}",question);
|
||||||
sendTTSBuffer(clientId, question, session);
|
sendTTSBuffer(clientId, question, session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -384,7 +391,7 @@ public class ChatWebSocketHandler {
|
|||||||
* @param session 客户端会话
|
* @param session 客户端会话
|
||||||
* @param position 职位
|
* @param position 职位
|
||||||
*/
|
*/
|
||||||
private void handleInterviewEnd(Session session,String position) {
|
private void handleInterviewEnd(String clientId,Session session,String position) {
|
||||||
//暂时的业务逻辑
|
//暂时的业务逻辑
|
||||||
//发送面试官结束语音流
|
//发送面试官结束语音流
|
||||||
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "end.wav";
|
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "end.wav";
|
||||||
@@ -422,7 +429,13 @@ public class ChatWebSocketHandler {
|
|||||||
resultEntity.put("content", resultMsg);
|
resultEntity.put("content", resultMsg);
|
||||||
resultEntity.put("type", "score");
|
resultEntity.put("type", "score");
|
||||||
try{
|
try{
|
||||||
|
//返回最终的评分结构
|
||||||
|
log.info("返回最终的评分结构:{}",JSONUtil.toJsonStr(resultEntity));
|
||||||
session.getBasicRemote().sendText(JSONUtil.toJsonStr(resultEntity));
|
session.getBasicRemote().sendText(JSONUtil.toJsonStr(resultEntity));
|
||||||
|
|
||||||
|
//返回评分语音
|
||||||
|
sendTTSBuffer(clientId,resultMsg,session);
|
||||||
|
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -441,11 +454,13 @@ public class ChatWebSocketHandler {
|
|||||||
*/
|
*/
|
||||||
private Boolean handleScoreRecord(String content, Session session) {
|
private Boolean handleScoreRecord(String content, Session session) {
|
||||||
Map<String, Integer> scoreRecordMap = cacheScoreResult.get(session.getId());
|
Map<String, Integer> scoreRecordMap = cacheScoreResult.get(session.getId());
|
||||||
|
log.info("获取评分结果:{}",content);
|
||||||
//对评分进行处理
|
//对评分进行处理
|
||||||
if (StrUtil.isNotEmpty(content)) {
|
if (StrUtil.isNotEmpty(content)) {
|
||||||
String[] strs = content.split("/");
|
String[] strs = content.split("/");
|
||||||
//取第一个数就是对应的评分
|
//取第一个数就是对应的评分
|
||||||
BigDecimal score = new BigDecimal(strs[0]);
|
log.info("获取的数据为:{}",strs[0]);
|
||||||
|
BigDecimal score = new BigDecimal(strs[0].trim());
|
||||||
//记录Key为1
|
//记录Key为1
|
||||||
if (BigDecimal.ZERO.compareTo(score) <= 0 && BigDecimal.ONE.compareTo(score) >= 0) {
|
if (BigDecimal.ZERO.compareTo(score) <= 0 && BigDecimal.ONE.compareTo(score) >= 0) {
|
||||||
Integer n1 = scoreRecordMap.get("0-1") + 1;
|
Integer n1 = scoreRecordMap.get("0-1") + 1;
|
||||||
@@ -489,7 +504,7 @@ public class ChatWebSocketHandler {
|
|||||||
* @param session 客户端会话
|
* @param session 客户端会话
|
||||||
* @param position 职位
|
* @param position 职位
|
||||||
*/
|
*/
|
||||||
private Boolean getInterviewScore(String promptJson, Session session, String position) {
|
private Boolean getInterviewScore(String clientId,String promptJson, Session session, String position) {
|
||||||
//返回文本评分
|
//返回文本评分
|
||||||
//获取缓存记录
|
//获取缓存记录
|
||||||
String msgMapData = cacheMsgMapData.get(session.getId());
|
String msgMapData = cacheMsgMapData.get(session.getId());
|
||||||
@@ -515,18 +530,30 @@ public class ChatWebSocketHandler {
|
|||||||
String resultMsg = gptClient.handleAiChat(promptJson, "QA");
|
String resultMsg = gptClient.handleAiChat(promptJson, "QA");
|
||||||
//评论格式为: Score: 3/5\nAssessment: Basically correct answer but lacks detail
|
//评论格式为: Score: 3/5\nAssessment: Basically correct answer but lacks detail
|
||||||
String resultScore = "";
|
String resultScore = "";
|
||||||
|
String scoreText = resultMsg;
|
||||||
if (StrUtil.isNotEmpty(resultMsg)) {
|
if (StrUtil.isNotEmpty(resultMsg)) {
|
||||||
String[] resultMsgs = resultMsg.split("\\\\n");
|
resultMsg = resultMsg.replaceAll("\n","#AA#");
|
||||||
|
String[] resultMsgs = resultMsg.split("#AA#");
|
||||||
resultScore = resultMsgs[0].replaceAll(SCORE_FLAG, "");
|
resultScore = resultMsgs[0].replaceAll(SCORE_FLAG, "");
|
||||||
}
|
}
|
||||||
//校验面试是否结束
|
//校验面试是否结束
|
||||||
Boolean flag = handleScoreRecord(resultScore, session);
|
Boolean flag = handleScoreRecord(resultScore, session);
|
||||||
try {
|
try {
|
||||||
if (!flag) {
|
if (!flag) {
|
||||||
|
//发送面试官结束语音流
|
||||||
|
String openingPathUrl = RuoYiConfig.getProfile() + VOICE_SYSTEM_DIR + "end.wav";
|
||||||
|
sendVoiceBuffer(openingPathUrl, session);
|
||||||
|
|
||||||
Map<String, String> resultEntity = new HashMap<>();
|
Map<String, String> resultEntity = new HashMap<>();
|
||||||
resultEntity.put("content", resultMsg);
|
resultEntity.put("content", scoreText);
|
||||||
resultEntity.put("type", "score");
|
resultEntity.put("type", "score");
|
||||||
|
//返回评分结果
|
||||||
|
log.info("返回最终的评分结果:{}",JSONUtil.toJsonStr(resultEntity));
|
||||||
session.getBasicRemote().sendText(JSONUtil.toJsonStr(resultEntity));
|
session.getBasicRemote().sendText(JSONUtil.toJsonStr(resultEntity));
|
||||||
|
|
||||||
|
//返回评分语音
|
||||||
|
sendTTSBuffer(clientId,scoreText,session);
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -51,8 +51,9 @@ public class AiCommonController extends BaseController
|
|||||||
public AjaxResult handleTextToVice()
|
public AjaxResult handleTextToVice()
|
||||||
{
|
{
|
||||||
//你好,我是本次的面试官Vetti,请点击开始按钮后,做一段自我介绍.
|
//你好,我是本次的面试官Vetti,请点击开始按钮后,做一段自我介绍.
|
||||||
|
//你好,我是本次的面试官Vetti,请在三秒后,开始做一段自我介绍.
|
||||||
//本轮面试结束,谢谢您的配合,面试结果将稍后通知
|
//本轮面试结束,谢谢您的配合,面试结果将稍后通知
|
||||||
elevenLabsClient.handleTextToVoice("Good","/Users/wangxiangshun/Desktop/临时文件/good.wav");
|
elevenLabsClient.handleTextToVoice("Hello, I am Vetti, the interviewer for this interview. Please begin a self introduction in three seconds","/Users/wangxiangshun/Desktop/临时文件/opening1.wav");
|
||||||
|
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,8 +152,8 @@ verification:
|
|||||||
# 文本转语音
|
# 文本转语音
|
||||||
elevenLabs:
|
elevenLabs:
|
||||||
baseUrl: https://api.elevenlabs.io/v1
|
baseUrl: https://api.elevenlabs.io/v1
|
||||||
# apiKey: sk_5240d8f56cb1eb5225fffcf903f62479884d1af5b3de6812
|
apiKey: sk_5240d8f56cb1eb5225fffcf903f62479884d1af5b3de6812
|
||||||
apiKey: sk_88f5a560e1bbde0e5b8b6b6eb1812163a98bfb98554acbec
|
# apiKey: sk_88f5a560e1bbde0e5b8b6b6eb1812163a98bfb98554acbec
|
||||||
modelId: eleven_turbo_v2_5
|
modelId: eleven_turbo_v2_5
|
||||||
|
|
||||||
# 语音转文本
|
# 语音转文本
|
||||||
|
|||||||
@@ -152,8 +152,8 @@ verification:
|
|||||||
# 文本转语音
|
# 文本转语音
|
||||||
elevenLabs:
|
elevenLabs:
|
||||||
baseUrl: https://api.elevenlabs.io/v1
|
baseUrl: https://api.elevenlabs.io/v1
|
||||||
# apiKey: sk_5240d8f56cb1eb5225fffcf903f62479884d1af5b3de6812
|
apiKey: sk_5240d8f56cb1eb5225fffcf903f62479884d1af5b3de6812
|
||||||
apiKey: sk_88f5a560e1bbde0e5b8b6b6eb1812163a98bfb98554acbec
|
# apiKey: sk_88f5a560e1bbde0e5b8b6b6eb1812163a98bfb98554acbec
|
||||||
modelId: eleven_turbo_v2_5
|
modelId: eleven_turbo_v2_5
|
||||||
|
|
||||||
# 语音转文本
|
# 语音转文本
|
||||||
|
|||||||
Reference in New Issue
Block a user