按键修复
authorp15692025051 <846603105@qq.com>
Wed, 16 Apr 2025 09:55:40 +0000 (17:55 +0800)
committerp15692025051 <846603105@qq.com>
Wed, 16 Apr 2025 09:55:40 +0000 (17:55 +0800)
2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c
2.code/aicos/app/AI_AMP_2_5/bk_key.c

index 8c9472d..18007f2 100644 (file)
@@ -221,7 +221,7 @@ static void AI_VC_send_satrt(void)
     cJSON_AddNumberToObject(outbound_cfg, "channel", 1);
     cJSON_AddNumberToObject(outbound_cfg, "volume", 100);
     cJSON_AddNumberToObject(outbound_cfg, "speech_rate", 0);
-    cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 100);
+    cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 50);
     cJSON_AddStringToObject(outbound_cfg, "voice", "7468512265134915635");
     cJSON_AddItemToObject(outbound_attributes, "cfg", outbound_cfg);
     cJSON_AddItemToObject(payload, "outbound_attributes", outbound_attributes);
@@ -230,7 +230,7 @@ static void AI_VC_send_satrt(void)
     cJSON *inbound_attributes = cJSON_CreateObject();
     cJSON_AddStringToObject(inbound_attributes, "provider", "volcengine");
     cJSON_AddBoolToObject(inbound_attributes, "disable_vad", 0);
-    cJSON_AddNumberToObject(inbound_attributes, "vad_silence", 400);
+    cJSON_AddNumberToObject(inbound_attributes, "vad_silence", 200);
 
     // 创建 interrupt_options 对象
     cJSON *interrupt_options = cJSON_CreateObject();
@@ -388,6 +388,8 @@ static void websocket_deconnect_VC(void)
 //AIC_WEBSOCKET_OPCODE =AIC_WEBSOCKET_OPCODE_BINARY_FRAME发送二进制
 static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE)
 {
+    if(AI_VC_send_queue == NULL)
+        return AOS_ERROR;
     AI_VC_send_queue_t AI_VC_send_queue_data;
     AI_VC_send_queue_data.data = aic_malloc(len+1);
     memset(AI_VC_send_queue_data.data ,0,len+1);
@@ -425,8 +427,8 @@ static void AI_VC_send_task(void *thread_input)//websocket 发送线程
                     (WebSocketMessageType)AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE);
                 if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_TEXT_FRAME )
                     bk_printf("VCVC:send text ret=%d,len=%d,str=%s",ret,AI_VC_send_queue_data.len,AI_VC_send_queue_data.data);
-                else if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME )
-                    bk_printf("VCVC:send bin ret=%d,len=%d",ret,AI_VC_send_queue_data.len);
+                // else if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME )
+                //     bk_printf("VCVC:send bin ret=%d,len=%d",ret,AI_VC_send_queue_data.len);
                 aic_free(AI_VC_send_queue_data.data);
             }else
             {
@@ -471,7 +473,15 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程
                             AI_TTS_str = NULL;
                             VC_state = VC_State_TTSStart;
                         }
-                    }else if(strstr(recv_buff,"\"tts.started\""))//tts开始
+                    }else if(strstr(recv_buff,"\"vad.active\""))//vad触发
+                    {
+                        if(VC_state >= VC_State_TTSStart)//要关闭播放声音
+                        {
+                            AI_AMP_MSG_put(0,0,VC_PLAY_END);//关闭声音
+                        }
+                        VC_state = VC_State_SpeechStart;
+                    }
+                    else if(strstr(recv_buff,"\"tts.started\""))//tts开始
                     {
                         VC_state = VC_State_TTSStart;
                         AI_AMP_MSG_put(0,0,VC_PLAY_START);//打开声音
@@ -485,7 +495,7 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程
                 }
                 else if(code == 2)//二进制
                 {
-                    bk_printf("VCVC:read BIN  status:%d,code:%d\n",status,code);
+                    //bk_printf("VCVC:read BIN  status:%d,code:%d\n",status,code);
                     // if(status<1000)
                     // {
                     //     bk_printf("VCVC:read :status:%d,code:%d,result_val:%d,data:%s\n",status,code,result_val,recv_buff);
@@ -517,7 +527,8 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程
 static void AI_VC_put_play_data(char *data,u32 len)
 {
     u32 count_tmp = 0;
-    
+    if(AI_VC_play_queue == NULL)
+        return;
     while(1)
     {
         aos_get_queue_used_count(AI_VC_play_queue,&count_tmp);
@@ -561,16 +572,40 @@ PUT_PLAY_ERROR:
 }
 // char play_tmp_d[66*1024] = {0};
 // u32 play_tmp_d_len = 0;
-
+// #define SAMPLE_RATE 16000  // 采样率,通常为 44100 Hz
+// #define DURATION 2        // 音频时长,单位为秒
+// #define FREQUENCY 440     // 音频频率,单位为 Hz
+// #define AMPLITUDE 32767   // 音频振幅,16 位有符号整数的最大值
+// #define num_samples SAMPLE_RATE * DURATION  // 计算总采样数
+// short bk_audio_data[num_samples+4096];             // 定义音频数据数组
+// #include <stdio.h>
+// #include <math.h>
 static void AI_VC_play_task(void *thread_input)//音频播放线程
 {
     int ret=0;
     //bk_stream_play_start();
     AI_VC_audio_queue_t AI_VC_play_queue_data;
-    bk_printf("AI_VC_play_task go......");
+    // bk_printf("AI_VC_play_task go......");
+    //  // 生成正弦波音频数据
+    //  for (int i = 0; i < num_samples; i++) {
+    //     double time = (double)i / SAMPLE_RATE;  // 计算当前时间
+    //     double sample = AMPLITUDE * sin(2 * M_PI * FREQUENCY * time);  // 计算当前采样值
+    //     bk_audio_data[i] = (short)sample;  // 将采样值转换为 16 位有符号整数
+    // }
+    // bk_printf("AI_VC_play_task go2......");
+    // int count_tmp = 0;
+    // while(1)
+    // {
+    //     ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
+    //         (char *)(bk_audio_data+count_tmp*2048), 4096, AOS_WAIT_FOREVER);
+    //     count_tmp+=1;
+    //     if(count_tmp*2048>= num_samples)
+    //         count_tmp = 0;
+    //     //aos_sleep(1);
+    // }
     while(1)
     {
-        if(play_data_len >5*1024 && aos_recv_from_queue(AI_VC_play_queue,&AI_VC_play_queue_data,AOS_WAIT_FOREVER) == AOS_SUCCESS)
+        if( aos_recv_from_queue(AI_VC_play_queue,&AI_VC_play_queue_data,AOS_WAIT_FOREVER) == AOS_SUCCESS)
         {
             if(AI_client_VC && AI_VC_play_queue_data.data)
             {
@@ -614,6 +649,7 @@ static void AI_VC_play_task(void *thread_input)//音频播放线程
             
         }else
         {
+            bk_printf("AI_VC_play_task sleep....");
             aos_sleep(1);
         }
     }
@@ -721,14 +757,15 @@ static void AI_VC_record_task(void *thread_input)//录音线程
     {
         //bk_printf("AI_VC_record_task 1 ");
         ret = app_audio_read(APP_AUDIO_TYPE_STREAM_DUPLEX,
-            vrecord_buf, 3200, 101);
+            vrecord_buf, 3200, 1010);
         //bk_printf("AI_VC_record_task 2 len = %d,VC_state = %d",ret,VC_state);
         if(ret<=0)
         {
-            bk_printf("AI_VC_record_task continue len = %d,VC_state = %d",ret,VC_state);
+            //bk_printf("AI_VC_record_task continue len = %d,VC_state = %d",ret,VC_state);
             aos_sleep(1);
             continue;
         }
+        audio_data(vrecord_buf,ret,23);
         if(VC_state == VC_State_None)//开启的时候,先缓存音频
         {
 
@@ -759,7 +796,7 @@ static void AI_VC_record_task(void *thread_input)//录音线程
                  break;
             }
         }
-        aos_sleep(1);
+        
     }
     aos_sleep(1);
     bk_printf("AI_VC_record_task end.....");
@@ -825,7 +862,7 @@ void VC_record_End(void)
 }
 static void AI_VC_1S_timeout(void *param)
 {
-    //bk_msg_printf("VC_END_play_timerout1!!!!!!!!!");
+    bk_msg_printf("VC_END_play_timerout1!!!!!!!!!");
     if(close_timerout>0)
     {
         close_timerout--;
@@ -975,60 +1012,67 @@ static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程
     char *tts_str = "你好!我是小瑞";
     VC_TTS_Play(tts_str);//开启vc播放tts
     while (1) {
-    
-        aos_recv_from_queue(AI_AMP_task_queue,&AI_AMP_msg,AOS_WAIT_FOREVER) ;
-        switch (AI_AMP_msg.MSG_Type)
+        if(AI_AMP_task_queue)
         {
-            case VC_CLOSE:
-                AI_VC_Close();
-                break;
-            case VC_START:
-                AI_VC_start();
-                break;
-            case VC_PLAY_START:
-                VC_Play_Start();
-                break;
-            case VC_PLAY_END:
-                VC_Play_End();
-                break;
-            case VC_RECORD_START:
-                VC_record_Start();
-                break;
-            case VC_RECORD_END:
-                VC_record_End();
-                break;
+            aos_recv_from_queue(AI_AMP_task_queue,&AI_AMP_msg,AOS_WAIT_FOREVER) ;
+            switch (AI_AMP_msg.MSG_Type)
+            {
+                case VC_CLOSE:
+                    AI_VC_Close();
+                    break;
+                case VC_START:
+                    AI_VC_start();
+                    break;
+                case VC_PLAY_START:
+                    VC_Play_Start();
+                    break;
+                case VC_PLAY_END:
+                    VC_Play_End();
+                    break;
+                case VC_RECORD_START:
+                    VC_record_Start();
+                    break;
+                case VC_RECORD_END:
+                    VC_record_End();
+                    break;
 
-                
-            case VC_CONNECT_ERROR://连接错误
-                AI_VC_Close();
-                if(AI_AMP_msg.data)
-                {
-                    VC_TTS_Play(AI_AMP_msg.data);
-                }
-                break;
-            case AI_KEY_PRESS:
-                AI_key_press();
-                break;
+                    
+                case VC_CONNECT_ERROR://连接错误
+                    AI_VC_Close();
+                    if(AI_AMP_msg.data)
+                    {
+                        VC_TTS_Play(AI_AMP_msg.data);
+                    }
+                    break;
+                case AI_KEY_PRESS:
+                    AI_key_press();
+                    break;
 
-            case AI_KEY_RELEASE:
-                AI_key_release();
-                break;   
-            case AI_KEY_LONG_PRESS:
-                AI_key_long_press();
-                break;  
-            case PWK_KEY_RELEASE:
-                pwk_key_release();
-                break;  
-                
-            case AI_PRINTF:
-                if(AI_AMP_msg.data)
-                uart_write(ai_uart_handle,AI_AMP_msg.data, AI_AMP_msg.len);
-                break;  
-            default:
-                break;
+                case AI_KEY_RELEASE:
+                    AI_key_release();
+                    break;   
+                case AI_KEY_LONG_PRESS:
+                    AI_key_long_press();
+                    break;  
+                case PWK_KEY_RELEASE:
+                    pwk_key_release();
+                    break;  
+                    
+                case AI_PRINTF:
+                    if(AI_AMP_msg.data)
+                    uart_write(ai_uart_handle,AI_AMP_msg.data, AI_AMP_msg.len);
+                    break;  
+                default:
+                    break;
+            }
+            if(AI_AMP_msg.data)
+                aic_free(AI_AMP_msg.data);
+        }else
+        {
+            aos_sleep(10);
         }
-        if(AI_AMP_msg.data)
-            aic_free(AI_AMP_msg.data);
+            
+        
     }
 }
 
index de2522e..363bc7a 100644 (file)
 #include <stdint.h>
 #include "alog_api.h"  
 
-// /******************** 硬件配置 ********************/
-// #define KEY_GPIO_PIN     GPIO_1      // 使用TOP GPIO1
-// #define DEBOUNCE_MS      20         // 去抖时间
-// #define LONG_PRESS_MS    1500       // 长按判定时间
-// #define POLLING_INTERVAL 10         // 检测周期(ms)
-
-// /******************** 状态机定义 ********************/
-// typedef enum {
-//     KEY_STATE_RELEASED,
-//     KEY_STATE_PRESSED,
-//     KEY_STATE_DEBOUNCE_DOWN,
-//     KEY_STATE_DEBOUNCE_UP
-// } KeyState;
-
-// /******************** 全局变量 ********************/
-// static struct {
-//     KeyState state;
-//     uint32_t press_start;
-//     uint8_t debounce_cnt;
-//     uint8_t last_level;
-// } key_ctrl;
-
-// static aos_timer_ptr key_timer;
-
-// /******************** 定时器回调 ********************/
-// static void key_scan_cb(void *arg)
-// {
-//     static uint32_t cnt = 0;
-//     u32 current = aic_gpio_level_get(KEY_GPIO_PIN);
-
-//     if(cnt++ % 10 == 0){ // 每10次打印一次其他信息
-//         bk_printf("[System] Free heap: %d\n", aos_get_heap_size());
-//     }
-
-//     if (current == 0) {
-//         bk_printf("key_scan_cb: LOW level\n");
-//     } else {
-//         bk_printf("key_scan_cb: HIGH level\n");
-//     }
-//    // bk_printf("key_scan_cb:current=%d",current);
-
-//     // switch(key_ctrl.state){
-//     // case KEY_STATE_RELEASED:
-//     //     if(current == 0){ // 低电平表示按下
-//     //         key_ctrl.state = KEY_STATE_DEBOUNCE_DOWN;
-//     //         key_ctrl.debounce_cnt = 0;
-//     //     }
-//     //     break;
-        
-//     // case KEY_STATE_DEBOUNCE_DOWN:
-//     //     if(current == 0){
-//     //         if(++key_ctrl.debounce_cnt >= (DEBOUNCE_MS/POLLING_INTERVAL)){
-//     //             key_ctrl.state = KEY_STATE_PRESSED;
-//     //             key_ctrl.press_start = aos_now_ms();
-//     //             AI_AMP_MSG_put(NULL, 0, AI_KEY_PRESS);
-//     //         }
-//     //     }else{
-//     //         key_ctrl.state = KEY_STATE_RELEASED;
-//     //     }
-//     //     break;
-        
-//     // case KEY_STATE_PRESSED:
-//     //     if(current != 0){ // 高电平表示释放
-//     //         key_ctrl.state = KEY_STATE_DEBOUNCE_UP;
-//     //         key_ctrl.debounce_cnt = 0;
-//     //     } else if((aos_now_ms() - key_ctrl.press_start) >= LONG_PRESS_MS){
-//     //         AI_AMP_MSG_put(NULL, 0, AI_KEY_LONG_PRESS);
-//     //         key_ctrl.press_start = aos_now_ms(); // 重置计时
-//     //     }
-//     //     break;
-        
-//     // case KEY_STATE_DEBOUNCE_UP:
-//     //     if(current != 0){
-//     //         if(++key_ctrl.debounce_cnt >= (DEBOUNCE_MS/POLLING_INTERVAL)){
-//     //             key_ctrl.state = KEY_STATE_RELEASED;
-//     //             AI_AMP_MSG_put(NULL, 0, AI_KEY_RELEASE);
-//     //         }
-//     //     }else{
-//     //         key_ctrl.state = KEY_STATE_PRESSED;
-//     //     }
-//     //     break;
-//     // }
-// }
-
-// /******************** 初始化函数 ********************/
-// void bk_key_init(void)
-// {
-//     // 配置GPIO为输入模式(无中断回调)
-//     aic_gpio_input(KEY_GPIO_PIN, 
-//                   GPIO_TRIGGER_LVL_LOW, // 低电平触发
-//                   NULL,                // 不使用中断回调
-//                   NULL);
-    
-//     // 初始化状态机
-//     key_ctrl.state = KEY_STATE_RELEASED;
-//     key_ctrl.press_start = 0;
-//     key_ctrl.debounce_cnt = 0;
-//     key_ctrl.last_level = aic_gpio_level_get(KEY_GPIO_PIN);
-    
-//     // 创建周期定时器
-//     key_timer = aos_create_timer(
-//         "key_detect",
-//         key_scan_cb
-//         NULL,
-//         100,
-//         AOS_AUTO_ACTIVATE, AOS_BE_PERIOD
-//     );
-// }
-
-// /******************** 反初始化函数 ********************/
-// void bk_key_deinit(void)
-// {
-//     if(key_timer){
-//         aos_delete_timer(key_timer);
-//         key_timer = NULL;
-//     }
-//     aic_gpio_output(KEY_GPIO_PIN, GPIO_OUTPUT_LVL_LOW); // 恢复默认输出
-// }
-
-
-#define KEY_GPIO_PIN_ID GPIO_1
-#define LOG_MODULE    AMOD_KPC
 
 
-static srv_func_callback g_kpc_callback = NULL;
-static int32_t g_kpc_handle = 0;
+
+#define LOG_MODULE    AMOD_KPC
+
 
 
 
 
-// int32_t aic_srv_kpc_register(char *client_name, srv_func_callback _srv_callback)
-// {
-//     g_kpc_callback = _srv_callback;
-//     g_kpc_handle++;
-//     aicx_info(0x0202e8, "d", "g_kpc_handle = %d \n", g_kpc_handle);
-//     return g_kpc_handle;
-// }
 
 static int32_t bk_kpc_callback(void *p_param, uint32_t size)
 {
@@ -157,29 +29,24 @@ static int32_t bk_kpc_callback(void *p_param, uint32_t size)
 
     for (int i = 0; i < 5; i++) {
         switch (key_arr->key[i].key_event) {
-            case KPC_KEY_EVENT_PRESS:
+            case KPC_KEY_EVENT_PRESS://按下
                 // bk_printf("[%d]AI_key_press",key_arr->key[i].key_value);
 
-                if (key_arr->key[i].key_value == 0) {
-                    bk_printf("[0]AI_key_press");
-                    AI_AMP_MSG_put(0, 0, VC_START);
+                if (key_arr->key[i].key_value == 0) {//AI键
+                    AI_AMP_MSG_put(0, 0, AI_KEY_PRESS);
                 }
                 break;
-            case KPC_KEY_EVENT_RELEASE:
-                if (key_arr->key[i].key_value == 1) {
-                    bk_printf("[1]AI_key_release");
+            case KPC_KEY_EVENT_RELEASE://释放
+                if (key_arr->key[i].key_value == 0) {//AI键
+                    AI_AMP_MSG_put(0, 0, AI_KEY_RELEASE);
+                }else if(key_arr->key[i].key_value == 1) {//PWK键
+                    AI_AMP_MSG_put(0, 0, PWK_KEY_RELEASE);
                 }
-
-
-                // bk_printf("[%d]AI_key_release",key_arr->key[i].key_value);
-
                 
                 break;
-            case KPC_KEY_EVENT_LONGKEY:
-                if (key_arr->key[i].key_value == 4) {
-                    bk_printf("[4]pwk_key_press");
-                    AI_AMP_MSG_put(0, 0, VC_CLOSE);
-                    AI_AMP_MSG_put(0,0,PWK_KEY_RELEASE);
+            case KPC_KEY_EVENT_LONGKEY://长按
+                if (key_arr->key[i].key_value == 0) {//AI键
+                    AI_AMP_MSG_put(0, 0, AI_KEY_LONG_PRESS);
                 }
                 // bk_printf("[%d]AI_key_long_press",key_arr->key[i].key_value);
                 
@@ -222,12 +89,3 @@ void bk_key_init(void)
     
 }
 
-// 按键处理函数
-void bk_key_process(void) {
-    kpc_key_array_t key_arr;
-    int valid_key_num = kpc_read_key(&key_arr);
-    if (valid_key_num > 0) {
-        // 调用回调函数处理按键事件
-        bk_kpc_callback(&key_arr, sizeof(key_arr));
-    }
-}
\ No newline at end of file