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);
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();
//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);
(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
{
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);//打开声音
}
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);
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);
}
// 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)
{
}else
{
+ bk_printf("AI_VC_play_task sleep....");
aos_sleep(1);
}
}
{
//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)//开启的时候,先缓存音频
{
break;
}
}
- aos_sleep(1);
+
}
aos_sleep(1);
bk_printf("AI_VC_record_task end.....");
}
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--;
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);
+
+
}
}
#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)
{
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);
}
-// 按键处理函数
-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