天天看點

ESP32A1S開發之智能家居 語音喚醒 語音指令控制(持續更新)

本部落格的分析對象是安信可基于樂鑫esp-adf的一個智能家居的例程。由此來了解adf對智能家居的支援。通過對例程的分析來具體的了解adf的應用。

文章目錄

  • ​​智能家居main.c主要邏輯​​
  • ​​語音子產品​​
      • ​​1,初始化環形緩沖區​​
      • ​​2,iis和ac101初始化​​
      • ​​3,原始音頻資料的提取和優化 recsrcTask & agcTask​​
      • ​​4,語音喚醒和語音指令詞控制​​
  • ​​網絡子產品​​
      • ​​wifi,ip設定​​
      • ​​sockets設定​​
  • ​​其他子產品​​
​​對語音控制有興趣可點我​​

智能家居main.c主要邏輯

adf是內建了freertos的,是以是支援多任務的。例程可以分為語音子產品,網絡子產品,其他子產品。下面分别從這些子產品進行分析。

ESP32A1S開發之智能家居 語音喚醒 語音指令控制(持續更新)

語音子產品

語音子產品包括語音喚醒模型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設定

其他子產品