本部落格的分析對象是安信可基于樂鑫esp-adf的一個智能家居的例程。由此來了解adf對智能家居的支援。通過對例程的分析來具體的了解adf的應用。
文章目錄
- 智能家居main.c主要邏輯
- 語音子產品
-
-
-
- 1,初始化環形緩沖區
- 2,iis和ac101初始化
- 3,原始音頻資料的提取和優化 recsrcTask & agcTask
- 4,語音喚醒和語音指令詞控制
-
-
- 網絡子產品
-
-
-
- wifi,ip設定
- sockets設定
-
-
- 其他子產品
對語音控制有興趣可點我
智能家居main.c主要邏輯
adf是內建了freertos的,是以是支援多任務的。例程可以分為語音子產品,網絡子產品,其他子產品。下面分别從這些子產品進行分析。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN5ETM0E2MlBDMmN2Y2EWYxYzX3ITNxMDM0AzLcJTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
語音子產品
語音子產品包括語音喚醒模型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位址