From: p15692025051 <846603105@qq.com> Date: Wed, 16 Apr 2025 09:55:40 +0000 (+0800) Subject: 按键修复 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=11f29cf221d683731a63f33eee428b496fd7ce34;p=mirrors%2FFX01.git 按键修复 --- 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 8c9472d..18007f2 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 @@ -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 +// #include 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); + + } } 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 de2522e..363bc7a 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 @@ -9,143 +9,15 @@ #include #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