本博客的分析对象是安信可基于乐鑫esp-adf的一个智能家居的例程。由此来了解adf对智能家居的支持。通过对例程的分析来具体的了解adf的应用。
文章目录
智能家居main.c主要逻辑语音模块1,初始化环形缓冲区2,iis和ac101初始化3,原始音频数据的提取和优化 recsrcTask & agcTask4,语音唤醒和语音命令词控制网络模块wifi,ip设置sockets设置其他模块对语音控制有兴趣可点我
智能家居main.c主要逻辑
adf是集成了freertos的,所以是支持多任务的。例程可以分为语音模块,网络模块,其他模块。下面分别从这些模块进行分析。
语音模块
语音模块包括语音唤醒模型wakenetTask,语音命令控制模型multinetTask,环形缓冲区bingbuff,以及对原始音频数据的提取和优化。
1,初始化环形缓冲区
关于环形缓冲区,可以看看以下文章:点我查看环形缓冲区
例程的两个缓冲区是用来存放音频数据的;
//初始化环形缓冲区aec_rb = rb_init(BUFFER_PROCESS, 8 * 1024, 1, NULL);rec_rb = rb_init(BUFFER_PROCESS, 8 * 1024, 1, NULL);
2,iis和ac101初始化
在codec_init();中初始化i2c为master模式,速率为10mhz,同时配置ac101.
3,原始音频数据的提取和优化 recsrcTask & agcTask
recsrcTask :该任务通过iis读取ac101fifo的原始音频数据,并将音频数据存放到环形缓冲区ace_rb; agcTask :将ace_rb里的原始音频数据进行回声消除处理后得到新的音频数据,再将新数据存放再rce_rb中。
4,语音唤醒和语音命令词控制
wakenetTask
通过wakenet->detect(model_data, buffer);将rcb_rb中的数据与wakenet模型中已存在的唤醒词对比(如hi乐鑫),判断是否唤醒。若唤醒就进入listening,等待命令词的出现。进入listening模式后,再次将rcb_rb中的音频数据通过multinet->detect(model_data_mn, buffer);与multinet模型中的命令词对比,返回命令词的id号,调用speech_commands_action(command_id)执行相应的处理。例如开灯。
命令词的设置
可设置100个自定义的命令词,不过一般20个就够用了。通过在项目根目录cmd中make menuconfig,在菜单中选择语音识别命令词就可以修改。
网络模块
wifi,ip设置
initWifiApMode();设置ap的ssid和passwd
tcpip_adapter_init();设置设备的ipv4地址
sockets设置
主要是由tcp_serverTask来完成sockets的建立,监听和连接。
例程一个创建了4个socket,分别对应4个端口50000~50003.