From: p15692025051 <846603105@qq.com> Date: Thu, 26 Jun 2025 03:42:27 +0000 (+0800) Subject: opus更新 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=1db1e96ab70ef762220a4a64a6eeb3b0013c3983;p=mirrors%2FFX01.git opus更新 --- diff --git a/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c b/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c index 6f76250..d302175 100644 --- a/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c +++ b/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c @@ -272,6 +272,7 @@ void reset_VC_cfg(void) vc_cfg.dev_type = DEV_FX1_H;//产品 //vc_cfg.dev_type = DEV_ADS;//奥德赛 vc_cfg.dev_type = DEV_JSWM;//金山完美 + //vc_cfg.dev_type = DEV_ALY;//阿里云 //strcpy(vc_cfg.server_ip,"amp.raisound.com");//服务器地址 strcpy(vc_cfg.server_ip,"115.190.94.208:22080");//服务器地址 vc_cfg.VC_mode =0;//对话模式 @@ -635,7 +636,11 @@ static void AI_VC_send_satrt(void) if(vc_cfg.dev_type == DEV_ADS) { cJSON_AddStringToObject(dialog_attributes, "provider", "ads_coze"); - }else + }else if(vc_cfg.dev_type == DEV_ALY) + { + cJSON_AddStringToObject(dialog_attributes, "provider", "bailian"); + } + else cJSON_AddStringToObject(dialog_attributes, "provider", "coze"); @@ -675,7 +680,13 @@ static void AI_VC_send_satrt(void) cJSON_AddStringToObject(bot_option, "workflow_id", "7508598451564150820"); } cJSON_AddItemToObject(dialog_cfg, "bot_option", bot_option); - + if(vc_cfg.dev_type == DEV_ALY) + { + // 创建 dialog_attributes对象下cfg对象下 greeting 对象 + cJSON *bailian_option = cJSON_CreateObject(); + cJSON_AddStringToObject(bailian_option, "app_id", "0988bd1a381145a8ad1026641c790685"); + cJSON_AddItemToObject(dialog_cfg, "bailian_option", bailian_option); + } cJSON_AddItemToObject(dialog_attributes, "cfg", dialog_cfg); cJSON_AddItemToObject(payload, "dialog_attributes", dialog_attributes); @@ -685,6 +696,9 @@ static void AI_VC_send_satrt(void) if(vc_cfg.dev_type == DEV_ADS) { cJSON_AddStringToObject(outbound_attributes, "provider", "ads_coze"); + }else if(vc_cfg.dev_type == DEV_ALY) + { + cJSON_AddStringToObject(outbound_attributes, "provider", "CosyVoice"); }else cJSON_AddStringToObject(outbound_attributes, "provider", "volcengine"); // 创建 outbound_attributes 下的 cfg 对象 @@ -707,6 +721,10 @@ static void AI_VC_send_satrt(void) if(vc_cfg.dev_type == DEV_ADS) cJSON_AddStringToObject(outbound_cfg, "voice", "7511638457475710987"); + else if(vc_cfg.dev_type == DEV_ALY) + { + cJSON_AddStringToObject(outbound_cfg, "voice", "longcheng"); + } else cJSON_AddStringToObject(outbound_cfg, "voice", "zh_female_meituojieer_moon_bigtts"); @@ -716,7 +734,11 @@ static void AI_VC_send_satrt(void) // 创建 inbound_attributes 对象 cJSON *inbound_attributes = cJSON_CreateObject(); - cJSON_AddStringToObject(inbound_attributes, "provider", "volcengine"); + if(vc_cfg.dev_type == DEV_ALY) + { + cJSON_AddStringToObject(inbound_attributes, "provider", "aliyun"); + }else + cJSON_AddStringToObject(inbound_attributes, "provider", "volcengine"); if(vc_cfg.VC_mode == 0 && vc_cfg.is_VAD == 0)//连续对话模式,开在线vad cJSON_AddBoolToObject(inbound_attributes, "disable_vad", 0); else @@ -1117,18 +1139,27 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程 VC_state = VC_State_End;// //AI_AMP_MSG_put(0,0,VC_RECORD_START);//打开录音 - }else if(strstr(recv_buff,"\"event\":\"failed\""))//扣子报错 + }else if(strstr(recv_buff,"\"event\":\"failed\""))//接口报错了 { char *str_tmp = NULL; - str_tmp = strstr(recv_buff,"\"message\":\""); + str_tmp = strstr(recv_buff,"\"concurrency_limit_exceeded\""); if(str_tmp) { - str_tmp+=strlen("\"message\":\""); - int count = str_count(str_tmp,'\"'); - AI_AMP_MSG_put(str_tmp,count,VC_CONNECT_ERROR); + AI_AMP_MSG_put(NULL,0,VC_CLOSE); + play_audio_file("C:/chaobingfatis.mp3"); + }else + { + str_tmp = strstr(recv_buff,"\"message\":\""); + if(str_tmp) + { + // str_tmp+=strlen("\"message\":\""); + // int count = strlen(str_tmp); + AI_AMP_MSG_put("服务异常了,请重试",strlen("服务异常了,请重试"),VC_CONNECT_ERROR); + } } + } } @@ -2266,8 +2297,12 @@ int AI_VC_start(void) conf.rule1_min_tailing_silence = 480; conf.rule2_min_tailing_silence = vc_cfg.vad_silence ; conf.rule3_min_tailing_silence = vc_cfg.vad_silence; - conf.vad_log_level = 2; - int init_vad_ret = init_vad(&conf); + conf.vad_log_level = 0; + int init_vad_ret = 0; + strcpy(conf.auth_info.dmp_token, get_token()); + init_vad_ret = init_vad(&conf); + + bk_printf("VAD init_vad:ret = %d",init_vad_ret); bk_printf("VAD init_vad:ret = %d",init_vad_ret); bk_printf("VAD init_vad:ret = %d",init_vad_ret); @@ -2538,6 +2573,10 @@ aos_status AI_AMP_MSG_put(const char *data,u32 len,AI_AMP_MSG_Type MSG_Type) //每小时更新登录一次的更新定时器 static void sys_10S_timeout(void *param) +{ + AI_AMP_MSG_put(NULL,0,AI_TIMER_EVENT); +} +static void sys_10S_timeout_even(void) { // if (sizeof(dev_pass) == 0) // aut_active();//没有密钥走激活 @@ -2616,6 +2655,16 @@ static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程 aic_srv_tele_sim_get_iccid_sync(current_card_id,vc_cfg.ICCID); bk_printf("vc_cfg.ICCID:%s",vc_cfg.ICCID); dev_authentication_init(); + count =50; + while(count --) + { + if(strlen(get_token()) > 5) + { + break; + } + bk_printf("AI_AMP_2_5_init 等待鉴权..... \n"); + aos_sleep(200); + } if(sys_10S_timer == NULL) { sys_10S_timer = aos_create_timer("AI_VC_1S_timer", @@ -2741,6 +2790,9 @@ static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程 case PLAY_FILE_STREAM_DATA: play_file_stream_data_event(AI_AMP_msg.data); break; + case AI_TIMER_EVENT: + sys_10S_timeout_even(); + break; case AI_PRINTF: if(AI_AMP_msg.data) @@ -2786,7 +2838,7 @@ int AI_AMP_2_5_init(void) "AI_AMP_2_5", AI_AMP_2_5_task, &AI_AMP_task_id, - 4096u, + 4096*2, 0, NULL, ai_VC_task_priority, diff --git a/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.h b/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.h index 9b115a2..72345aa 100644 --- a/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.h +++ b/2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.h @@ -12,6 +12,7 @@ typedef enum DEV_FX1_H,//玩具机芯 DEV_ADS,//奥德赛 DEV_JSWM, + DEV_ALY,//阿里云测试 } DEV_TYPE; typedef enum { @@ -75,6 +76,7 @@ typedef enum AI_AMP_MSG PWK_KEY_RELEASE,//侧键 PLAY_AUDIO_FILE,//播放本地音频文件 PLAY_FILE_STREAM_DATA,//播放本地文件,用音频流的方式 + AI_TIMER_EVENT,//定时器事件 AI_PRINTF,//打印 } AI_AMP_MSG_Type; typedef struct diff --git a/2.code/aicos/app/AI_AMP_2_5/bk_key.c b/2.code/aicos/app/AI_AMP_2_5/bk_key.c index 7e426c7..203d896 100644 --- a/2.code/aicos/app/AI_AMP_2_5/bk_key.c +++ b/2.code/aicos/app/AI_AMP_2_5/bk_key.c @@ -95,11 +95,12 @@ static int32_t bk_kpc_pwr_key_handle(void *para, uint32_t size) switch (pwr_status) { case AIC_PWR_KEYDOWN: bk_msg_printf("AIC_PWR_KEYDOWN"); + AI_AMP_MSG_put(0, 0, PWK_KEY_RELEASE); break; case AIC_PWR_KEYUP: bk_msg_printf("AIC_PWR_KEYUP"); - AI_AMP_MSG_put(0, 0, PWK_KEY_RELEASE); + //play_audio_file("C:/zhengzaiguanji.mp3"); break; @@ -114,7 +115,7 @@ static int32_t bk_kpc_pwr_key_handle(void *para, uint32_t size) void bk_to_ups_sync(void *ptr) { // gx_ups_phy_from_rtc(); - + AI_AMP_MSG_put(0, 0, VC_CLOSE); // gx_ups_phy_cnt_clr(); play_audio_file("C:/zhengzaiguanji.mp3"); bk_msg_printf("bk_to_ups_sync"); diff --git a/2.code/aicos/app/AI_AMP_2_5/bk_opus_coder.c b/2.code/aicos/app/AI_AMP_2_5/bk_opus_coder.c index f245945..86bc93d 100644 --- a/2.code/aicos/app/AI_AMP_2_5/bk_opus_coder.c +++ b/2.code/aicos/app/AI_AMP_2_5/bk_opus_coder.c @@ -35,6 +35,8 @@ bk_ring_buf_t *OPUS_encoder_rb_data = NULL; bk_ring_buf_t *OPUS_decoder_rb_data = NULL; static struct opus_enc_init_param *opus_encoder_h = NULL; static struct opus_dec_init_param *opus_decoder_h = NULL; +static char ogg_hend[27+256] ={0}; +static int ogg_hend_len = 0; int opus_init(void) { #if SUPPORT_OPUS @@ -151,6 +153,7 @@ void opus_clean(void) { bk_rb_clear(OPUS_encoder_rb_data); } + ogg_hend_len = 0; } int opus_encode_data(char *PCM_data,int data_len,int one_pack_len,char *opus_data,int opus_data_max_len) { @@ -233,8 +236,7 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) int frame_length; struct opus_dec_param dec_inparam; int ret = 0; - static char ogg_hend[27+256] ={0}; - static int ogg_hend_len = 0; + int input_tmp_len = 0,ooutput_tmp_len = 0; int seg_num =0; //fread(page_buffer, 1, 27 + seg_num, fin); if(!in_ogg_data) @@ -255,7 +257,7 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) return -1; } data_count = 0; - u64 timer_ms = aos_get_tickcount(); + u32 timer_ms = aos_get_tickcount(); while(1) { @@ -286,7 +288,32 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) ogg_hend_len+=bk_rb_read(OPUS_decoder_rb_data,ogg_hend+27,seg_num);//读页的段数据 } seg_size = ogg_calc_total_segment_data_size(ogg_hend, ogg_hend_len);//算这一页有多少数据 - //bk_printf("整页数据大小:%d",seg_size); + if(seg_size <=0)//数据出错了 + { + int len_tmp = 0; + while(1) + { + len_tmp = bk_rb_read(OPUS_decoder_rb_data,ogg_hend,1); + if(ogg_hend[0] == 'O') + { + len_tmp = bk_rb_read(OPUS_decoder_rb_data,ogg_hend+1,1); + if(ogg_hend[1] == 'g') + { + len_tmp = bk_rb_read(OPUS_decoder_rb_data,ogg_hend+2,1); + if(ogg_hend[2] == 'g')//是OggS开头 + { + bk_rb_read(OPUS_decoder_rb_data,ogg_hend+3,27-3); + ogg_hend_len=27;//读页头 + break; + } + } + } + if(len_tmp <= 0) + break; + } + break; + } + bk_printf("整页数据大小:%d",seg_size); /************3阶段读完整包****************** */ if(bk_rb_data_len(OPUS_decoder_rb_data)< seg_size)//判断可读数据够不够 { @@ -306,6 +333,7 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) } else if (3 == page_type) { ogg_demux_context demux_context = { 0, 0 }; + input_tmp_len = 0;ooutput_tmp_len = 0; while (1) { p_audio = ogg_get_next_audio_frame(ogg_buf, &demux_context, &frame_length); if (p_audio == NULL || frame_length == 0) @@ -315,6 +343,7 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) if(pcm_buf) { + dec_inparam.input = p_audio; dec_inparam.inputfrm_count = 1; dec_inparam.input_len_array[0] = frame_length; @@ -323,20 +352,23 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) dec_inparam.outbuffer_size = 4096; ret = aic_opus_decode(&dec_inparam); - // bk_printf("opus解码 result:%d,outsize:%d", ret,dec_inparam.outputfrms_size); + //bk_printf("opus解码 输入大小:%d,输出大小:%d", frame_length,dec_inparam.outputfrms_size); if (ret == OPUS_RESULT_ERROR) { - //bk_printf("opus解码 error:%d", ret); + bk_printf("opus解码 error:%d", ret); //bk_printf("ogg data:"); bk_print_hex(ogg_buf,27+seg_num+seg_size); aic_free(pcm_buf); break; } + input_tmp_len+=frame_length; + ooutput_tmp_len += dec_inparam.outputfrms_size; AI_VC_put_play_data(pcm_buf,dec_inparam.outputfrms_size);//发送数据到音频队列 //aos_sleep(1); aic_free(pcm_buf); } } + bk_printf("ogg-opus解码 输入数据大小:%d,输出数据大小:%d,耗时:%d ms",input_tmp_len,ooutput_tmp_len,aos_get_tickcount()-timer_ms ); }else if(2 == page_type)//标签 { bk_printf("opus标签 :%s", ogg_buf+27+seg_num); @@ -354,7 +386,7 @@ int ogg_opus_decode_data(char *in_ogg_data,int in_ogg_data_len) //aos_sleep(1); } - bk_printf("ogg-opus解码 数据大小:%d,耗时:%d ms",in_ogg_data_len,aos_get_tickcount()-timer_ms ); + #endif return 0; } \ No newline at end of file diff --git a/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c b/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c index 6623b21..92352bb 100644 --- a/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c +++ b/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c @@ -39,7 +39,7 @@ char *get_dev_pass(void)//获取设备密码,字符串的方式,返回字符 return vc_cfg.dev_pass; } -static char aut_token[50] ={0}; +char aut_token[50] ={0}; int str_count(char *data,char type) { int ret = 0; diff --git a/2.code/aicos/app/AI_AMP_2_5/imsl_vad.h b/2.code/aicos/app/AI_AMP_2_5/imsl_vad.h index 8f36374..e9199c9 100644 --- a/2.code/aicos/app/AI_AMP_2_5/imsl_vad.h +++ b/2.code/aicos/app/AI_AMP_2_5/imsl_vad.h @@ -2,6 +2,12 @@ #define _IMSL_VAD_DLL #include +struct AuthInfo +{ + char dmp_token[64]; +}; + +// 注意这个必须要与imsl_vad.h中的定义一致 struct VadConfig { int vad_log_level; // 0 不启用 1 INFO 2 INFO、DEBUG @@ -12,6 +18,8 @@ struct VadConfig int rule1_min_tailing_silence; // 多长时间没有检测到语音重置VAD状态 (ms) 480 int rule2_min_tailing_silence; // 0-10s最短多少静音判定语音结束 (ms) 960 int rule3_min_tailing_silence; // 10s以上最短多少静音判定语音结束 (ms) 960 + + struct AuthInfo auth_info; }; /* 初始化vad diff --git a/2.code/aicos/app/AI_AMP_2_5/libimslnn.a b/2.code/aicos/app/AI_AMP_2_5/libimslnn.a index 8ae85d5..e6e2afe 100644 Binary files a/2.code/aicos/app/AI_AMP_2_5/libimslnn.a and b/2.code/aicos/app/AI_AMP_2_5/libimslnn.a differ diff --git a/2.code/aicos/app/AI_AMP_2_5/libimslvad.a b/2.code/aicos/app/AI_AMP_2_5/libimslvad.a index 692d6a4..6bbda9f 100644 Binary files a/2.code/aicos/app/AI_AMP_2_5/libimslvad.a and b/2.code/aicos/app/AI_AMP_2_5/libimslvad.a differ diff --git a/2.code/aicos/projects/banyan/ap/common_inc/fsfile/chaobingfatis.mp3 b/2.code/aicos/projects/banyan/ap/common_inc/fsfile/chaobingfatis.mp3 new file mode 100644 index 0000000..ed46c4f Binary files /dev/null and b/2.code/aicos/projects/banyan/ap/common_inc/fsfile/chaobingfatis.mp3 differ diff --git a/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/aic_debug_cfg.h b/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/aic_debug_cfg.h index b5afd11..150f904 100644 --- a/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/aic_debug_cfg.h +++ b/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/aic_debug_cfg.h @@ -72,7 +72,7 @@ AIC_DEBUG s_debug_cfg = { * deepsleep1-b: .sleep_mode = BIT(1) | BIT(3), * deepsleep2 : .sleep_mode = BIT(1) | BIT(3) | BIT(2), */ - .sleep_mode = BIT(1) | BIT(3), + .sleep_mode = BIT(1) , .aic_diag = { .device = DIAG_DEV, .baudrate = 2000000 diff --git a/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/kpc_cfg.c b/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/kpc_cfg.c index df1f3cf..bca6926 100644 --- a/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/kpc_cfg.c +++ b/2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/kpc_cfg.c @@ -53,6 +53,9 @@ #define KEY_1_GPIO_INDEX (GPIO_AGPIO_0) #define KEY_2_GPIO_INDEX (GPIO_AGPIO_3) #define KEY_3_GPIO_INDEX (4) +#define KEY_4_GPIO_INDEX (GPIO_AGPIO_1) //QTP0 +#define KEY_5_GPIO_INDEX (5) //QTP1 +#define KEY_6_GPIO_INDEX (7) //QTP2 //#define KEY_4_GPIO_INDEX (GPIO_19) gpio_key_config_t g_gpio_key_config[] = { @@ -62,7 +65,10 @@ gpio_key_config_t g_gpio_key_config[] = { {KEY_1, KEY_1_GPIO_INDEX, KEY_TYPE_GPIO}, {KEY_2, KEY_2_GPIO_INDEX, KEY_TYPE_GPIO}, {KEY_3, KEY_3_GPIO_INDEX, KEY_TYPE_EIPU}, - //{KEY_4, KEY_4_GPIO_INDEX, KEY_TYPE_GPIO}, + + // {KEY_4, KEY_4_GPIO_INDEX, KEY_TYPE_GPIO}, + // {KEY_5, KEY_5_GPIO_INDEX, KEY_TYPE_EIPU}, + // {KEY_6, KEY_6_GPIO_INDEX, KEY_TYPE_EIPU}, /* add key upside */ {0, 0, KEY_TYPE_MAX}