牟曉東
在很多的開源硬件編程創(chuàng)客作品中都會用到“語音識別”控制功能,比如通過“小度小度”等喚醒詞來實現語音命令的喚醒與傳送,目前大部分的語音識別功能都離不開網絡支持(像百度智能云)。其實,我們還可以通過離線語音模塊(比如好好搭搭的ASR-THREE)來實現語音識別,優(yōu)點是響應速度非???,而且支持中英文甚至是方言語音命令的訓練學習與應用。如果想要設計制作一個Arduino“聲控門”,用戶通過發(fā)出“請開門!”、“請關門!”的語音指令來控制舵機進行開關門的動作,如何來實現呢?
實驗裝置包括Arduino UNO開發(fā)板一塊,ASR-THREE離線語音模塊一個,SG90舵機一個,紅色、綠色LED燈各一支,小型面包板一個,各種顏色的杜邦線若干。
首先,通過紅色和黑色兩根杜邦線,將Arduino的5V和GND端分別連接至面包板的側邊(標注有“+”紅色和“-”藍色長線);接著,將ASR-THREE離線語音模塊的V(電源正極)和G(接地端)連接至面包板的電源正極和負極,再將S(Signal)信號端連接至Arduino的3號引腳;然后,將SG90舵機的電源正極和接地端同樣也連接至面包板的電源正極和負極,再將信號端連接至Arduino的10號引腳;最后,將紅色和綠色LED燈的負極(“短腿”)均插入面包板的負極,正極(“長腿”)則分別通過杜邦線連接至Arduino的13號和12號引腳(如圖1)。
默認情況下,ASR-THREE離線語音模塊提供了50多條包括“學習命令”、“喚醒詞”和“命令詞”在內的語音指令,每條語音指令均對應一個十進制的ID號,比如命令詞“打開燈光”的ID號是70、“減小音量”的ID號是104等等。由于在設計制作的Arduino“聲控門”項目中需要的語音命令詞是“請開門!”和“請關門!”,因此需要進行自定義訓練ASR-THREE離線語音模塊進行“學習”,方法如下:
將Arduino的數據線連接至電腦的USB接口,很快就有“歡迎使用語音識別助手!”的語音提示;接著,對著離線語音模塊的麥克風說出任意一條喚醒詞——比如“智能管家”,離線語音模塊回答“我在呢!”;再說:“學習命令詞”,回答:“學習狀態(tài)中,保持安靜,請按提示學習命令詞,請說出第一條要學習的指令”,再說:“請開門!”,回答:“學習成功,請再說一次”;按照提示,最終完成該語音指令命令詞的訓練學習。同樣的操作,再訓練完成對“請關門!”語音指令的學習,對應的ID號分別是53和54(如圖2)。
為了進行串口數據傳輸及控制舵機的操作,需要先通過“#include
在setup()函數中,先設置串口通訊的波特率為115200:“mySerial.begin(115200)”;再將兩支LED燈的工作模式設置為輸出:“pinMode(RedLED,OUTPUT)”、“pinMode(GreenLED,OUTPUT)”;最后,聲明舵機的數據線連接在Arduino的10號引腳:“myservo.attach(10)”(如圖3)。
先來編寫open_door()“開門”函數:當收到“請開門!”語音指令時,首先控制紅色LED燈亮:“digitalWrite(RedLED,HIGH)”;然后,通過一個for()循環(huán)結構(“for(pos=0;pos<=90;pos+=1)”)來實現舵機的旋轉角度由0°逐漸遞增為90°:“myservo.write(pos)”,并且在每次旋轉增加1°后進行20毫秒的延時:“delay(20)”;最后,控制紅色LED燈熄滅、綠色LED燈發(fā)光:“digitalWrite(RedLED,LOW)”、“digitalWrite(GreenLED,HIGH)”。
接著,編寫close_door()“關門”函數,與open_door()函數非常類似,比如for()循環(huán)控制舵機由90°旋轉恢復至0°(“for(pos=90;pos>=0;pos-=1)”)、控制紅色和綠色LED燈的亮或滅,等等(如圖4)。
loop()主函數非常簡單,通過if()語句來判斷串口是否有新數據產生:“if (mySerial.available() > 0)”;如果有新數據產生,說明收到了某條語音指令,通過switch多分支結構(“switch (mySerial.read())”)來對語音指令的對應ID號進行判斷——如果ID號是53,說明收到的語音指令是“請開門!”,則執(zhí)行open_door()函數;如果ID號是54,說明收到的語音指令是“請關門!”,則執(zhí)行close_door()函數。
將程序保存為Sound_Door.ino,上傳至Arduino進行測試。先通過“智能管家”喚醒詞進行喚醒,再發(fā)出“請開門!”語音指令,紅色LED燈亮、舵機由0°旋轉至90°、紅色LED燈熄滅、綠色LED燈發(fā)光;接著再發(fā)出“請關門!”語音指令,綠色LED熄滅、紅色LED燈發(fā)光、舵機由90°旋轉至0°、紅色LED燈熄滅;反復測試,均能實現語音指令控制舵機正反轉開關門的功能(如圖5)。
啟動Mind+,首先點擊“擴展”按鈕進行主控板中“Arduino Uno”、執(zhí)行器中“舵機模塊”和用戶庫中“離線語音識別模塊”的添加;點擊“返回”按鈕后開始圖形化的編程:
同樣也是先編寫“開門”和“關門”兩個函數,包括紅色和綠色LED燈的開關及舵機的旋轉控制;然后再進行主程序的編寫,包括語音識別的初始化和串口波特率的設置,同樣也是在循環(huán)結構中先進行語音識別是否有數據可讀的判斷,然后通過變量Order_ID來存儲語音識別的讀取數據并判斷其數值——如果是53,則調用執(zhí)行“開門”函數;如果是54,則調用執(zhí)行“關門”函數(如圖6)。
將程序保存為Arduino“聲控門”.sb3,點擊“連接設備”后再進行程序的上傳測試,效果與使用Arduino IDE進行代碼編程的測試一致。