From 41b3e5246d38ddc6605016e5fc6252d06fe7cf02 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Tue, 3 Jun 2025 17:13:10 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A04Gai=E5=AF=B9=E8=AF=9D?= =?utf8?q?=EF=BC=8C=E5=BE=85=E8=81=94=E8=B0=83=EF=BC=8C=E4=B8=94=E5=A4=84?= =?utf8?q?=E4=BA=8E=E6=B5=8B=E8=AF=95=E7=94=A8=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../ble_service/bleservice/bleService.c | 10 +- .../cat1_ai_server/cat1_ai_server.cpp | 56 ++++++++ .../slip/cat1Service/cat1_at_cmd.cpp | 99 ++++++++++++- .../peripheral/slip/cat1Service/cat1_ws.cpp | 133 ++++++++++++------ .../sample/wrapper/audio_capture_wrapper.cpp | 6 +- 5 files changed, 251 insertions(+), 53 deletions(-) create mode 100644 code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server/cat1_ai_server.cpp diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c index eb5a97efc..43047db4b 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c @@ -2394,7 +2394,11 @@ static void blesrvAi_send_service_task(void const *arg) if(mail.msg_data && mail.msg_len!=0) - send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count); + { + send_ai_bin(mail.msg_data,mail.msg_len); + } + + // send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count); if(mail.msg_data) @@ -2402,7 +2406,7 @@ static void blesrvAi_send_service_task(void const *arg) free(mail.msg_data); mail.msg_data = NULL; } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n"); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n"); } } @@ -2473,7 +2477,7 @@ int send_msg_data_into_Ai_msg_queue(void *buff,uint16_t len,uint8_t type) if (buff == NULL) return ERRCODE_FAIL; uint32_t sendlen = sizeof(blesrv_custom_cmd_t); - uint32_t singlebuflen= ble_nus_max_data_len-20; + uint32_t singlebuflen= 1024;//ble_nus_max_data_len-20; blesrv_mail.msg_data=0; if(len<=singlebuflen) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server/cat1_ai_server.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server/cat1_ai_server.cpp new file mode 100644 index 000000000..53c8b6c70 --- /dev/null +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server/cat1_ai_server.cpp @@ -0,0 +1,56 @@ +#include "bk_websocket.h" + + +// { +// "header": { +// "trace_id": "x70g1n8gfdg", +// "event": "Start" +// }, +// "payload": { +// "device_id": "test_device_id", // 设备ID/用户ID +// "user_agent": "python", // 浏览器uset-gaent 自定义 +// "dialog_id":"", // 继承上轮对话 空新建一个对话 +// "in_format": "pcm", // 上传音频格式 +// "out_format": "pcm", // 返回音频格式 +// "in_sample_rate": 16000, // 上传音频采样率 +// "volume": "10", // 音量设置 +// "sample_rate": 16000, // 返回音频采样率 +// "voice": "zh_female_shuangkuaisisi_moon_bigtts", // 音色配置 +// "voice_detection": "disable" // 开启自动断句 enabled/disable +// } +// } + + +int bk_websocket_tts(void) { + WebSocketClient *client; + client = init_websocket_client("ws://118.145.158.207:22080/vc/chat",NULL); + if (client== NULL) { + return -1; + } + + receive_websocket_message(client,); +// "ws://118.145.158.207:22080/vc/chat + return 0; +} + + +int bk_websocket_asr(void) { + WebSocketClient *client; + client = init_websocket_client("ws://118.145.158.207:22080/vc/chat",NULL); + if (client== NULL) { + return -1; + } +// "ws://118.145.158.207:22080/vc/chat + return 0; +} + + +int bk_websocket_chat(void) { + WebSocketClient *client; + client = init_websocket_client("ws://118.145.158.207:22080/vc/chat",NULL); + if (client== NULL) { + return -1; + } +// "ws://118.145.158.207:22080/vc/chat + return 0; +} \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp index ad94376ad..c6c834df6 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp @@ -26,6 +26,8 @@ extern "C" { #define PPG_FAILED (-1) #include "app_at_process.h" +#include "bk_websocket.h" + static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen, uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN], uint32_t* argc) @@ -375,7 +377,98 @@ static uint32_t Tcptest(uint8_t *para, uint32_t paraLen, char *strCommonCmd) return 0; } +extern bool init_ai_task(void); + +extern errcode_t chat_server_init(void); +static uint32_t wstest(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + + init_ai_task(); + return 0; +} + +extern void send_ai_txt(uint8_t type,char *msg); + +static uint32_t ai_msg(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + printf("ai_msg\n"); + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + send_ai_txt(0,(char *)argv[0]); + + return 0; +} +#include "audio_capture_wrapper.h" + +static uint32_t start_record(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + printf("ai_msg\n"); + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + uapi_start_asr(); + + streamingRecordAndSend_AI(0); + + return 0; +} + + + +static uint32_t start_asr(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + printf("ai_msg\n"); + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + uapi_start_asr(); + + + + return 0; +} +extern void record_test(void); + +static uint32_t sendbindata(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + UNUSED(strCommonCmd); + uint8_t argv[PPG_MAX_ARGC][PPG_MAX_ARGV_LEN] = { 0 }; + uint32_t argc = 0; + printf("ai_msg\n"); + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != PPG_SUCCESS) { + printf("CAT1TEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + record_test(); + return 0; +} static const at_cmd_table_t g_cat1_cmd[] = { { (char *)"AT^CAT1POWER", cat1_power, (char *)"1" }, @@ -397,7 +490,11 @@ static const at_cmd_table_t g_cat1_cmd[] = { { (char *)"AT^CALLVOLUME", VoiceCallSetVolume, (char *)"1" }, { (char *)"AT^CALLVOICE", VoiceCallcontrol, (char *)"1" }, { (char *)"AT^TCPTEST", Tcptest, (char *)"1" }, - + { (char *)"AT^WSTEST", wstest, (char *)"1" }, + { (char *)"AT^AI_MSG", ai_msg, (char *)"1" }, + { (char *)"AT^AI_ASR", start_record, (char *)"1" }, + { (char *)"AT^STARTASR", start_asr, (char *)"1" }, + { (char *)"AT^SENDBINDATA", sendbindata, (char *)"1" }, }; at_cmd_table_t *get_cat1_cmd_table(uint32_t *cmd_count) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp index e892084a5..f6aed442c 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp @@ -41,6 +41,8 @@ #include "custom_utils.h" #include "broadcast_feature.h" #include "cmsis_os2.h" +#include "cat1_ctl.h" + #ifdef __cplusplus extern "C" { @@ -455,7 +457,7 @@ int send_websocket_message(WebSocketClient *client, const unsigned char *message int ret = -1; if(!frame) { - printf("send_websocket_message zalloc error"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message zalloc error\r\n"); return -1; } // 第一个字节:FIN = 1, 设置 opcode @@ -492,7 +494,7 @@ int send_websocket_message(WebSocketClient *client, const unsigned char *message // 发送帧 if (send(client->sockfd, frame, offset, 0) < 0) { - printf("send message failed"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send message failed\r\n"); ret = -1; goto send_websocket_message_ERROR; } @@ -781,7 +783,7 @@ void send_ai_txt(uint8_t type,char *msg) cJSON* dataJSON = cJSON_CreateObject(); if (dataJSON == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n"); return; } @@ -793,7 +795,7 @@ void send_ai_txt(uint8_t type,char *msg) char *jsonString = cJSON_PrintUnformatted(dataJSON); if (jsonString == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); cJSON_Delete(dataJSON); return; } @@ -802,7 +804,7 @@ void send_ai_txt(uint8_t type,char *msg) cJSON_Delete(dataJSON); if (data_len == 0) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); return; } @@ -815,6 +817,7 @@ void send_ai_txt(uint8_t type,char *msg) // {"type":"middle","content":"我是","task_id":"","reasoning_content":""} +char content_str_chat[64]={0}; bool chat_result_analysis(char *buf) { @@ -828,20 +831,22 @@ bool chat_result_analysis(char *buf) cJSON* type = cJSON_GetObjectItem(root, "type"); if (type && cJSON_IsString(type)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint); + type_str= type->valuestring; } cJSON* content = cJSON_GetObjectItem(root, "content"); if (content && cJSON_IsString(content)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint); - content_str = root->valuestring; + content_str = content->valuestring; + } + if(strcmp("middle",type_str)==0) + { + memset_s(content_str_chat,64,0,64); + memcpy_s(content_str_chat,64,content_str,strlen(content_str)); + ble_set_ai_Answer_str(content_str_chat,2); + } - - // if(is_end_bool==true) - // { - // send_ai_txt(0,result_str); - // } cJSON_Delete(root); + return true; } @@ -860,8 +865,9 @@ void bk_websocket_demo(void *data) { WebSocketMessageType type; while (1) { + memset_s(recv_buf,1024,0,1024); receive_websocket_message(chat_client,(unsigned char *)recv_buf,1024,&type); - + chat_result_analysis(recv_buf); printf("bk_websocket_demo %s",recv_buf); } @@ -893,7 +899,7 @@ errcode_t chat_server_init(void) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init !\r\n"); app_task_definition_t taskcfg={0}; taskcfg.create_queue_handle = NULL; - taskcfg.attr.name="cat1_service_file"; + taskcfg.attr.name="chat_server_init"; taskcfg.attr.priority = TASK_PRIORITY_APP; taskcfg.attr.stack_size = CAT1_SERVICE_TASK_SIZE; taskcfg.func = bk_websocket_demo; @@ -928,7 +934,7 @@ void uapi_start_asr(void) if (send_websocket_message(asr_client,( const unsigned char *)jsonString,strlen(jsonString),WS_TEXT)==0) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n"); else - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ erro\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message erro\n"); } //停止对话 @@ -944,9 +950,12 @@ void uapi_stop_asr(void) void send_ai_bin(char *buf,uint32_t len) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_ai_bin 0\n"); - if (send_websocket_message(asr_client,( const unsigned char *)buf,len,WS_BINARY)==0) - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n"); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_ai_bin 0\n"); + if (send_websocket_message(asr_client,( const unsigned char *)buf,len,WS_BINARY)==0) + { + bk_sleep(10); + } + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n"); } void record_test(void) @@ -985,9 +994,10 @@ void record_test(void) // "event":"SentenceEnd","result":{"result":"你好你好你好你好。", // "is_end":true,"sentence_id":"fcb889fe74a0920efe14939de2fd2b1b", // "start_time":760,"end_time":2280}} + char result_str_asr[256]={0}; bool aer_result_analysis(char *buf) { - cJSON* root = cJSON_Parse((const char *)buf); + cJSON* root = cJSON_Parse((const char *)buf); if (root == NULL) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"解析失败\n"); return false; @@ -1005,29 +1015,37 @@ bool aer_result_analysis(char *buf) } cJSON* result = cJSON_GetObjectItem(root, "result"); - if (result && cJSON_IsString(result)) { - result_str= result->valuestring; - } - cJSON* start_time = cJSON_GetObjectItem(root, "start_time"); - if (start_time && cJSON_IsNumber(start_time)) { + if (result) + { + cJSON* result_ = cJSON_GetObjectItem(result, "result"); - start_time_int = root->valueint; - } - cJSON* end_time = cJSON_GetObjectItem(root, "end_time"); - if (end_time && cJSON_IsNumber(end_time)) { - end_time_int = end_time->valueint; + if (result_ && cJSON_IsString(result_)) { + result_str= result_->valuestring; + } + cJSON* start_time = cJSON_GetObjectItem(result, "start_time"); + if (start_time && cJSON_IsNumber(start_time)) { + start_time_int = root->valueint; + } + cJSON* end_time = cJSON_GetObjectItem(result, "end_time"); + if (end_time && cJSON_IsNumber(end_time)) { + end_time_int = end_time->valueint; + } + + cJSON* is_end = cJSON_GetObjectItem(result, "is_end"); + if (is_end && cJSON_IsBool(is_end)) { + is_end_bool = is_end->valueint; + } } - - cJSON* is_end = cJSON_GetObjectItem(root, "is_end"); - if (is_end && cJSON_IsBool(is_end)) { - is_end_bool = is_end->valueint; - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"str %s start %d end %d is end\n",result_str,start_time_int,end_time_int,is_end_bool); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"str %s start %d end %d is end %d\n",result_str,start_time_int,end_time_int,is_end_bool); if(is_end_bool==true) { - send_ai_txt(0,result_str); + memset_s(result_str_asr,256,0,256); + memcpy_s(result_str_asr,256,result_str,strlen(result_str)); + ble_set_ai_Question_str(result_str_asr); + send_ai_txt(0,result_str_asr); } if(strcmp(event_str,"TranscriptionStarted")==0) { @@ -1037,18 +1055,28 @@ bool aer_result_analysis(char *buf) SendMsgToUIService(UI_AI_JUMP_TO_LISTENING_VIEW, 0, &state, sizeof(bool)); } cJSON_Delete(root); + return true; } +uint8_t is_bk_websocket_asr=0; + + void bk_websocket_asr(void *data) { - while (1) + // while (1) + is_bk_websocket_asr=1; + { asr_client = init_websocket_client("ws://118.145.158.207:22080/asr/ws",NULL); if (asr_client== NULL) { - continue ; + bk_sleep(10); + // continue ; + is_bk_websocket_asr=0; + return; } + uapi_cat1_keep_wakeup(1); WebSocketMessageType type; while (1) @@ -1058,17 +1086,21 @@ void bk_websocket_asr(void *data) { // if(type==WS_CONT || if( type==WS_CLOSE) { + printf("WS_CLOSE bk_websocket_asr\r\n"); break; } + printf("WS_CLOSE bk_websocket_asr %d\r\n",type); + aer_result_analysis(asr_recv_buf); - printf("bk_websocket_demo %s %d",asr_recv_buf,type); + // printf("bk_websocket_demo %s %d",asr_recv_buf,type); } close_websocket_client(asr_client); asr_client=NULL; - continue ; + // return; } + is_bk_websocket_asr=0; } @@ -1079,15 +1111,15 @@ void bk_websocket_asr(void *data) { errcode_t asr_server_init(void) { - if(asr_client) + if(is_bk_websocket_asr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init is connet!\r\n"); return ERRCODE_FAIL; } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init !\r\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"asr_server_init !\r\n"); app_task_definition_t taskcfg={0}; taskcfg.create_queue_handle = NULL; - taskcfg.attr.name="cat1_service_file"; + taskcfg.attr.name="asr_server_init"; taskcfg.attr.priority = TASK_PRIORITY_APP; taskcfg.attr.stack_size = CAT1_SERVICE_TASK_SIZE; taskcfg.func = bk_websocket_asr; @@ -1104,11 +1136,20 @@ errcode_t asr_server_init(void) return ERRCODE_SUCC; } +static uint8_t is_init_ai=1; bool init_ai_task(void) { - asr_server_init(); - chat_server_init(); + if(is_init_ai) + { + asr_server_init(); + chat_server_init(); + // is_init_ai=0; + } + + return true; + + } diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp index 791048adf..197eb5c35 100755 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp @@ -417,7 +417,7 @@ EXIT: } /* ------------------------------- AI录音数据上传接口 ------------------------------- */ -#define AI_RECORD_TEST 0 //若需要调试可以打开该宏 +#define AI_RECORD_TEST 1 //若需要调试可以打开该宏 #include "bleService.h" static uint32_t AI_audio_size=0; static uint8_t Cur_AI_Model= 0; @@ -468,7 +468,7 @@ static void* AudioCaptureProcess_AI(void* arg) readCnt, timeStamp.time.tv_sec, timeStamp.time.tv_nsec); } } - MEDIA_INFO_LOG("audioCap Read readCnt = %d, size = %d", readCnt, ret); + // MEDIA_INFO_LOG("audioCap Read readCnt = %d, size = %d", readCnt, ret); #endif } #if AI_RECORD_TEST @@ -487,7 +487,7 @@ static void* AudioCaptureProcess_AI(void* arg) int32_t streamingRecordAndSend_AI(int type) { - const char *argv[] = {"01", "sbc", "16000", "1", "16", "/user/aiRecord.sbc"}; + const char *argv[] = {"01", "mp3", "16000", "1", "16", "/user/aiRecord.sbc"}; int32_t argc = 6; Cur_AI_Model = type; if (g_audioSourceProcessInput.bThreadRun) { -- 2.17.1