From aac141a75bede353a1ef000c8d3b65b9d7285fe7 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Wed, 11 Jun 2025 14:19:07 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E5=BD=95=E9=9F=B3=E9=87=87?= =?utf8?q?=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../peripheral/slip/cat1Service/cat1_ws.cpp | 130 +++++++++++++----- .../slip/cat1Service/dev_authentication.cpp | 6 +- .../peripheral/slip/cat1Service/http_cat1.cpp | 53 ++++++- .../voice_call_volte_sample_wrapper.cpp | 105 +++++++++++++- .../wrapper/voice_call_volte_sample_wrapper.h | 4 + .../brandy/primary/primary_sub_port_in.c | 1 + 6 files changed, 252 insertions(+), 47 deletions(-) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp index 3765e8929..00b80818f 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp @@ -141,8 +141,11 @@ void * aic_zalloc(unsigned int len) return malloc(len); } - void uapi_start_tts_single_txt(char *buf); +void uapi_start_tts_single_txt(char *buf); +void uapi_start_tts_single(void); + +uint8_t server_state=0; // free @@ -866,6 +869,14 @@ void send_ai_txt(uint8_t type,char *msg) if (send_websocket_message(chat_client,( const unsigned char *)jsonString,strlen(jsonString),WS_TEXT)==0) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n"); + else + { + if(chat_client==NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"chat_client is NULL\n"); + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message fail\n"); + } cJSON_free(jsonString); } @@ -901,9 +912,15 @@ bool chat_result_analysis(char *buf) 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); - uapi_start_tts_single_txt(content_str_chat); - + // uapi_start_tts_single_txt(content_str_chat); + static uint8_t test=1; + if(test) + { + uapi_start_tts_single(); + test=0; + } + } } @@ -935,21 +952,22 @@ void bk_websocket_demo(void *data) { /* code */ is_bk_websocket_chat=1; - char url_buf[124]={0}; - if(chat_ws_url_init(url_buf)) - { - printf("%s\r\n",url_buf); - } - else - { - is_bk_websocket_chat=0; - return; - } + // char url_buf[124]={0}; + // if(chat_ws_url_init(url_buf)) + // { + // printf("%s\r\n",url_buf); + // } + // else + // { + // is_bk_websocket_chat=0; + // return; + // } uint8_t client_count=3; while (client_count) { - chat_client = init_websocket_client(url_buf,NULL,1); + // http://118.145.158.207:22080ws://118.145.158.207:22080/chat/ws + chat_client = init_websocket_client("ws://118.145.158.207:22080/chat/ws",NULL,0); if (chat_client== NULL) { client_count--; @@ -965,6 +983,12 @@ void bk_websocket_demo(void *data) { return; } + server_state=0x02^server_state; + if(server_state==0b00000111) + { + // uapi_start_asr(); + } + // send_ai_txt(1,"你是谁"); @@ -996,10 +1020,13 @@ void bk_websocket_demo(void *data) { #include "common_def.h" #include "los_printf.h" -#define CAT1_SERVICE_TASK_SIZE (0x1000*1) +#define CAT1_SERVICE_TASK_SIZE (2048) #define CAT1_SERVICE_TASK_PRIO 5 + + + errcode_t chat_server_init(void) { if(chat_client || is_bk_websocket_chat) @@ -1032,7 +1059,7 @@ errcode_t chat_server_init(void) // http://118.145.158.207:22080ws://amp.raisound.com/asr/ws -char asr_recv_buf[1024]={0}; +char *asr_recv_buf=NULL;//[1024]={0}; WebSocketClient *asr_client; int32_t uapi_tts_paly_init(void); @@ -1049,7 +1076,7 @@ void uapi_start_asr(void) else WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message erro\n"); - uapi_tts_paly_stop(); + // uapi_tts_paly_stop(); } //停止对话 @@ -1074,6 +1101,10 @@ void send_ai_bin(char *buf,uint32_t len) // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n"); bk_sleep(10); } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message fail 0\n"); + } // } @@ -1166,14 +1197,23 @@ bool aer_result_analysis(char *buf) SendMsgToUIService(UI_AI_JUMP_TO_RESULT_VIEW, 0, nullptr, 0);//先跳转到结果界面 ble_set_ai_Question_str(result_str_asr); send_ai_txt(0,result_str_asr); + + uapi_stop_asr(); + stop_AudioCaptureProcess_AI(); } if(strcmp(event_str,"TranscriptionStarted")==0) { //查询结果 // streamingRecordAndSend_AI(0); - bool state = true; - SendMsgToUIService(UI_AI_JUMP_TO_LISTENING_VIEW, 0, &state, sizeof(bool)); + // bool state = true; + // SendMsgToUIService(UI_AI_JUMP_TO_LISTENING_VIEW, 0, &state, sizeof(bool)); + startAudioCaptureTask(); + } + if(strcmp(event_str,"Failed")==0) + { + stop_AudioCaptureProcess_AI(); } + cJSON_Delete(root); return true; @@ -1197,9 +1237,11 @@ bool asr_ws_url_init(char * put_buf) { return false; } - } + + + void bk_websocket_asr(void *data) { // while (1) @@ -1211,22 +1253,22 @@ void bk_websocket_asr(void *data) { { //ws://amp.raisound.com/asr/ws - char url_buf[124]={0}; - if(asr_ws_url_init(url_buf)) - { - printf("%s\r\n",url_buf); - } - else - { - return; - } + // char url_buf[124]={0}; + // if(asr_ws_url_init(url_buf)) + // { + // printf("%s\r\n",url_buf); + // } + // else + // { + // return; + // } uint8_t client_count=3; while (client_count) { - // asr_client = init_websocket_client("ws://118.145.158.207:22080/asr/ws",NULL,0); - asr_client = init_websocket_client(url_buf,NULL,1); + asr_client = init_websocket_client("ws://118.145.158.207:22080/asr/ws",NULL,0); + // asr_client = init_websocket_client(url_buf,NULL,1); if (asr_client== NULL) { printf("init_websocket_client fail %d\r\n",client_count); client_count--; @@ -1243,6 +1285,14 @@ void bk_websocket_asr(void *data) { uapi_cat1_keep_wakeup(1); + server_state=0x01^server_state; + if(server_state==0b00000111) + { + // uapi_start_asr(); + } + + asr_recv_buf=(char *)malloc(0x400); + // uapi_start_asr(); // SendMsgToUIService(UI_4G_AI_INIT_STAUS, 0,&state, sizeof(bool)); @@ -1262,7 +1312,7 @@ void bk_websocket_asr(void *data) { // } - + free(asr_recv_buf); close_websocket_client(asr_client); asr_client=NULL; // return; @@ -1287,7 +1337,7 @@ errcode_t asr_server_init(void) taskcfg.create_queue_handle = NULL; taskcfg.attr.name="asr_server_init"; taskcfg.attr.priority = TASK_PRIORITY_APP; - taskcfg.attr.stack_size = CAT1_SERVICE_TASK_SIZE; + taskcfg.attr.stack_size = 0x1000; taskcfg.func = bk_websocket_asr; taskcfg.use_mem = USE_EXTEND_MEM; @@ -1467,7 +1517,13 @@ void bk_websocket_tts(void *data) { return; } - uapi_start_tts_single(); + server_state=0x04^server_state; + if(server_state==0b00000111) + { + // uapi_start_asr(); + } + + char* tts_recv_buf=(char *)malloc(1024*4); while (1) @@ -1513,7 +1569,7 @@ errcode_t tts_server_init(void) taskcfg.create_queue_handle = NULL; taskcfg.attr.name="tts_server_init"; taskcfg.attr.priority = TASK_PRIORITY_APP; - taskcfg.attr.stack_size = CAT1_SERVICE_TASK_SIZE; + taskcfg.attr.stack_size = 0x1000; taskcfg.func = bk_websocket_tts; taskcfg.use_mem = USE_EXTEND_MEM; @@ -1575,8 +1631,8 @@ bool init_ai_task(void) if(is_init_ai) { uapi_tts_paly_init(); - // asr_server_init(); - // chat_server_init(); + asr_server_init(); + chat_server_init(); tts_server_init(); // is_init_ai=0; } diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/dev_authentication.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/dev_authentication.cpp index bd4710233..d112dabb5 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/dev_authentication.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/dev_authentication.cpp @@ -447,17 +447,19 @@ void aut_active(void)//设备激活 // 输出JSON printf("JSON output: %s\n", json_string); - extern void put_data_by_get_file(char *data,uint16_t data_len); + extern uint32_t put_data_by_get_file(char *data,uint16_t data_len); put_data_by_get_file(json_string,strlen(json_string)); cJSON_free(json_string); + + } extern bool read_dev_pass(char *data_pass); -extern void post_data_by_get_file(char *data,uint16_t data_len); +extern uint32_t post_data_by_get_file(char *data,uint16_t data_len); void aut_login(void)//登录 diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/http_cat1.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/http_cat1.cpp index f3115cabe..f0304a765 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/http_cat1.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/http_cat1.cpp @@ -28,9 +28,15 @@ extern "C" { #define AUTH_SIGN_IN "/user/userdata/sign_in.json"//上报升级得到的json +osSemaphoreId_t put_done_sem; +static uint32_t put_srv_res=0; +osSemaphoreId_t post_done_sem; + +static uint32_t post_srv_res=0; + static httpc_connection_t settings = {0}; @@ -51,8 +57,11 @@ static httpc_connection_t settings = {0}; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "httpc_download_result_ui"); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"httpc_download_result , httpc_result_t %d, rx_content_len %d , srv_res %d, err %d\n", httpc_result,rx_content_len,srv_res,err); - if(srv_res==200) + // if(srv_res==200) { + put_srv_res=srv_res; + + (void)osSemaphoreRelease(put_done_sem); //激活成功 } return ; @@ -64,8 +73,12 @@ static httpc_connection_t settings = {0}; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "httpc_download_result_ui"); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"httpc_download_result , httpc_result_t %d, rx_content_len %d , srv_res %d, err %d\n", httpc_result,rx_content_len,srv_res,err); - if(srv_res==200) + // if(srv_res==200) { + post_srv_res=srv_res; + + (void)osSemaphoreRelease(post_done_sem); + //登录成功 } return ; @@ -73,8 +86,9 @@ static httpc_connection_t settings = {0}; -void put_data_by_get_file(char *data,uint16_t data_len) +uint32_t put_data_by_get_file(char *data,uint16_t data_len) { + memset_s(&settings,sizeof(settings),0,sizeof(settings)); settings.use_proxy=0; @@ -97,11 +111,25 @@ void put_data_by_get_file(char *data,uint16_t data_len) (const char*) otadatapath, &connection); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"custom_start_ota_download %d \r\n",rett); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "use_put"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "use_put"); + + if(rett==0) + { + put_done_sem = osSemaphoreNew(1, 0, NULL); + + osSemaphoreAcquire(put_done_sem, 1000*30); + + osSemaphoreDelete(put_done_sem); + return put_srv_res; + } + else + { + return rett; + } } -void post_data_by_get_file(char *data,uint16_t data_len) +uint32_t post_data_by_get_file(char *data,uint16_t data_len) { memset_s(&settings,sizeof(settings),0,sizeof(settings)); settings.use_proxy=0; @@ -126,6 +154,21 @@ void post_data_by_get_file(char *data,uint16_t data_len) &connection); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"custom_start_ota_download %d \r\n",rett); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "use_post"); + + if(rett==0) + { + post_done_sem = osSemaphoreNew(1, 0, NULL); + + osSemaphoreAcquire(post_done_sem, 1000*30); + + osSemaphoreDelete(post_done_sem); + + return post_srv_res; + } + else + { + return rett; + } } // {"success":true, // "msg":"激活成功.", diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.cpp b/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.cpp index 55ab83aa2..a58bdcf23 100755 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.cpp +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.cpp @@ -1136,7 +1136,9 @@ static void AiDeinitVoiceCallVolteResources(VoiceCallVolteContext *context) g_voiceCallVolteContext = nullptr; } } +#include "audio_capturer.h" +static std::shared_ptr g_audioCap; static int32_t RunVoiceCallVolteAI(VoiceCallVolteContext *context) @@ -1149,8 +1151,14 @@ static int32_t RunVoiceCallVolteAI(VoiceCallVolteContext *context) int32_t ret ; g_stream_out_downink = std::make_shared(); + + + if (ret != 0) { + MEDIA_ERR_LOG("audio stream out uplink init failed"); + } + // 16000 32000 44100 48000 - AudioRendererConfig renderConfig = {}; + AudioRendererConfig renderConfig = {}; renderConfig.audioFormat = PCM; renderConfig.channelCount = 1; renderConfig.linkDir = AUDIO_DOWN_LINK; @@ -1168,7 +1176,6 @@ static int32_t RunVoiceCallVolteAI(VoiceCallVolteContext *context) MEDIA_ERR_LOG("audio stream out downink play failed"); } - // uint32_t asiDownlinkChannelId = 0; // MEDIA_INFO_LOG("asiDownlinkChannelId: 0x%x", asiDownlinkChannelId); @@ -1226,6 +1233,98 @@ static void *VoiceAIThread(void *priv) return nullptr; } +#include "bleService.h" +static uint32_t AI_audio_size=0; +static uint8_t Cur_AI_Model= 0; + +uint8_t g_sample_needStop=0; + +uint8_t AudioCaptureTask_is_run=0; + +void stop_AudioCaptureProcess_AI(void) +{ + g_sample_needStop=1; +} + +static void* AudioCaptureProcess_AI(void* arg) +{ + MEDIA_ERR_LOG("AudioCaptureProcess_AI"); + + (void)g_stream_in_uplink.reset(); + + g_stream_in_uplink = std::make_shared(); + + + CapturerInputConfig captureConfig = {}; + captureConfig.audioFormat = MP3; + captureConfig.channelCount = 1; + captureConfig.linkDir = AUDIO_UP_LINK; + captureConfig.sampleRate = 16000; + captureConfig.sessionID = g_sessionId; + captureConfig.streamType = AUDIO_STREAM_VOICE_ASSISTANT; + + int ret = g_stream_in_uplink->Init(captureConfig); + + + // AI_data_assembly(1,start_data, Cur_AI_Model); + ret = g_stream_in_uplink->Start(); + if (ret != 0) { + MEDIA_ERR_LOG("audio stream out downink play failed"); + return NULL; + + } + MEDIA_ERR_LOG("g_stream_in_uplink->Start"); + + uint8_t* data_buf=(uint8_t *)malloc(1024); + + MEDIA_ERR_LOG("malloc"); + + AudioCaptureTask_is_run=1; + + while (!g_sample_needStop) { + LOS_Msleep(10); + CapturerBuffer capBuf = {}; + capBuf.data = data_buf; + capBuf.size = 1024; + capBuf.frameCount = 1; + int32_t readlen = g_stream_in_uplink->ObtainBuffer(capBuf, true); + if(readlen>0) + { + // MEDIA_ERR_LOG("readlen %d",readlen); + send_msg_data_into_Ai_msg_queue((void *)data_buf,(uint16_t)readlen,0); + memset_s(data_buf,1024,0,1024); + } + + // 蓝牙接口发送实时录音数据 + } + free(data_buf); + MEDIA_ERR_LOG("AI_audio_size %d",AI_audio_size); + + ret = g_stream_in_uplink->Stop(); + + g_stream_in_uplink->Release(); + + (void)g_stream_in_uplink.reset(); + + g_sample_needStop=0; + + MEDIA_INFO_LOG("AudioCaptureProcess end"); + AudioCaptureTask_is_run=0; + return NULL; +} + + +void startAudioCaptureTask(void) +{ + if(AudioCaptureTask_is_run) + { + MEDIA_ERR_LOG("AudioCaptureTask_is_run %d",AudioCaptureTask_is_run); + return; + } + MediaThreadattr attr = { "AudioCaptureTask", 0x1000, THREAD_SCHED_INVALID, 0, true }; + MediaThreadCreate(AudioCaptureProcess_AI, NULL, &attr); +} + int32_t AIStreamWrite(uint8_t *buf,uint32_t size) @@ -1263,7 +1362,7 @@ static int32_t StartAIpaly(const char **param) MediaMutexUnLock(g_voiceCallVolteContextMutex); // 3. create voice call volte thread - MediaThreadattr attr = { "VoiceCallVolteHFPThread", 0x2000, THREAD_SCHED_INVALID, 0, false }; + MediaThreadattr attr = { "VoiceCallVolteHFPThread", 0x1000, THREAD_SCHED_INVALID, 0, false }; g_voiceCallVolteContext->taskHandle = MediaThreadCreate(VoiceAIThread, g_voiceCallVolteContext, &attr); if ( g_voiceCallVolteContext->taskHandle == nullptr) { MEDIA_ERR_LOG("create voice call volte thread failed"); diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.h b/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.h index 8a1f45530..03f7368af 100755 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.h +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/voice_call_volte_sample_wrapper.h @@ -23,6 +23,10 @@ int32_t AIStreamWrite(uint8_t *buf,uint32_t size); AudioSession get_ai_g_sessionId(void); +void startAudioCaptureTask(void); + +void stop_AudioCaptureProcess_AI(void); + #ifdef __cplusplus }; #endif diff --git a/code/sdk/middleware/services/media/hal/audio/plugins/brandy/primary/primary_sub_port_in.c b/code/sdk/middleware/services/media/hal/audio/plugins/brandy/primary/primary_sub_port_in.c index affafc57e..acae0e7a4 100755 --- a/code/sdk/middleware/services/media/hal/audio/plugins/brandy/primary/primary_sub_port_in.c +++ b/code/sdk/middleware/services/media/hal/audio/plugins/brandy/primary/primary_sub_port_in.c @@ -97,6 +97,7 @@ static SubPortTrackInCapabilities g_caps[] = { { AUDIO_IN_COMMUNICATION, AUDIO_FORMAT_mSBC, 16000, 1 }, { AUDIO_IN_COMMUNICATION, AUDIO_FORMAT_PCM_16_BIT, 8000, 1}, { AUDIO_IN_COMMUNICATION, AUDIO_FORMAT_PCM_16_BIT, 16000, 1 }, + { AUDIO_IN_COMMUNICATION, AUDIO_FORMAT_MP3, 16000, 1 }, }; static bool IsSupported(const struct PortPluginAttr *inputAttr) -- 2.17.1