From: @CHENG <2393524978@qq.com> Date: Wed, 25 Sep 2024 08:02:12 +0000 (+0800) Subject: __MMI_CUSTOM_VOICECHAT_SUPPORT__ X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=1a4917ca0027e20ed35178120b460de2daa1023f;p=mirrors%2FASR3603_Z5.git __MMI_CUSTOM_VOICECHAT_SUPPORT__ --- diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c index c3fb592d..679459e6 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c @@ -24,14 +24,14 @@ #ifdef __MMI_CUSTOM_AIGC_SUPPORT__ #include "mmi_aigc_ui.c" #include "mmi_aigc_data.c" -#ifdef __MMI_CUSTOM_AIGC_AUTHENTICATE_SUPPORT__ -#include "mmi_aigc_authenticate.c" -#endif #endif #ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ #include "mmi_voicechat_ui.c" #include "mmi_voicechat_data.c" #endif +#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__ +#include "mmi_ai_authenticate.c" +#endif #ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ #include "bei_ke_rui_sheng.c" @@ -44,18 +44,18 @@ int mmi_ws_header_add_custom_info_check(void) { -#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ - return 1; -#endif +//#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ +// return 1; +//#endif return 0; } char * mmi_ws_header_add_custom_info_get(void) { -#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ - return "X-NLS-Token: 0c8b8f05a46f423096be64a9c4c46310\r\n"; -#endif +//#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ +// return "X-NLS-Token: 0c8b8f05a46f423096be64a9c4c46310\r\n"; +//#endif return NULL; } diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h index 32602fa4..47032ff8 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h @@ -36,14 +36,14 @@ extern "C" { #ifdef __MMI_CUSTOM_AIGC_SUPPORT__ #include "mmi_aigc_ui.h" #include "mmi_aigc_data.h" -#ifdef __MMI_CUSTOM_AIGC_AUTHENTICATE_SUPPORT__ -#include "mmi_aigc_authenticate.h" -#endif #endif #ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ #include "mmi_voicechat_ui.h" #include "mmi_voicechat_data.h" #endif +#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__ +#include "mmi_ai_authenticate.h" +#endif #ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__ #include "bei_ke_rui_sheng.h" diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.c index 9eaaf8bd..4f3ead84 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.c @@ -9,9 +9,7 @@ static void mmi_voicechat_data_send_task_msg_send(MMI_VOICECHAT_DATA_SEND_MSG_ID - static char s_voicechat_dialog_id[MMI_VOICECHAT_MSG_DIALOG_ID_LEN + 1] = {0}; - void mmi_voicechat_dialog_id_set(char * id) { if(NULL == id) @@ -26,6 +24,71 @@ char * mmi_voicechat_dialog_id_get(void) return s_voicechat_dialog_id; } +static char s_voicechat_trace_id[MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1] = {0}; +void mmi_voicechat_trace_id_set(char * id) +{ + if(NULL == id) + return; + + _lv_memset_00(s_voicechat_trace_id, (MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1)); + _lv_memcpy(s_voicechat_trace_id, id, MMI_VOICECHAT_MSG_TRACE_ID_LEN); +} + +char * mmi_voicechat_trace_id_get(void) +{ + return s_voicechat_trace_id; +} + +static char s_voicechat_task_id[MMI_VOICECHAT_MSG_TASK_ID_LEN + 1] = {0}; +void mmi_voicechat_task_id_set(char * id) +{ + if(NULL == id) + return; + + _lv_memset_00(s_voicechat_task_id, (MMI_VOICECHAT_MSG_TASK_ID_LEN + 1)); + _lv_memcpy(s_voicechat_task_id, id, MMI_VOICECHAT_MSG_TASK_ID_LEN); +} + +char * mmi_voicechat_task_id_get(void) +{ + return s_voicechat_task_id; +} + +static char s_voicechat_server_state[32] = {0}; +void mmi_voicechat_server_state_set(char * state_str) +{ + if(0 == strncmp(MMI_VOICECHAT_SERVER_STATE_LISTENING, state_str, strlen(state_str)) + || 0 == strncmp(MMI_VOICECHAT_SERVER_STATE_THINKING, state_str, strlen(state_str)) + || 0 == strncmp(MMI_VOICECHAT_SERVER_STATE_RESPONDING, state_str, strlen(state_str)) + ) + { + _lv_memset_00(s_voicechat_server_state, 32); + _lv_memcpy(s_voicechat_server_state, state_str, strlen(state_str)); + } +} + +bool mmi_voicechat_server_state_is_listening(void) +{ + if(0 == strncmp(s_voicechat_server_state, MMI_VOICECHAT_SERVER_STATE_LISTENING, strlen(MMI_VOICECHAT_SERVER_STATE_LISTENING))) + { + return true; + } + + return false; +} + +static bool s_voicechat_recv_tts_flag = false; +void mmi_voicechat_recv_tts_flag_set(bool flag) +{ + s_voicechat_recv_tts_flag = flag; +} + +bool mmi_voicechat_recv_tts_flag_get(void) +{ + return s_voicechat_recv_tts_flag; +} + + void mmi_random_string_generate(char * str_buf, uint16_t str_size, uint16_t str_len) { #if 0 @@ -82,30 +145,35 @@ void mmi_voicechat_send_start_request_msg(void * param, uint32_t param_size) mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_START_REQUEST, NULL, 0); } +//{"header":{"trace_id":"ailaqbo0r6o","event":"Start"}, +//"payload":{"device_id":"test_device_id","user_agent":"python","in_format":"pcm","out_format":"pcm","sample_rate":16000,"space_time":100}} static void mmi_voicechat_send_start_request_process(void * data_ptr, uint32_t data_len) { char send_ptr[1024] = {0}; int send_len = 0; - char message_id[MMI_VOICECHAT_MSG_MESSAGE_ID_LEN + 1] = {0}; - char task_id[MMI_VOICECHAT_MSG_TASK_ID_LEN + 1] = {0}; + char trace_id[MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1] = {0}; char imei[16 + 1] = {0}; app_adp_get_imei_req(imei); - mmi_random_string_generate(message_id, MMI_VOICECHAT_MSG_MESSAGE_ID_LEN + 1, MMI_VOICECHAT_MSG_MESSAGE_ID_LEN); - mmi_random_string_generate(task_id, MMI_VOICECHAT_MSG_TASK_ID_LEN + 1, MMI_VOICECHAT_MSG_TASK_ID_LEN); + mmi_random_string_generate(trace_id, MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1, MMI_VOICECHAT_MSG_TRACE_ID_LEN); + mmi_voicechat_trace_id_set(trace_id); - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: message_id=%s\n", __FUNCTION__, __LINE__, message_id); - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: task_id=%s\n", __FUNCTION__, __LINE__, task_id); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: trace_id=%s\n", __FUNCTION__, __LINE__, trace_id); - send_len += sprintf(send_ptr, "{\"header\":{\"namespace\":\"VoiceChat\",\"name\":\"Start\"," - "\"appkey\":\"%s\",\"message_id\":\"%s\",\"task_id\":\"%s\"},", - MMI_VOICECHAT_MSG_APPKEY, message_id, task_id); + send_len += sprintf(send_ptr, "{"); + + send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"Start\",\"trace_id\":\"%s\"},", trace_id); + send_len += sprintf(send_ptr + send_len, "\"payload\":{\"user_agent\":\"python\",\"device_id\":\"%s\"," - "\"dialog_attributes\":{\"model_id\":\"qwen-plus\"," - "\"prompt\":\"你是一个有用的语音助手\"," - "\"voice\":\"longxiaochun\"}}}", - imei); + "\"in_format\":\"%s\",\"out_format\":\"%s\"," + //"\"sample_rate\":%d,\"space_time\":500,\"volume\":\"3\"}", + "\"space_time\":400}", + imei, + MMI_VOICECHAT_UL_AUDIO_FORMAT_STR, + MMI_VOICECHAT_DL_AUDIO_FORMAT_STR); + + send_len += sprintf(send_ptr + send_len, "}"); #ifdef MMI_VOICECHAT_DEBUG_TO_FILE mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len); @@ -121,118 +189,184 @@ static void mmi_voicechat_send_start_request_process(void * data_ptr, uint32_t d } -#if 0 -void mmi_voicechat_send_tts_text_msg(void * param, uint32_t param_size) -{ - mmi_voicechat_data_send_task_msg_send(MMI_VOICECHAT_MSG_TTS_TEXT_SEND, param, param_size); +void mmi_voicechat_send_send_speech_msg(void * param, uint32_t param_size) +{ + mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_SEND_SPEECH, NULL, 0); } -static void mmi_voicechat_send_tts_text_data_process(void * data_ptr, uint32_t data_len) +//{"header":{"trace_id":"ailaqbo0r6o","event":"SendSpeech"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}} +static void mmi_voicechat_send_send_speech_process(void * data_ptr, uint32_t data_len) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + char send_ptr[1024] = {0}; + int send_len = 0; + + send_len += sprintf(send_ptr, "{"); - uint32_t temp_len = 0; - uint32_t send_buff_len = data_len + 256; - char * send_buff_ptr = lv_mem_alloc(send_buff_len); - if(NULL == send_buff_ptr) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__); - return; - } - _lv_memset_00(send_buff_ptr, send_buff_len); + send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"SendSpeech\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get()); - temp_len = 0; - temp_len += sprintf(send_buff_ptr + temp_len, "{\"header\":{\"event\":\"LongTextStream\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},"); - temp_len += sprintf(send_buff_ptr + temp_len, "\"payload\":{\"voice\":\"xiaoyun\",\"format\":\"mp3\",\"sample_rate\":8000,\"volume\":50,\"speech_rate\":2,"); // 0,"); - temp_len += sprintf(send_buff_ptr + temp_len, "\"text\":\"%s\"}}", data_ptr); // 185 + data_len + send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get()); + + send_len += sprintf(send_ptr + send_len, "}"); #ifdef MMI_VOICECHAT_DEBUG_TO_FILE - mmi_debug_info_write_to_file(VOICECHAT_SEND_TTS_TEXT_FILE, send_buff_ptr, temp_len); + mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len); #endif - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send_len=%d\n", __FUNCTION__, __LINE__, temp_len); - //int ret = mmi_voicechat_tts_websocket_send_text_data(send_buff_ptr, temp_len); - //if(0 > ret) - { - //VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); - //mmi_voicechat_list_screen_signal_weak_prompt(); - } - if(NULL != send_buff_ptr) + int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len); + if(0 > ret) { - lv_mem_free(send_buff_ptr); - send_buff_ptr = NULL; - } + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); + } +} + +void mmi_voicechat_send_speech_data_msg(void * param, uint32_t param_size) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, param_size, param); + mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_SPEECH_DATA, param, param_size); } + +static void mmi_voicechat_send_speech_data_process(void * data_ptr, uint32_t data_len) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, data_len, data_ptr); + +#ifdef MMI_VOICECHAT_DEBUG_TO_FILE + mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, data_ptr, data_len); #endif + int ret = mmi_voicechat_websocket_send_binary_data(data_ptr, data_len); + if(0 > ret) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); + } +} -#if 0 -static void mmi_voicechat_tts_audio_data_recv_msg(void * param, uint32_t param_size) +void mmi_voicechat_send_stop_speech_msg(void * param, uint32_t param_size) { - mmi_voicechat_data_recv_task_msg_send(MMI_VOICECHAT_MSG_TTS_AUDIO_RECV, param, param_size); + mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_STOP_SPEECH, NULL, 0); } -static void mmi_voicechat_recv_tts_audio_data_process(void * data_ptr, uint32_t data_len) +//{"header":{"trace_id":"ailaqbo0r6o","event":"StopSpeech"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}} +static void mmi_voicechat_send_stop_speech_process(void * data_ptr, uint32_t data_len) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len); - cplog_printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len); - if(NULL == data_ptr) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__); - return; - } + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + char send_ptr[1024] = {0}; + int send_len = 0; + + send_len += sprintf(send_ptr, "{"); + + send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"StopSpeech\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get()); + + send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get()); + + send_len += sprintf(send_ptr + send_len, "}"); #ifdef MMI_VOICECHAT_DEBUG_TO_FILE - mmi_debug_info_write_to_file(VOICECHAT_RECV_TTS_FILE, data_ptr, data_len); + //mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len); #endif - cJSON * json_root = cJSON_Parse(data_ptr); - if(NULL != json_root) + int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len); + if(0 > ret) { - cplog_printf("[@CHENG_DEBUG][%s][%d]: json root\n", __FUNCTION__, __LINE__); - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts json\n", __FUNCTION__, __LINE__); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); + } +} - cJSON * json_header = cJSON_GetObjectItem(json_root, "header"); - if(NULL != json_header) - { - char * value_event_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_header, "event")); - if(0 == strncmp(value_event_str, "EndSynthesis", strlen("EndSynthesis"))) - { - // end - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: EndSynthesis\n", __FUNCTION__, __LINE__); - - mmi_voicechat_tts_end_synthesis_action(); - } - } - } - else +void mmi_voicechat_send_start_play_msg(void * param, uint32_t param_size) +{ + mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_START_PLAY, NULL, 0); +} + +//{"header":{"trace_id":"ailaqbo0r6o","event":"LocalRespondingStarted"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}} +static void mmi_voicechat_send_start_play_process(void * data_ptr, uint32_t data_len) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + char send_ptr[1024] = {0}; + int send_len = 0; + + send_len += sprintf(send_ptr, "{"); + + send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"LocalRespondingStarted\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get()); + + send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get()); + + send_len += sprintf(send_ptr + send_len, "}"); + +#ifdef MMI_VOICECHAT_DEBUG_TO_FILE + //mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len); +#endif + + int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len); + if(0 > ret) { - // tts data - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts data\n", __FUNCTION__, __LINE__); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); + } +} - if(true == mmi_voicechat_tts_audio_store(data_ptr, data_len)) - { - - } - } +void mmi_voicechat_send_stop_play_msg(void * param, uint32_t param_size) +{ + mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_STOP_PLAY, NULL, 0); +} - if(NULL != json_root) +//{"header":{"trace_id":"ailaqbo0r6o","event":"LocalRespondingEnded"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}} +static void mmi_voicechat_send_stop_play_process(void * data_ptr, uint32_t data_len) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + char send_ptr[1024] = {0}; + int send_len = 0; + + send_len += sprintf(send_ptr, "{"); + + send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"LocalRespondingEnded\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get()); + + send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get()); + + send_len += sprintf(send_ptr + send_len, "}"); + +#ifdef MMI_VOICECHAT_DEBUG_TO_FILE + //mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len); +#endif + + int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len); + if(0 > ret) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__); - cplog_printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__); - cJSON_Delete(json_root); - json_root = NULL; - } + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); + } } -void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset) +void mmi_voicechat_send_speak_request_msg(void * param, uint32_t param_size) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len); - //cplog_printf("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len); + mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_SPEAK_REQUEST, NULL, 0); +} + +//{"header":{"trace_id":"ailaqbo0r6o","event":"RequestToSpeak"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}} +static void mmi_voicechat_send_speak_request_process(void * data_ptr, uint32_t data_len) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + char send_ptr[1024] = {0}; + int send_len = 0; + + send_len += sprintf(send_ptr, "{"); - mmi_voicechat_tts_audio_data_recv_msg(data_ptr, data_len); + send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"RequestToSpeak\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get()); + + send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get()); + + send_len += sprintf(send_ptr + send_len, "}"); + +#ifdef MMI_VOICECHAT_DEBUG_TO_FILE + mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len); +#endif + + int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len); + if(0 > ret) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret); + } } -#else + + + void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset) { @@ -252,30 +386,100 @@ void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, in cJSON * json_root = cJSON_Parse(data_ptr); if(NULL != json_root) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts json\n", __FUNCTION__, __LINE__); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: json\n", __FUNCTION__, __LINE__); cJSON * json_header = cJSON_GetObjectItem(json_root, "header"); if(NULL != json_header) { - char * value_event_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_header, "event")); - if(0 == strncmp(value_event_str, "EndSynthesis", strlen("EndSynthesis"))) + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + // + } + else + { + char * value_event = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "event")); + cJSON * json_payload = cJSON_GetObjectItem(json_root, "payload"); + if(0 == strncmp(value_event, "Started", strlen("Started"))) { - // end - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: EndSynthesis\n", __FUNCTION__, __LINE__); + char * value_dialog_id = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "dialog_id")); - mmi_voicechat_tts_end_synthesis_action(); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: Started,%s\n", __FUNCTION__, __LINE__, value_dialog_id); + mmi_voicechat_dialog_id_set(value_dialog_id); + } + else if(0 == strncmp(value_event, "DialogStateChanged", strlen("DialogStateChanged"))) + { + char * value_state = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "state")); + + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: DialogStateChanged,%s\n", __FUNCTION__, __LINE__, value_state); + mmi_voicechat_server_state_set(value_state); + + if(true == mmi_voicechat_server_state_is_listening()) + { + mmi_voicechat_send_send_speech_msg(NULL, 0); + } + } + else if(0 == strncmp(value_event, "SpeechContent", strlen("SpeechContent"))) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: SpeechContent\n", __FUNCTION__, __LINE__); + + // update translate text + // "finished":true + char * value_text = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "text")); + mmi_voicechat_trans_text_result_update(value_text, strlen(value_text)); + mmi_voicechat_trans_text_screen_update(); + } + else if(0 == strncmp(value_event, "SpeechEnded", strlen("SpeechEnded"))) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: SpeechEnded\n", __FUNCTION__, __LINE__); + + mmi_voicechat_listening_screen_stop_update(); + // translate text end + } + else if(0 == strncmp(value_event, "RespondingContent", strlen("RespondingContent"))) + { + static uint16_t t_count = 0; + t_count++; + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: RespondingContent.times=%d\n", __FUNCTION__, __LINE__, t_count); + + // update respone text + // "finished":true + char * value_text = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "text")); + mmi_voicechat_chat_text_result_update(value_text, strlen(value_text)); + mmi_voicechat_chat_text_screen_update(); + + if(cJSON_IsTrue(cJSON_GetObjectItem(json_payload, "finished"))) + { + mmi_voicechat_chat_text_refresh_task_cb(NULL); + mmi_voicechat_chat_text_refresh_stop(); + } + } + else if(0 == strncmp(value_event, "RespondingStarted", strlen("RespondingStarted"))) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: RespondingStarted\n", __FUNCTION__, __LINE__); + + // server start send audio prompt + mmi_voicechat_recv_tts_flag_set(true); + mmi_voicechat_tts_audio_update_pre(); + } + else if(0 == strncmp(value_event, "RespondingEnded", strlen("RespondingEnded"))) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: RespondingEnded\n", __FUNCTION__, __LINE__); + + // server stop send audio prompt + mmi_voicechat_recv_tts_flag_set(false); + + mmi_voicechat_tts_audio_play(); } } } else { - // tts data - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts data\n", __FUNCTION__, __LINE__); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: data\n", __FUNCTION__, __LINE__); - if(true == mmi_voicechat_tts_audio_store(data_ptr, data_len)) - { - - } + //if(true == mmi_voicechat_recv_tts_flag_get()) + //{ + // + mmi_voicechat_tts_audio_result_update(data_ptr, data_len); + //} } if(NULL != json_root) @@ -286,7 +490,6 @@ void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, in json_root = NULL; } } -#endif #if 0 @@ -459,27 +662,29 @@ static void mm_voicechat_data_send_task_handle(void * param) //mmi_voicechat_send_trans_audio_data_process(msg_param, param_size); break; - #if 0 - case MMI_VOICECHAT_MSG_TRANS_STOP_SEND: - //mmi_voicechat_send_trans_stop_data_process(msg_param, param_size); + case VOICECHAT_MSG_ID_SEND_SPEECH: + mmi_voicechat_send_send_speech_process(msg_param, param_size); break; - case MMI_VOICECHAT_MSG_CHAT_TEXT_SEND: - //mmi_voicechat_send_chat_text_data_process(msg_param, param_size); + case VOICECHAT_MSG_ID_SPEECH_DATA: + mmi_voicechat_send_speech_data_process(msg_param, param_size); break; - case MMI_VOICECHAT_MSG_TTS_START_SEND: - //mmi_voicechat_send_tts_start_data_process(msg_param, param_size); + case VOICECHAT_MSG_ID_STOP_SPEECH: + mmi_voicechat_send_stop_speech_process(msg_param, param_size); break; - - case MMI_VOICECHAT_MSG_TTS_TEXT_SEND: - //mmi_voicechat_send_tts_text_data_process(msg_param, param_size); + + case VOICECHAT_MSG_ID_START_PLAY: + mmi_voicechat_send_start_play_process(msg_param, param_size); break; - - case MMI_VOICECHAT_MSG_TTS_STOP_SEND: - //mmi_voicechat_send_tts_stop_data_process(msg_param, param_size); + + case VOICECHAT_MSG_ID_STOP_PLAY: + mmi_voicechat_send_stop_play_process(msg_param, param_size); + break; + + case VOICECHAT_MSG_ID_SPEAK_REQUEST: + mmi_voicechat_send_speak_request_process(msg_param, param_size); break; - #endif default: break; diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.h index 2618067f..12c26f4e 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.h +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.h @@ -23,13 +23,16 @@ extern "C" { #include "../../../../product/craneg_modem/pcac/wsclient/libwebsockets/inc/mmi_voicechat_websocket.h" -#define MMI_VOICECHAT_MSG_APPKEY ("j2QhAoOeBi5AUlrM") - #define MMI_VOICECHAT_MSG_DIALOG_ID_LEN (32) -#define MMI_VOICECHAT_MSG_MESSAGE_ID_LEN (32) +#define MMI_VOICECHAT_MSG_TRACE_ID_LEN (32) #define MMI_VOICECHAT_MSG_TASK_ID_LEN (32) +#define MMI_VOICECHAT_SERVER_STATE_LISTENING ("Listening") +#define MMI_VOICECHAT_SERVER_STATE_THINKING ("Thinking") +#define MMI_VOICECHAT_SERVER_STATE_RESPONDING ("Responding") + + #if 0 #define MMI_VOICECHAT_DATA_RECV_TASK_PRIORITY 220 @@ -61,7 +64,14 @@ typedef enum VOICECHAT_MSG_ID_START_REQUEST, VOICECHAT_MSG_ID_STOP_REQUEST, + VOICECHAT_MSG_ID_SEND_SPEECH, + VOICECHAT_MSG_ID_SPEECH_DATA, + VOICECHAT_MSG_ID_STOP_SPEECH, + VOICECHAT_MSG_ID_START_PLAY, + VOICECHAT_MSG_ID_STOP_PLAY, + + VOICECHAT_MSG_ID_SPEAK_REQUEST, VOICECHAT_MSG_ID_END }MMI_VOICECHAT_DATA_SEND_MSG_ID_E; @@ -83,6 +93,17 @@ void mmi_voicechat_data_task_delete(void); void mmi_voicechat_send_start_request_msg(void * param, uint32_t param_size); +void mmi_voicechat_send_send_speech_msg(void * param, uint32_t param_size); + +void mmi_voicechat_send_speech_data_msg(void * param, uint32_t param_size); + +void mmi_voicechat_send_stop_speech_msg(void * param, uint32_t param_size); + +void mmi_voicechat_send_start_play_msg(void * param, uint32_t param_size); + +void mmi_voicechat_send_stop_play_msg(void * param, uint32_t param_size); + +void mmi_voicechat_send_speak_request_msg(void * param, uint32_t param_size); #endif diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.c b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.c index 3a66e700..c0b0c61e 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.c +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.c @@ -13,17 +13,13 @@ static mmi_voicechat_msg_info_t * s_voicechat_info_p = &s_voicechat_info_t; static uint8_t s_voicechat_current_chat_index = 0; // 1 chat = 2 msg items static uint32_t s_voicechat_recording_sent_size = 0; -static uint32_t s_voicechat_tts_text_sent_size = 0; -static bool s_voicechat_trans_text_end = false; static bool s_voicechat_tts_audio_playing = false; static lv_ll_t s_voicechat_tts_audio_ll = {0}; static mmi_voicechat_tts_audio_ll_t * s_voicechat_tts_audio_play_node = NULL; static bool s_voicechat_ws_open_flag = false; - -#define MMI_VOICECHAT_SEND_TTS_TEXT_MAX (150) // 50 -#define MMI_VOICECHAT_SEND_TTS_TEXT_MIN (99) // 33 +static bool s_voicechat_start_flag = false; static lv_res_t mmi_voicechat_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); @@ -92,15 +88,9 @@ uint8_t mmi_voicechat_msg_count_get(void) return msg_count; } -char * mmi_voicechat_trans_result_text_get(uint32_t * data_len) -{ - mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[0]); - - * data_len = t_voicechat_item_info->text_data_size; - return (t_voicechat_item_info->text_data_ptr); -} -bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len, bool is_end) + +bool mmi_voicechat_trans_text_result_update(char * data_buff, uint32_t data_len) { if(NULL == data_buff || 0 == data_len) { @@ -108,16 +98,14 @@ bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len, return false; } - if(true == s_voicechat_trans_text_end) + mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[0]); + if(NULL != t_voicechat_item_info->text_data_ptr) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - return false; + lv_mem_free(t_voicechat_item_info->text_data_ptr); + t_voicechat_item_info->text_data_ptr = NULL; + t_voicechat_item_info->text_data_size = 0; } - s_voicechat_trans_text_end = is_end; - mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[0]); - -#if 1 char * temp_ptr = lv_mem_alloc(data_len + 1); if(NULL == temp_ptr) { @@ -126,106 +114,77 @@ bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len, } _lv_memset_00(temp_ptr, data_len + 1); _lv_memcpy(temp_ptr, data_buff, data_len); - - if(NULL != t_voicechat_item_info->text_data_ptr) - { - lv_mem_free(t_voicechat_item_info->text_data_ptr); - t_voicechat_item_info->text_data_ptr = NULL; - } + t_voicechat_item_info->text_data_ptr = temp_ptr; t_voicechat_item_info->text_data_size = data_len; - -#else - if(NULL == t_voicechat_item_info->text_data_ptr) - { - char * temp_ptr = lv_mem_alloc(data_len + 1); - if(NULL == temp_ptr) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__); - return false; - } - _lv_memset_00(temp_ptr, data_len + 1); - _lv_memcpy(temp_ptr, data_buff, data_len); - - t_voicechat_item_info->text_data_ptr = temp_ptr; - t_voicechat_item_info->text_data_size = data_len; - } - else - { - char * temp_ptr = lv_mem_realloc(t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size + data_len + 1); - if(NULL == temp_ptr) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__); - return false; - } - _lv_memset_00(temp_ptr + t_voicechat_item_info->text_data_size, data_len + 1); - _lv_memcpy(temp_ptr + t_voicechat_item_info->text_data_size, data_buff, data_len); - - t_voicechat_item_info->text_data_ptr = temp_ptr; - t_voicechat_item_info->text_data_size += data_len; - } -#endif + t_voicechat_item_info->msg_from = 0; s_voicechat_info_p->msg_count = 1; - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr); - -#ifdef MMI_VOICECHAT_DEBUG_TO_FILE - //mmi_debug_info_write_to_file(VOICECHAT_RECV_TRANS_RESULT_FILE, t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size); -#endif + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, + t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr); return true; } -static void mmi_voicechat_trans_text_middle_screen_task_cb(lv_task_t * task) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state); +static bool s_trans_text_update_flag = false; +void mmi_voicechat_trans_text_refresh_stop(void) +{ + lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); + if(NULL == ext) + return; - if(MMI_VOICECHAT_UI_STATE_LISTENING == s_voicechat_ui_state || MMI_VOICECHAT_UI_STATE_LISTENING_MIDDLE == s_voicechat_ui_state) - { + if(NULL != ext->refresh_task_p) + { + lv_task_del(ext->refresh_task_p); + ext->refresh_task_p = NULL; + } +} + +void mmi_voicechat_trans_text_refresh_task_cb(lv_task_t * task) +{ + if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); if(NULL == ext) return; - - mmi_voicechat_list_set_slide_enable(&ext->old_ext, true); - - if(0 != mmi_voicechat_msg_count_get()) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - mmi_voicechat_listening_middle_screen_display(); - } + //mmi_voicechat_list_screen_list_refresh(); + mmi_voicechat_msg_item_info_t * msg_item = &(s_voicechat_info_p->msg_item[0]); + if(NULL != ext->list_self_label) + lv_label_set_text(ext->list_self_label, msg_item->text_data_ptr); + } + else + { + mmi_voicechat_trans_text_refresh_stop(); } } -void mmi_voicechat_trans_text_middle_screen_update(void) +void mmi_voicechat_trans_text_refresh_start(void) { - lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_middle_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); - lv_task_once(task_p); -} + lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); + if(NULL == ext) + return; -static void mmi_voicechat_trans_text_screen_close_task_cb(lv_task_t * task) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + if(MMI_VOICECHAT_UI_STATE_LIST != s_voicechat_ui_state) + return; - mmi_voicechat_thinking_screen_display(); - - mmi_voicechat_chat_text_download_requst(); + if(NULL != ext->refresh_task_p) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; + } + ext->refresh_task_p = lv_task_create(mmi_voicechat_trans_text_refresh_task_cb, 100, LV_TASK_PRIO_HIGH, NULL); } -static void mmi_voicechat_trans_text_stop_screen_task_cb(void) +static void mmi_voicechat_trans_text_screen_task_cb(void) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state); - // wb - //mmi_voicechat_trans_websocket_close(); - //mmi_voicechat_chat_websocket_open(); - if(MMI_VOICECHAT_UI_STATE_LISTENING == s_voicechat_ui_state || MMI_VOICECHAT_UI_STATE_LISTENING_MIDDLE == s_voicechat_ui_state) { - // record - mmi_voicechat_listening_stop(true); - lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); if(NULL == ext) return; @@ -242,128 +201,81 @@ static void mmi_voicechat_trans_text_stop_screen_task_cb(void) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - mmi_voicechat_listening_middle_screen_display(); + mmi_voicechat_list_screen_display(); - lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_screen_close_task_cb, 1000, LV_TASK_PRIO_HIGH, NULL); - lv_task_once(task_p); + mmi_voicechat_trans_text_refresh_start(); } } } -void mmi_voicechat_trans_text_stop_screen_update(void) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - - lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_stop_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); - lv_task_once(task_p); -} - -static void mmi_voicechat_trans_text_fail_screen_task_cb(void) +void mmi_voicechat_trans_text_screen_update(void) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - mmi_voicechat_default_screen_display(); -} + if(true == s_trans_text_update_flag) + return; -void mmi_voicechat_trans_text_start_msg_send_fail(void) -{ - //mmi_voicechat_trans_websocket_close(); - mmi_voicechat_listening_stop(true); - - lv_voicechat_ext_t * ext = (lv_voicechat_ext_t *)mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); - if(NULL == ext) - return ; + s_trans_text_update_flag = true; - lv_obj_set_hidden(ext->listening_signal_weak_label, false); - - lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_fail_screen_task_cb, 1500, LV_TASK_PRIO_HIGH, NULL); + lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); lv_task_once(task_p); } -void mmi_voicechat_trans_text_audio_msg_send_fail(void) -{ - mmi_voicechat_websocket_close(); - mmi_voicechat_websocket_open(); -} - -char * mmi_voicechat_chat_result_text_get(uint32_t * data_len) -{ - mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[1]); - - * data_len = t_voicechat_item_info->text_data_size; - return (t_voicechat_item_info->text_data_ptr); -} - -bool mmi_voicechat_chat_result_text_store(char * data_buff, uint32_t data_len) +bool mmi_voicechat_chat_text_result_update(char * data_buff, uint32_t data_len) { if(NULL == data_buff || 0 == data_len) { - printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); return false; } mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[1]); - - if(NULL == t_voicechat_item_info->text_data_ptr) + if(NULL != t_voicechat_item_info->text_data_ptr) { - char * temp_ptr = lv_mem_alloc(data_len + 1); - if(NULL == temp_ptr) - { - printf("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__); - return false; - } - _lv_memset_00(temp_ptr, data_len + 1); - _lv_memcpy(temp_ptr, data_buff, data_len); - - t_voicechat_item_info->text_data_ptr = temp_ptr; - t_voicechat_item_info->text_data_size = data_len; + lv_mem_free(t_voicechat_item_info->text_data_ptr); + t_voicechat_item_info->text_data_ptr = NULL; + t_voicechat_item_info->text_data_size = 0; } - else - { - char * temp_ptr = lv_mem_realloc(t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size + data_len + 1); - if(NULL == temp_ptr) - { - printf("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__); - return false; - } - _lv_memset_00(temp_ptr + t_voicechat_item_info->text_data_size, data_len + 1); - _lv_memcpy(temp_ptr + t_voicechat_item_info->text_data_size, data_buff, data_len); - t_voicechat_item_info->text_data_ptr = temp_ptr; - t_voicechat_item_info->text_data_size += data_len; + char * temp_ptr = lv_mem_alloc(data_len + 1); + if(NULL == temp_ptr) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__); + return false; } + _lv_memset_00(temp_ptr, data_len + 1); + _lv_memcpy(temp_ptr, data_buff, data_len); + + t_voicechat_item_info->text_data_ptr = temp_ptr; + t_voicechat_item_info->text_data_size = data_len; + t_voicechat_item_info->msg_from = 1; s_voicechat_info_p->msg_count = 2; - printf("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr); - -#ifdef MMI_VOICECHAT_DEBUG_TO_FILE - //mmi_debug_info_write_to_file(VOICECHAT_RECV_CHAT_RESULT_FILE, t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size); -#endif + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, + t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr); return true; } -void mmi_voicechat_chat_text_middle_task_cb(lv_task_t * task) -{ - if(MMI_VOICECHAT_UI_STATE_THINKING == s_voicechat_ui_state) +static bool s_chat_text_update_flag = false; +void mmi_voicechat_chat_text_refresh_stop(void) +{ + lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); + if(NULL == ext) + return; + + if(NULL != ext->refresh_task_p) { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - - lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); - if(NULL == ext) - return; - - if(NULL != ext->thinking_task_p) - { - lv_task_del(ext->thinking_task_p); - ext->thinking_task_p = NULL; - } - - mmi_voicechat_list_screen_display(); + lv_task_del(ext->refresh_task_p); + ext->refresh_task_p = NULL; } - else if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state) +} + +void mmi_voicechat_chat_text_refresh_task_cb(lv_task_t * task) +{ + if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); @@ -371,263 +283,85 @@ void mmi_voicechat_chat_text_middle_task_cb(lv_task_t * task) if(NULL == ext) return; + //mmi_voicechat_list_screen_list_refresh(); mmi_voicechat_msg_item_info_t * msg_item = &(s_voicechat_info_p->msg_item[1]); - char * file_buf = msg_item->text_data_ptr; - - lv_label_set_text(ext->list_other_label, file_buf); - } -} - -void mmi_voicechat_chat_text_middle_screen_update(void) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - - lv_task_t * task_p = lv_task_create(mmi_voicechat_chat_text_middle_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); - lv_task_once(task_p); -} - -static void mmi_voicechat_chat_text_stop_screen_task_cb(void) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state); - - // wb - //mmi_voicechat_chat_websocket_close(); - //mmi_voicechat_tts_websocket_open(); - - if((MMI_VOICECHAT_UI_STATE_THINKING == s_voicechat_ui_state) || (MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state)) - { - mmi_voicechat_main_screen_refresh(); - - mmi_voicechat_tts_audio_download_requst(); + if(NULL != ext->list_other_label) + lv_label_set_text(ext->list_other_label, msg_item->text_data_ptr); } -} - -void mmi_voicechat_chat_text_stop_screen_update(void) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - - lv_task_t * task_p = lv_task_create(mmi_voicechat_chat_text_stop_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); - lv_task_once(task_p); -} - -void mmi_voicechat_chat_text_download_requst(void) -{ - uint32_t data_len = 0; - char * data_ptr = mmi_voicechat_trans_result_text_get(&data_len); - - if(NULL != data_ptr && 0 != data_len) + else { - //mmi_voicechat_send_chat_text_msg(data_ptr, data_len); + mmi_voicechat_chat_text_refresh_stop(); } } - -static void mmi_utf8_complete_character_judge(char * data_ptr, uint32_t data_len, uint32_t * output_len) +void mmi_voicechat_chat_text_refresh_start(void) { - uint32_t i = 0; - uint32_t p = 0; - char ch = 0; - while(1) - { - ch = data_ptr[i]; - - //#1111110x - if(ch >= 252) - p = p + 6; - //#111110xx - else if(ch >= 248) - p = p + 5; - //#11110xxx - else if(ch >= 240) - p = p + 4; - //#1110xxxx - else if(ch >= 224) - p = p + 3; - //#110xxxxx - else if(ch >= 192) - p = p + 2; - else - p = p + 1; - - if(p >= data_len) - break; - else - i = p; - } - - * output_len = i; - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len); -} - -void mmi_voicechat_send_tts_text_seperate(char * data_ptr, uint32_t data_len, uint32_t * output_len) -{ - // cn , - char cn_comma_str[4] = {0}; - cn_comma_str[0] = 0XEF; - cn_comma_str[1] = 0XBC; - cn_comma_str[2] = 0X8C; - - // cn . - char cn_period_str[4] = {0}; - cn_period_str[0] = 0XE3; - cn_period_str[1] = 0X80; - cn_period_str[2] = 0X82; - - // cn ? - char cn_query_str[4] = {0}; - cn_query_str[0] = 0XEF; - cn_query_str[1] = 0XBC; - cn_query_str[2] = 0X9F; - - // cn ! - char cn_mark_str[4] = {0}; - cn_mark_str[0] = 0XEF; - cn_mark_str[1] = 0XBC; - cn_mark_str[2] = 0X81; - - - if(MMI_VOICECHAT_SEND_TTS_TEXT_MAX >= data_len) - { - * output_len = data_len; - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len); + lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); + if(NULL == ext) return; - } - char * temp_ptr = lv_mem_alloc(MMI_VOICECHAT_SEND_TTS_TEXT_MAX + 1); - if(NULL == temp_ptr) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__); - return ; - } - _lv_memset_00(temp_ptr, (MMI_VOICECHAT_SEND_TTS_TEXT_MAX + 1)); - _lv_memcpy(temp_ptr, data_ptr, MMI_VOICECHAT_SEND_TTS_TEXT_MAX); - - char * offset_ptr = NULL; - offset_ptr = strstr(temp_ptr, cn_comma_str); - if(NULL != offset_ptr) - { - * output_len = offset_ptr - temp_ptr + 2; - goto EXIT; - } - - offset_ptr = strstr(temp_ptr, cn_period_str); - if(NULL != offset_ptr) - { - * output_len = offset_ptr - temp_ptr + 2; - goto EXIT; - } - - offset_ptr = strstr(temp_ptr, cn_query_str); - if(NULL != offset_ptr) - { - * output_len = offset_ptr - temp_ptr + 2; - goto EXIT; - } - - offset_ptr = strstr(temp_ptr, cn_mark_str); - if(NULL != offset_ptr) - { - * output_len = offset_ptr - temp_ptr + 2; - goto EXIT; - } + if(MMI_VOICECHAT_UI_STATE_LIST != s_voicechat_ui_state) + return; - if(NULL == offset_ptr) + if(NULL != ext->refresh_task_p) { - mmi_utf8_complete_character_judge(temp_ptr, MMI_VOICECHAT_SEND_TTS_TEXT_MIN, output_len); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + return; } - -EXIT: - lv_mem_free(temp_ptr); - temp_ptr = NULL; - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len); + ext->refresh_task_p = lv_task_create(mmi_voicechat_chat_text_refresh_task_cb, 500, LV_TASK_PRIO_HIGH, NULL); } -uint32_t mmi_voicechat_send_tts_text_data_escape_character(char * data_buff, int data_len, char * output_data) +static void mmi_voicechat_chat_text_screen_task_cb(void) { - if (NULL == data_buff || 0 == data_len) - return; - - uint32_t curr_p = 0, i = 0; + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state); - for(i = 0; i < data_len; i++) + if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state) { - if(0X0A == data_buff[i]) // 0X0A -> 0X5C 0X6E - { - output_data[curr_p++] = 0X5C; - output_data[curr_p++] = 0X6E; - } - else if(0X22 == data_buff[i]) // 0X22 -> 0X5C 0X22 + lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); + if(NULL == ext) + return; + + mmi_voicechat_list_set_slide_enable(&ext->old_ext, true); + + if(0 == mmi_voicechat_msg_count_get()) { - output_data[curr_p++] = 0X5C; - output_data[curr_p++] = 0X22; + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + mmi_voicechat_default_screen_display(); } else { - output_data[curr_p++] = data_buff[i]; - } - } + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - return curr_p; -} + mmi_voicechat_list_screen_display(); -void mmi_voicechat_send_tts_text_action(char * data_ptr, uint32_t data_len) -{ - uint32_t output_len = 0; - mmi_voicechat_send_tts_text_seperate(data_ptr, data_len, &output_len); - - uint32_t send_len = 0; - char * send_ptr = lv_mem_alloc((output_len + output_len / 9 + 1)); - if(NULL == send_ptr) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__); - return ; + mmi_voicechat_trans_text_refresh_stop(); + mmi_voicechat_chat_text_refresh_start(); + } } - _lv_memset_00(send_ptr, (output_len + output_len / 9 + 1)); - send_len = mmi_voicechat_send_tts_text_data_escape_character(data_ptr, output_len, send_ptr); - - //mmi_voicechat_send_tts_text_msg(send_ptr, send_len); - s_voicechat_tts_text_sent_size += output_len; - - lv_mem_free(send_ptr); - send_ptr = NULL; } -void mmi_voicechat_send_tts_text_action_pre(void) +void mmi_voicechat_chat_text_screen_update(void) { - uint32_t node_total = mmi_voicechat_tts_audio_ll_node_num(); - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: node_total=%d\n", __FUNCTION__, __LINE__, node_total); - - uint32_t data_len = 0; - char * data_ptr = mmi_voicechat_chat_result_text_get(&data_len); + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: data_len=%d,sent_len=%d\n", __FUNCTION__, __LINE__, data_len, s_voicechat_tts_text_sent_size); - if((NULL != data_ptr) && (data_len > s_voicechat_tts_text_sent_size)) - { - //mmi_voicechat_tts_audio_ll_new_tail_node(); - - mmi_voicechat_send_tts_text_action(data_ptr + s_voicechat_tts_text_sent_size, data_len - s_voicechat_tts_text_sent_size); - } -} + if(true == s_chat_text_update_flag) + return; -void mmi_voicechat_tts_audio_download_requst(void) -{ - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + s_chat_text_update_flag = true; - s_voicechat_tts_text_sent_size = 0; - s_voicechat_tts_audio_playing = false; - mmi_voicechat_tts_audio_ll_clean(); - mmi_voicechat_tts_audio_ll_new_tail_node(); - mmi_voicechat_send_tts_text_action_pre(); + lv_task_t * task_p = lv_task_create(mmi_voicechat_chat_text_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); + lv_task_once(task_p); } -void mmi_voicechat_tts_audio_ll_init(void) +static void mmi_voicechat_tts_audio_ll_init(void) { _lv_ll_init(&s_voicechat_tts_audio_ll, sizeof(mmi_voicechat_tts_audio_ll_t)); _lv_ll_clear(&s_voicechat_tts_audio_ll); } -void mmi_voicechat_tts_audio_ll_clean(void) +static void mmi_voicechat_tts_audio_ll_clean(void) { mmi_voicechat_tts_audio_ll_t * node = NULL; for(node = _lv_ll_get_head(&s_voicechat_tts_audio_ll); NULL != node; node = _lv_ll_get_next((&s_voicechat_tts_audio_ll), node)) @@ -662,7 +396,26 @@ mmi_voicechat_tts_audio_ll_t * mmi_voicechat_tts_audio_ll_new_tail_node(void) return node; } -bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len) + + +static bool s_send_start_play = false; +static bool s_data_first_frame = false; + +void mmi_voicechat_tts_audio_update_pre(void) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + s_voicechat_tts_audio_playing = false; + mmi_voicechat_tts_audio_ll_clean(); + mmi_voicechat_tts_audio_ll_new_tail_node(); + + + s_send_start_play = false; + + s_data_first_frame = false; +} + +bool mmi_voicechat_tts_audio_result_update(char * data_buff, uint32_t data_len) { if(NULL == data_buff || 0 == data_len) { @@ -674,9 +427,44 @@ bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len) if(NULL == node) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - return false; + node = mmi_voicechat_tts_audio_ll_new_tail_node(); } +#if 1 + else if(NULL != node->audio_data_ptr && (16 * 1024 < node->audio_data_size)) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + node = mmi_voicechat_tts_audio_ll_new_tail_node(); + + mmi_voicechat_tts_audio_play(); + } +#else + else if(NULL != node->audio_data_ptr) + { + if(false == s_data_first_frame) + { + if(16 * 1024 < node->audio_data_size) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + node = mmi_voicechat_tts_audio_ll_new_tail_node(); + + s_data_first_frame = true; + mmi_voicechat_tts_audio_play(); + } + } + else + { + if(8 * 1024 < node->audio_data_size) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + node = mmi_voicechat_tts_audio_ll_new_tail_node(); + + mmi_voicechat_tts_audio_play(); + } + } + } +#endif + if(NULL == node->audio_data_ptr) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); @@ -687,7 +475,13 @@ bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len) return false; } _lv_memset_00(temp_ptr, data_len + 1); + #if 0 _lv_memcpy(temp_ptr, data_buff, data_len); + #else + char mp3_haed_info[10] = {'I', 'D', '3', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22}; + _lv_memcpy(temp_ptr, mp3_haed_info, 10); + _lv_memcpy(temp_ptr + 10, data_buff + 10, data_len - 10); + #endif node->audio_data_ptr = temp_ptr; node->audio_data_size = data_len; @@ -713,7 +507,7 @@ bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len) return true; } -void mmi_voicechat_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) +static void mmi_voicechat_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority); @@ -722,10 +516,7 @@ void mmi_voicechat_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority) } else if(MMI_VOICECHAT_TTS_AUDIO_PRI > priority) - { - // wb - //mmi_voicechat_tts_websocket_close(); - + { // res mmi_voicechat_tts_audio_ll_clean(); @@ -752,14 +543,15 @@ static void mmi_voicechat_tts_audio_over_cb(void * para) s_voicechat_tts_audio_play_node = NULL; VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: node=%#X,total=%d\n", __FUNCTION__, __LINE__, node, mmi_voicechat_tts_audio_ll_node_num()); - // get tts - //mmi_voicechat_send_tts_text_action_pre(); - - if(MMI_VOICECHAT_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_VOICECHAT_TTS_AUDIO_PRI, mmi_voicechat_tts_audio_ctrl_callback)) + //if(MMI_VOICECHAT_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_VOICECHAT_TTS_AUDIO_PRI, mmi_voicechat_tts_audio_ctrl_callback)) { if(NULL == node || NULL == node->audio_data_ptr) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + + //mmi_voicechat_send_stop_play_msg(NULL, 0); + return ; } s_voicechat_tts_audio_play_node = node; @@ -767,7 +559,7 @@ static void mmi_voicechat_tts_audio_over_cb(void * para) Hal_Tone_Play_Onetime((uint32_t *)node->audio_data_ptr, node->audio_data_size, - HAL_AUDIO_SPK_LEVEL_MAX, + HAL_AUDIO_SPK_LEVEL_4, // HAL_AUDIO_SPK_LEVEL_MAX, mmi_voicechat_tts_audio_over_cb, NULL); } @@ -799,31 +591,23 @@ bool mmi_voicechat_tts_audio_play(void) if(NULL == node || NULL == node->audio_data_ptr) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__); -#if 0 -{ - uint32_t node_total = mmi_voicechat_tts_audio_ll_node_num(); - uint8_t i = 0; - mmi_voicechat_tts_audio_ll_t * node = _lv_ll_get_head(&s_voicechat_tts_audio_ll); - - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: node_total=%d\n", __FUNCTION__, __LINE__, node_total); - for(i = 0; i < node_total; i++) - { - VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%#X,%#X\n", __FUNCTION__, __LINE__, i, node, node->audio_data_ptr); - - node = _lv_ll_get_next((&s_voicechat_tts_audio_ll), node); - } -} -#endif return false; } } } + + if(false == s_send_start_play) + { + s_send_start_play = true; + mmi_voicechat_send_start_play_msg(NULL, 0); + } + s_voicechat_tts_audio_play_node = node; s_voicechat_tts_audio_playing = true; Hal_Tone_Play_Onetime((uint32_t *)node->audio_data_ptr, node->audio_data_size, - HAL_AUDIO_SPK_LEVEL_MAX, + HAL_AUDIO_SPK_LEVEL_4, // HAL_AUDIO_SPK_LEVEL_MAX, mmi_voicechat_tts_audio_over_cb, NULL); } @@ -831,13 +615,26 @@ bool mmi_voicechat_tts_audio_play(void) return true; } -void mmi_voicechat_tts_end_synthesis_action(void) +bool mmi_voicechat_tts_audio_is_playing(void) { - mmi_voicechat_tts_audio_ll_new_tail_node(); - mmi_voicechat_send_tts_text_action_pre(); + if(true == s_voicechat_tts_audio_playing) + return true; + + if(0 != mmi_voicechat_tts_audio_ll_node_num()) + return true; - // - mmi_voicechat_tts_audio_play(); + return false; +} + + + +void mmi_voicechat_listening_screen_stop_update(void) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + //lv_task_t * task_p = lv_task_create(mmi_voicechat_listening_screen_stop_task_cb, 10, LV_TASK_PRIO_HIGH, NULL); + //lv_task_once(task_p); + mmi_voicechat_listening_stop(true); } @@ -949,6 +746,8 @@ void mmi_voicechat_main_prepare_destory(lv_obj_t * activity_obj) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + s_voicechat_start_flag = false; + // websocket mmi_voicechat_websocket_close(); @@ -984,6 +783,11 @@ void mmi_voicechat_main_prepare_destory(lv_obj_t * activity_obj) lv_task_del(ext->thinking_task_p); ext->thinking_task_p = NULL; } + if(NULL != ext->refresh_task_p) + { + lv_task_del(ext->refresh_task_p); + ext->refresh_task_p = NULL; + } if(NULL != ext->gif_listening) { gif_close(ext->gif_listening); @@ -1326,6 +1130,10 @@ bool mmi_voicechat_listening_stop(bool is_cancel) if(NULL == ext) return false; + + //mmi_debug_info_write_to_file("C:/record_data.amr", ext->record_buffer, ext->record_size); + + if(true == is_cancel) { printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); @@ -1411,6 +1219,13 @@ void mmi_voicechat_listening_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); return; } + + if(false == mmi_voicechat_server_state_is_listening()) + { + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + mmi_voicechat_send_speak_request_msg(NULL, 0); + return; + } char * sending_buf = lv_mem_alloc(sending_size + 1); if(NULL == sending_buf) @@ -1421,7 +1236,7 @@ void mmi_voicechat_listening_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t _lv_memset_00(sending_buf, sending_size + 1); _lv_memcpy(sending_buf, ext->record_buffer + s_voicechat_recording_sent_size, sending_size); - //mmi_voicechat_send_trans_audio_msg(sending_buf, sending_size); + mmi_voicechat_send_speech_data_msg(sending_buf, sending_size); lv_mem_free(sending_buf); s_voicechat_recording_sent_size += sending_size; } @@ -1456,15 +1271,23 @@ void mmi_voicechat_listening_screen_display(void) s_voicechat_ui_state = MMI_VOICECHAT_UI_STATE_LISTENING; - s_voicechat_trans_text_end = false; - // stop audio Hal_NFFS_File_Play_End(); Hal_Audio_Manage_End_Ind(MMI_VOICECHAT_TTS_AUDIO_PRI); - // wb - //mmi_voicechat_websocket_close(); - //mmi_voicechat_websocket_open(); + if(false == s_voicechat_start_flag) + { + s_voicechat_start_flag = true; + mmi_voicechat_send_start_request_msg(NULL, 0); + } + else if(false == mmi_voicechat_tts_audio_is_playing()) + { + mmi_voicechat_send_stop_play_msg(NULL, 0); + } + + // reset flag + s_trans_text_update_flag = false; + s_chat_text_update_flag = false; // res mmi_voicechat_msg_data_clean(); @@ -1485,15 +1308,13 @@ void mmi_voicechat_listening_screen_display(void) if(MMI_VOICECHAT_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_VOICECHAT_TTS_AUDIO_PRI, mmi_voicechat_listening_audio_ctrl_callback)) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); - - mmi_voicechat_send_start_request_msg(NULL, 0); s_voicechat_recording_sent_size = 0; Hal_Record_Buffer_With_Format_Req(ext->record_buffer, MMI_VOICECHAT_DATA_RECORD_SIZE_MAX, MMI_VOICECHAT_DATA_RECORD_DURATION_MAX * 1000, mmi_voicechat_listening_cb, - (mci_type_enum)MMI_VOICECHAT_AUDIO_FORMAT); + (mci_type_enum)MMI_VOICECHAT_UL_AUDIO_FORMAT); } } @@ -1632,6 +1453,7 @@ lv_obj_t * mmi_voicechat_list_msg_item_add(lv_obj_t * list_page, mmi_voicechat_m lv_obj_set_width(label_text, lv_obj_get_width(obj) - 20); lv_label_set_text(label_text, file_buf); lv_obj_align(label_text, obj, LV_ALIGN_IN_LEFT_MID, 10, 0); + ext->list_self_label = label_text; } else { @@ -1695,7 +1517,7 @@ static lv_res_t mmi_voicechat_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign return LV_RES_OK; } -lv_obj_t * mmi_voicechat_list_create(lv_obj_t * obj) +static lv_obj_t * mmi_voicechat_list_create(lv_obj_t * obj) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); @@ -1745,6 +1567,23 @@ lv_obj_t * mmi_voicechat_list_create(lv_obj_t * obj) return list_page; } +void mmi_voicechat_list_screen_list_refresh(void) +{ + VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); + + lv_voicechat_ext_t * ext = (lv_voicechat_ext_t *)mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN); + if(NULL == ext) + return ; + + if(NULL != ext->list) + { + lv_obj_clean(ext->list); + lv_obj_del(ext->list); + ext->list = NULL; + } + ext->list = mmi_voicechat_list_create(ext->cont_list); +} + void mmi_voicechat_list_screen_display(void) { VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__); @@ -1759,6 +1598,7 @@ void mmi_voicechat_list_screen_display(void) lv_obj_t * cont = ext->cont_list; lv_obj_clean(cont); + //mmi_voicechat_list_screen_list_refresh(); ext->list = mmi_voicechat_list_create(cont); // signal weak @@ -1963,9 +1803,12 @@ lv_obj_t * mmi_voicechat_main_create(lv_obj_t * activity_obj) ext->cont_list = NULL; ext->list = NULL; + ext->list_self_label = NULL; + ext->list_other_label = NULL; ext->record_buffer = NULL; ext->record_size = 0; ext->thinking_task_p = NULL; + ext->refresh_task_p = NULL; ext->gif_listening = NULL; ext->gif_thinking = NULL; @@ -1981,13 +1824,6 @@ lv_obj_t * mmi_voicechat_main_create(lv_obj_t * activity_obj) return obj; } - // data task - mmi_voicechat_data_task_create(); - watch_set_suspend_enable(false, ACT_ID_VOICECHAT_MAIN, 0); - - //mmi_voicechat_websocket_close(); - mmi_voicechat_websocket_open(); - // cont_default lv_obj_t * cont_default = lv_cont_create(obj, NULL); lv_obj_set_size(cont_default, lv_obj_get_width(obj), lv_obj_get_height(obj)); @@ -2040,6 +1876,16 @@ lv_obj_t * mmi_voicechat_main_create(lv_obj_t * activity_obj) mmi_voicechat_lv_style_set(); mmi_voicechat_default_screen_display(); + + + watch_set_suspend_enable(false, ACT_ID_VOICECHAT_MAIN, 0); + // data task + mmi_voicechat_data_task_create(); + + mmi_voicechat_websocket_close(); + mmi_voicechat_websocket_open(); + + s_voicechat_start_flag = false; return obj; } @@ -2048,6 +1894,10 @@ void mmi_voicechat_create_event_cb(lv_obj_t * btn, lv_event_t e) { if(LV_EVENT_CLICKED == e) { + #ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__ + mmi_ai_device_active(); + #endif + // free resource mmi_voicechat_msg_data_clean(); mmi_voicechat_tts_audio_ll_init(); diff --git a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.h b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.h index 547c107f..97486c7a 100644 --- a/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.h +++ b/2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.h @@ -29,7 +29,7 @@ extern "C" { #endif -#define MMI_VOICECHAT_DEBUG_TO_FILE +//#define MMI_VOICECHAT_DEBUG_TO_FILE #ifdef MMI_VOICECHAT_DEBUG_TO_FILE #define VOICECHAT_SEND_DATA_FILE "C:/voicechat_send.txt" #define VOICECHAT_RECV_DATA_FILE "C:/voicechat_data.txt" @@ -37,14 +37,20 @@ extern "C" { -#define MMI_VOICECHAT_AUDIO_FORMAT (3) // 7-pcm8; 3-amr -//#define MMI_VOICECHAT_AUDIO_FORMAT_STR (".wav") // ".amr" +#define MMI_VOICECHAT_UL_AUDIO_FORMAT (3) // 7-pcm8k; 3-amr; 8-pcm16k +#define MMI_VOICECHAT_UL_AUDIO_FORMAT_STR ("amr") // ("amr") // "pcm" +#define MMI_VOICECHAT_DL_AUDIO_FORMAT_STR ("mp3") // ("mp3") // "pcm" // "wav" +//#define MMI_VOICECHAT_UL_AUDIO_SAMPLE_RATE (16000) // (8000) // 16000 #if 1 // amr #define MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE (6) -#define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX (60) // seconds +#define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX (30) // seconds #define MMI_VOICECHAT_DATA_RECORD_SIZE_MAX ((MMI_VOICECHAT_DATA_RECORD_DURATION_MAX + 2) * HAL_AMR_BUFSIZE_PER_SECOND + MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE) -#else // pcm +#elif 1 // pcm16k +#define MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE (44) +#define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX (10) // seconds +#define MMI_VOICECHAT_DATA_RECORD_SIZE_MAX (MMI_VOICECHAT_DATA_RECORD_DURATION_MAX * 32000 + MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE) +#else // pcm8k #define MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE (44) #define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX (10) // seconds #define MMI_VOICECHAT_DATA_RECORD_SIZE_MAX (MMI_VOICECHAT_DATA_RECORD_DURATION_MAX * 16000 + MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE) @@ -111,6 +117,7 @@ typedef struct lv_obj_t * cont_list; lv_obj_t * list; // chat list lv_obj_t * list_signal_weak_label; + lv_obj_t * list_self_label; lv_obj_t * list_other_label; lv_style_t style_cont_self; @@ -124,6 +131,7 @@ typedef struct uint32_t record_size; lv_task_t * thinking_task_p; + lv_task_t * refresh_task_p; gif_info_t * gif_listening; gif_info_t * gif_thinking; @@ -144,9 +152,14 @@ typedef enum -char * mmi_voicechat_trans_result_text_get(uint32_t * data_len); -bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len, bool is_end); -bool mmi_voicechat_chat_result_text_store(char * data_buff, uint32_t data_len); +bool mmi_voicechat_trans_text_result_update(char * data_buff, uint32_t data_len); +bool mmi_voicechat_chat_text_result_update(char * data_buff, uint32_t data_len); + +void mmi_voicechat_tts_audio_update_pre(void); +bool mmi_voicechat_tts_audio_result_update(char * data_buff, uint32_t data_len); +bool mmi_voicechat_tts_audio_play(void); + + void mmi_voicechat_create_event_cb(lv_obj_t * btn, lv_event_t e); bool mmi_is_ACT_ID_VOICECHAT_MAIN(void); diff --git a/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket.c b/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket.c index 331bd33f..0334f60f 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket.c @@ -8,12 +8,17 @@ #ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__ -#define MMI_VOICECHAT_WEBSOCKET_URI "wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1" +//#define MMI_VOICECHAT_WEBSOCKET_URI "wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1" +//#define MMI_VOICECHAT_WEBSOCKET_URI "ws://118.145.133.67:22080/voice-chat/ws" +#define MMI_VOICECHAT_WEBSOCKET_URI "ws://118.145.158.207:22080/voice-chat/ws" +//#define MMI_VOICECHAT_WEBSOCKET_URI "ws://amp.raisound.com/voice-chat/ws" static sim_esp_websocket_client_handle_t s_voicechat_ws_client_p = NULL; extern void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset); - +#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__ +extern char * mmi_ai_device_token_get(void); +#endif int mmi_voicechat_websocket_send_text_data(char * data_ptr, int data_len) @@ -120,8 +125,15 @@ void mmi_voicechat_websocket_app_start(void) int ret = 0; sim_esp_websocket_client_config_t websocket_cfg = {0}; +#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__ + char url_str[256] = {0}; + sprintf(url_str, "%s?dt=%s", MMI_VOICECHAT_WEBSOCKET_URI, mmi_ai_device_token_get()); + + websocket_cfg.uri = url_str; +#else websocket_cfg.uri = MMI_VOICECHAT_WEBSOCKET_URI; - websocket_cfg.transport == WEBSOCKET_TRANSPORT_OVER_SSL; + //websocket_cfg.transport == WEBSOCKET_TRANSPORT_OVER_SSL; +#endif VOICECHAT_WB_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: url=%s\n", __FUNCTION__, __LINE__, websocket_cfg.uri); diff --git a/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket_client.c b/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket_client.c index 48199820..bef22ba5 100644 --- a/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket_client.c +++ b/2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket_client.c @@ -42,7 +42,7 @@ static void * voicechat_websocket_client_stack_ptr = NULL; #define WEBSOCKET_TASK_PRIORITY (90) #define WEBSOCKET_TASK_STACK (8*1024) #define WEBSOCKET_NETWORK_TIMEOUT_MS (10*1000) -#define WEBSOCKET_PING_TIMEOUT_MS (15*60*1000) +#define WEBSOCKET_PING_TIMEOUT_MS (15*60*1000) // (10*1000) // (15*60*1000) #define WEBSOCKET_EVENT_QUEUE_SIZE (1) #define ESP_WS_CLIENT_MEM_CHECK(a, action) if (!(a)) { \ @@ -439,7 +439,7 @@ static esp_err_t voicechat_websocket_client_recv(sim_esp_websocket_client_handle do { rlen = wb_esp_transport_read(client->transport, client->rx_buffer, client->buffer_size, client->config->network_timeout_ms); if (rlen <= 0) { - ESP_LOGE("Error read data"); + ESP_LOGE("voicechat_websocket_client_recv.Error read data"); voicechat_websocket_client_abort_connection(client); return ESP_FAIL; }