opus更新
authorp15692025051 <846603105@qq.com>
Thu, 26 Jun 2025 03:42:27 +0000 (11:42 +0800)
committerp15692025051 <846603105@qq.com>
Thu, 26 Jun 2025 03:42:27 +0000 (11:42 +0800)
2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c
2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.h
2.code/aicos/app/AI_AMP_2_5/bk_key.c
2.code/aicos/app/AI_AMP_2_5/bk_opus_coder.c
2.code/aicos/app/AI_AMP_2_5/dev_authentication.c
2.code/aicos/app/AI_AMP_2_5/imsl_vad.h
2.code/aicos/app/AI_AMP_2_5/libimslnn.a
2.code/aicos/app/AI_AMP_2_5/libimslvad.a
2.code/aicos/projects/banyan/ap/common_inc/fsfile/chaobingfatis.mp3 [new file with mode: 0644]
2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/aic_debug_cfg.h
2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/kpc_cfg.c

index 6f76250..d302175 100644 (file)
@@ -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\""))//æ\89£å­\90æ\8a¥é\94\99
+                    }else if(strstr(recv_buff,"\"event\":\"failed\""))//æ\8e¥å\8f£æ\8a¥é\94\99äº\86
                     {
                         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,
index 9b115a2..72345aa 100644 (file)
@@ -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
index 7e426c7..203d896 100644 (file)
@@ -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");
index f245945..86bc93d 100644 (file)
@@ -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
index 6623b21..92352bb 100644 (file)
@@ -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;
index 8f36374..e9199c9 100644 (file)
@@ -2,6 +2,12 @@
 #define _IMSL_VAD_DLL
 #include <stdint.h>
 
+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
index 8ae85d5..e6e2afe 100644 (file)
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
index 692d6a4..6bbda9f 100644 (file)
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 (file)
index 0000000..ed46c4f
Binary files /dev/null and b/2.code/aicos/projects/banyan/ap/common_inc/fsfile/chaobingfatis.mp3 differ
index b5afd11..150f904 100644 (file)
@@ -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
index df1f3cf..bca6926 100644 (file)
@@ -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}