Merge #1804 into sdk602patch0911 from refs/changes/1804/head
author胡传军 <1224667075@qq.com>
Wed, 4 Jun 2025 01:56:50 +0000 (01:56 +0000)
committer袁清梦 <3449750381@qq.com>
Wed, 4 Jun 2025 01:56:50 +0000 (01:56 +0000)
增加4Gai对话,待联调,且处于测试用服务器

* refs/changes/1804/head: (1 commits squashed)

  - 增加4Gai对话,待联调,且处于测试用服务器

Signed-off-by: aliyun8003852482 <1224667075@qq.com>
Reviewed-by: Caisking <3449750381@qq.com>
Reviewed-by: 罗正 <1732036298@qq.com>
Reviewed-by: aliyun8003852482 <1224667075@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Reviewed-by: aliyun6865282430 <1624952103@qq.com>
Merged-by: Caisking <3449750381@qq.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1804
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server/cat1_ai_server.cpp [new file with mode: 0644]
code/sdk/drivers/peripheral/slip/cat1Service/cat1_at_cmd.cpp
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp
code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp

index eb5a97e..43047db 100644 (file)
@@ -2394,7 +2394,11 @@ static void blesrvAi_send_service_task(void const *arg)
         \r
 \r
         if(mail.msg_data && mail.msg_len!=0)\r
-        send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count);\r
+        {\r
+              send_ai_bin(mail.msg_data,mail.msg_len);\r
+        }\r
+      \r
+        // send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count);\r
        \r
 \r
         if(mail.msg_data)\r
@@ -2402,7 +2406,7 @@ static void blesrvAi_send_service_task(void const *arg)
             free(mail.msg_data);\r
             mail.msg_data = NULL;\r
         }\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");\r
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");\r
     }\r
 }\r
 \r
@@ -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;\r
 \r
     uint32_t sendlen = sizeof(blesrv_custom_cmd_t);\r
-    uint32_t singlebuflen= ble_nus_max_data_len-20;\r
+    uint32_t singlebuflen= 1024;//ble_nus_max_data_len-20;\r
     blesrv_mail.msg_data=0;\r
 \r
     if(len<=singlebuflen)\r
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 (file)
index 0000000..53c8b6c
--- /dev/null
@@ -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
index ad94376..c6c834d 100644 (file)
@@ -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)
index e892084..f6aed44 100644 (file)
@@ -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;
+
+   
 }
 
 
index 791048a..197eb5c 100755 (executable)
@@ -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) {