ESP32A1S开发之智能家居 语音唤醒 语音命令控制(持续更新)

本博客的分析对象是安信可基于乐鑫esp-adf的一个智能家居的例程。由此来了解adf对智能家居的支持。通过对例程的分析来具体的了解adf的应用。

智能家居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.

其他模块

猜你喜欢

转载自blog.csdn.net/weixin_44821644/article/details/107508506