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