//连接websocket
static int websocket_connect_VC(void);
static void websocket_deconnect_VC(void);
+#include <stdio.h>
+#include <stdlib.h>
+#define SCALE_FACTOR 10000 // 用于缩放的因子
+// 高级声学回声消除算法(基于NLMS),不使用浮点运算
+void aec(short *input_signal, short *reference_signal, short *output_signal, int num_samples, int filter_length) {
+ int *filter_weights = (int *)calloc(filter_length, sizeof(int));
+ if (filter_weights == NULL) {
+ fprintf(stderr, "内存分配失败\n");
+ return;
+ }
+
+ int mu = 5000; // 步长因子,相当于浮点的0.5 * SCALE_FACTOR
+ int delta = 1; // 正则化参数,避免分母为零
+
+ for (int n = filter_length; n < num_samples; n++) {
+ int echo_estimate = 0;
+ // 计算估计的回声
+ for (int i = 0; i < filter_length; i++) {
+ echo_estimate += filter_weights[i] * reference_signal[n - i - 1];
+ }
+ echo_estimate /= SCALE_FACTOR;
+
+ // 计算误差信号(消除回声后的信号)
+ output_signal[n] = input_signal[n] - (echo_estimate);
+
+ // 计算参考信号的能量
+ int energy = 0;
+ for (int i = 0; i < filter_length; i++) {
+ energy += reference_signal[n - i - 1] * reference_signal[n - i - 1];
+ }
+
+ // 使用NLMS算法更新滤波器权重
+ int step = (mu * SCALE_FACTOR) / (energy + delta);
+ for (int i = 0; i < filter_length; i++) {
+ filter_weights[i] += (step * output_signal[n] * reference_signal[n - i - 1]) / SCALE_FACTOR;
+ }
+ }
+
+ free(filter_weights);
+}
int play_data_len = 0;
//关闭音频播放
void VC_Play_End(void);
// int audio_play_time = AI_VC_play_queue_data.len*1000/32000+1;
ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
- AI_VC_play_queue_data.data, AI_VC_play_queue_data.len, AOS_WAIT_FOREVER);
+ AI_VC_play_queue_data.data, AI_VC_play_queue_data.len, 2000);
//audio_data(AI_VC_play_queue_data.data,AI_VC_play_queue_data.len,20);
if (ret < 0)
bk_printf("app_audio_write error, ret=%d\n", ret);
- // for(int i = 0;i<=AI_VC_play_queue_data.len/sizeof(play_tmp_d);i++)//分段写
+ // for(int i = 0;i<=AI_VC_play_queue_data.len/sizeof(play_tmp_d);i++)//分段写,一次写入小于640会出问题
// {
// int play_tmp_d_len = sizeof(play_tmp_d);
// memset(play_tmp_d,0,play_tmp_d_len);
void AI_VC_Close(void)
{
bk_printf("AI_VC_Close!!!!!!!!!!!!");
- app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
+
//销毁发送线程
if(AI_VC_record_task_id != 0)
{
AI_VC_1S_timer = NULL;
}
close_timerout = 0;
+ app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);//要在销毁线程之后
}
aos_status AI_AMP_MSG_put(const char *data,u32 len,AI_AMP_MSG_Type MSG_Type)
{