From d7f885b66c4e3c10a8bb4d768a0e27b24f0f0cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B2=A9?= Date: Tue, 20 Jan 2026 16:06:04 +0800 Subject: [PATCH] =?UTF-8?q?JLBA202505130001=5F=E5=85=B3=E4=BA=8E=E5=90=89?= =?UTF-8?q?=E6=9E=97=E9=93=B6=E8=A1=8C=E6=96=B0=E5=BB=BAAI=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E5=9F=B9=E8=AE=AD=E7=B3=BB=E7=BB=9F=E7=9A=84=E9=9C=80?= =?UTF-8?q?=E6=B1=82=5F=E5=BC=80=E5=8F=91=E8=81=8A=E5=A4=A9=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=9B=9E=E7=AD=94=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 15 +- src/pages/sparring/components/talk-list.vue | 186 ++++++++++++++------ src/pages/sparring/js/ProtocolCodec.ts | 30 ++++ src/pages/sparring/js/useWebSocket.js | 78 ++++---- src/pages/sparring/talk.vue | 40 +++-- 5 files changed, 237 insertions(+), 112 deletions(-) diff --git a/.env.development b/.env.development index 42373a3c..4339c237 100644 --- a/.env.development +++ b/.env.development @@ -7,7 +7,7 @@ ENV = 'development' #VITE_APP_BASE_API_Url = 'https://aits.jlbank.com.cn:7002' -VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' +#VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' # VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7002' # VITE_APP_BASE_API_Url = 'http://192.168.247.200' @@ -15,19 +15,14 @@ VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' # VITE_APP_BASE_API_Url = 'http://192.168.108.129' # dev - -#VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001' - - +# DEV +VITE_APP_BASE_API_Url = 'http://25.18.122.65:7001' # sit - #VITE_APP_BASE_API_Url = 'http://25.18.122.91:9786' - # UAT # VITE_APP_BASE_API_Url = 'http://25.18.122.78:9786' -# DEV # app入口 @@ -38,7 +33,7 @@ VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' # VITE_APP_BASE_API_Url = 'http://25.18.122.66:9786' # h5专用地址x2 -# VITE_APP_BASE_H5_API_Url_TRAAPP = 'http://25.64.32.150:9601' +#VITE_APP_BASE_H5_API_Url = 'http://25.64.32.157:9601' # dev #VITE_APP_BASE_H5_API_Url = 'http://25.18.122.65:7001' @@ -53,5 +48,7 @@ VITE_APP_BASE_API_Url = 'https://aitstest.jlbank.com.cn:7001' # VITE_APP_BASE_H5_API_Url_TRAASK = 'http://25.64.16.144:9605' # VITE_APP_BASE_H5_API_Url_TRAEXAM = 'http://25.64.16.154:9604' +VITE_APP_BASE_H5_API_Url_TRAPRACTICE = 'http://25.64.32.157:9603' + diff --git a/src/pages/sparring/components/talk-list.vue b/src/pages/sparring/components/talk-list.vue index dbac92e5..93e12fc6 100644 --- a/src/pages/sparring/components/talk-list.vue +++ b/src/pages/sparring/components/talk-list.vue @@ -1,84 +1,164 @@ diff --git a/src/pages/sparring/js/ProtocolCodec.ts b/src/pages/sparring/js/ProtocolCodec.ts index 60193a79..fac5f3e5 100644 --- a/src/pages/sparring/js/ProtocolCodec.ts +++ b/src/pages/sparring/js/ProtocolCodec.ts @@ -36,6 +36,36 @@ export enum MessageType { // 预留12种类型用于扩展(0b0100 ~ 0b1111) } +/** + * 控制消息枚举 + * 二进制标识,统一编码风格 + */ +export enum ControlCode { + FINISH_PUSH = 0b0001, // 本轮tts推流结束 + FINISH_PLAY = 0b0010, // 语音播放结束(发后端) + AI_ANSWER_BEGIN = 0b0011, // 本轮AI回答的文本内容开始 + AI_ANSWER_OVER = 0b0100, // 本轮AI回答的文本内容已经全部返回 + AI_CLUE = 0b0101, // 需要AI提示命令(发后端) + AI_CLUE_OVER = 0b0110, // AI提示命令已经全部返回 +} + + + +/** + * 错误类型枚举 + * 二进制标识,统一编码风格 + */ +export enum ErrorType { + PING = 2, // 认证错误 + AUDIO_DATA = 0b0010, // 纯音频数据 + TEXT_MESSAGE = 0b0011, // 大模型回复的文本消息 + CONTROL_CMD = 0b0100, // 控制指令 + IDENTITY = 0b0101, // 身份校验包json格式 + ERROR = 0b0110, // 错误信息json格式 + TIP_MESSAGE = 0b0111 // 大模型生成的回答提示 + // 预留12种类型用于扩展(0b0100 ~ 0b1111) +} + /** * 序列化方式枚举(3位,存储在字节1高3位,1~8范围) * 二进制标识,统一编码风格(1~8对应0b001~0b111) diff --git a/src/pages/sparring/js/useWebSocket.js b/src/pages/sparring/js/useWebSocket.js index 08b5af4c..d5f890b7 100644 --- a/src/pages/sparring/js/useWebSocket.js +++ b/src/pages/sparring/js/useWebSocket.js @@ -13,6 +13,7 @@ import { import { ProtocolCodec, MessageType, + ControlCode, SerializationType, CompressionType, ControlCommand, @@ -31,9 +32,12 @@ export default function useWebSocket(aaas = null, options = {}) { const isRecording = ref(false) //是否接通 const ws = ref(null) const initConnection = ({ - authParams = {}, - onStartRecord, - playPcmCallback, + authParams = {}, // 认证信息 + onStartRecord, // 连接成功启动录音方法 + playPcmCallback, // 播放返回音频的方法 + addTalkText, // 显示返回的文字的方法 + addTalkTip, // 显示返回的文字提示的方法 + ctrlTalk, // 控制展示数据组件 setPlayNumber = () => {}, //设置当前播放的音频的id,用于播放完成回调 onError = () => {}, onClose = () => {}, @@ -83,51 +87,51 @@ export default function useWebSocket(aaas = null, options = {}) { playPcmCallback(numArray) break; case MessageType.ERROR: - switch (body.errCode) { - case 1: - // ASR或TTS初始化出错 - console.log('后端返回的错误', body.errMsg); - case 4: - console.log('通话接通失败', body.errMsg); - // 通话接通失败,请稍后再试! - ws.value.close({ - code: 4001, - reason: '当前服务器繁忙,请稍后在试!' - }) - onClose({ - code: 4001, - reason: '当前服务器繁忙,请稍后在试!' - }) - break; - case 5: // 使用人数过多等其他错误 - ws.value.close({ - code: 4001, - reason: body.errMsg - }) - break; - default: - console.log('其他错误码的默认处理', body); - // 其他错误码的默认处理(如果需要) - // ws.value.close({ - // code: 1001, - // reason: body.errMsg - // }) - break; + if([1,2,4].includes(body.errCode)) { + // 1 ASR或TTS初始化出错 + // 2 认证错误 + // 4 通话接通失败,请稍后再试! + console.error('后端返回的错误码:', body.errCode, '错误消息:',body.errMsg); + error = { + code: 4001, + reason: '当前服务器繁忙,请稍后在试!' + } + ws.value.close(error) + onClose(error) + } else if(body.errCode === 5) { + // 5 使用人数过多等其他错误 + ws.value.close({ + code: 4001, + reason: body.errMsg + }) + } else { + console.error('其他错误码的默认处理', body); } break; case MessageType.CONTROL_CMD: // 控制消息 - console.log('控制消息', msgType, body); - if (body.type === 1) { // 开始播放,记录当前播放的语音id + console.log('控制消息', body, body.type === ControlCode.AI_ANSWER_BEGIN); + console.log('控制消息2', ControlCode.AI_ANSWER_BEGIN); + + if (body.type === ControlCode.FINISH_PUSH) { // 开始播放,记录当前播放的语音id console.log('开始播放,记录当前播放的语音id', body.lock); setPlayNumber(body.lock) + } else if (body.type === ControlCode.AI_ANSWER_BEGIN) { + console.log('新一段对话内容来了'); + ctrlTalk('textStart') // 新一段对话内容来了 + } else if (body.type === ControlCode.AI_ANSWER_OVER) { + console.log('新一段对话结束了'); + ctrlTalk('textEnd') // 新一段对话内容来了 } break; case MessageType.TEXT_MESSAGE: console.log('TEXT_MESSAGE', body); + addTalkText(body) + break; + case MessageType.TIP_MESSAGE: + console.log('消息提示', body); + addTalkTip(body) break; - - default: console.log('其他消息', msgType, body); break; diff --git a/src/pages/sparring/talk.vue b/src/pages/sparring/talk.vue index dc817b9d..aeb5ad80 100644 --- a/src/pages/sparring/talk.vue +++ b/src/pages/sparring/talk.vue @@ -36,7 +36,7 @@ style="width: 240rpx; height: 360rpx; position: absolute; left: 0; top: 0" > - + @@ -44,9 +44,9 @@