牟曉東
功能豐富的外接傳感器一直是樹莓派等開源硬件編程的重要輸入設備,比如超聲波傳感器能夠監(jiān)測與障礙物間的距離。如果給樹莓派安裝上全向麥克風和音箱,借助古德微積木編程,我們就可以輕松實現(xiàn)智能音箱的“語音喚醒”功能——通過特定的語音指令(比如百度AI平臺的“小度小度”)使樹莓派處于待命狀態(tài),然后再通過語音識別將用戶的語音指令“翻譯”并執(zhí)行,完成開關燈和在屏上顯示文字信息等功能,甚至是通過音箱進行語音對話。下面,我們就打造這樣一個“聽話”的樹莓派智能音箱。
需要使用的實驗器材包括:樹莓派一塊,古德微擴展板一塊,USB接口全向麥克風一個,紅黃綠藍LED燈各一支,OLED顯示屏一塊,有源音箱一個。
將四支LED燈分別插入擴展板的5號、6號、12號和16號插孔,注意長腿為正極、短腿為負極;仔細將OLED顯示屏的四個引腳插入I2C的Down列,注意標注VCC、GND、SCL和SDA各引腳順序與擴展板要一一對應;全向麥克風插入USB接口,音箱插入樹莓派的音頻輸出圓孔;最后,插入電源線,通電啟動系統(tǒng)(如圖1)。
在瀏覽器中訪問古德微機器人網(wǎng)站(http://www.gdwrobot.cn/),登錄古德微板的賬號后點擊“設備控制”,進入“積木”編程區(qū)。我們將編寫包括語音喚醒主體程序和“開燈”、“關燈”、“加油”與“自強”四個功能子函數(shù)。
首先從“人工智能→語音識別”中調用“小度小度關鍵詞語音喚醒”模塊,創(chuàng)建一個系統(tǒng)默認的“Wakeup新函數(shù)”;該函數(shù)的第一條語句為“播放本地音頻”,這個“本地”音頻文件是指“樹莓派系統(tǒng)/home/pi/temp/ding.mp3”文件,作用是當語音喚醒成功后用提示音“叮”來響應用戶。
“輸出調試信息‘Hello”作用是在LOG調試區(qū)分別輸出“Hello”提示信息。
接著建立“語音文字”變量,賦值為“將3秒語音輸入轉換成文字輸出”,作用是將用戶的語音指令轉換為文本信息;“輸出調試信息‘語音文字”作用是在LOG調試區(qū)輸出轉換為文本格式的語音指令。
接下來是包含五個分支的“如果…執(zhí)行…”判斷語句,前面四個都是從文本格式的語音指令中尋找是否有對應的關鍵字出現(xiàn),這些關鍵字分別是“開”、“關”、“加油”和“自強”:如果指令中含有“開”(比如用戶的語音指令是“請開燈!”),即“從文本‘語音文字尋找第一個出現(xiàn)的文本‘開”的值不為0(條件為真),那么就調用“開燈”函數(shù);如果找到的關鍵字是“關”,則調用“關燈”函數(shù);“加油”和“自強”也是分別調用對應的函數(shù),執(zhí)行開關燈和顯示對應信息的操作。
如果這四個條件均不成立的話,說明用戶的語音指令不是控制燈和信息顯示,則需要借助百度的智能語音功能與用戶對話。建立“回答問題”變量,賦值為“文本回答問題‘語音文字”,并且既在LOG區(qū)以文本形式顯示“答案”,同時也通過“播放語音‘回答問題”模塊在音箱中語音回答該問題(如圖2)。
根據(jù)相似度,四個子函數(shù)可分為兩組:“開燈”與“關燈”一組、“加油”與“自強”一組?!伴_燈”函數(shù)通過四個語句“控制x號小燈‘亮”來實現(xiàn)插接在5號、6號、12號和16號插孔的LED燈發(fā)光,而“關燈”函數(shù)則是四個“控制x號小燈‘滅”語句,控制四支LED燈熄滅(如圖3)。
“加油”與“自強”函數(shù)稍顯復雜,需要對OLED顯示屏先進行初始化操作,接著要建立“圖片對象”變量進行圖片模式設置(均保持默認值),然后分別為其賦值“中國,加油!”和“吾輩當自強”,并設置好文字的大小和坐標顯示位置,最終通過“把圖片‘圖片對象顯示到OLED顯示屏”語句實現(xiàn)文字信息的顯示。添加一個5秒的等待語句,作用是控制文本信息在顯示屏上停留(否則閃一下就消失了),最后關閉OLED顯示屏(如圖4)。
程序編寫完畢,點擊“保存”按鈕,將程序代碼保存。
打開LOG輸出區(qū),點擊“運行”按鈕,開始對著麥克風喊話,進行語音喚醒測試。由于我們調用的是百度的智能語音功能,所以喚醒語句也是“小度小度”AI的智力也與百度智能音箱一致。
依次測試四個函數(shù)功能,第一條“小度小度,請開燈”,四支LED燈會被點亮;第二條語音指令:“小度小度,請關燈”,四支LED燈應熄滅;第三條語音指令:“小度小度,加油”,OLED屏上應顯示“中國,加油!”(5秒后關閉);第四條語音指令:“小度小度,自強”,OLED屏上應顯示“吾輩當自強”。
再測試非預定指令,發(fā)出第五條語音指令:“小度小度,背首唐詩聽聽”,音箱語音輸出“不給你聽”,LOG區(qū)也同步有語音指令的對應文字及回答的文字顯示(如圖4)。
根據(jù)實際測試,需要注意的是,一是語音喚醒必須先說“小度小度”,稍停,聽到音箱中發(fā)出“叮”的一聲后再發(fā)出諸如“請開燈”的語音指令,因為“小度小度”是程序的默認喚醒關鍵詞;二是語音指令需要簡短明確,很多語音指令都能“喚醒”控制LED發(fā)光,比如“一分鐘之內馬上開燈”、“不要開燈”,甚至是“開個玩笑吧”,只要語音指令中能夠被檢測到有“開”這個關鍵字便會調用“開燈”函數(shù)——除非LED燈發(fā)光時再發(fā)“開燈”指令,好像是“無效”的(其實是重復執(zhí)行了“開燈”操作);三是主體程序中的最后一個判斷分支是個“開放式”語音指令(除了前四種可能之外的其他各種可能),樹莓派就會進行智能判斷并給出較為合理的回答,舉例:“唱首歌聽聽”——回答:“別人唱歌要錢,我唱歌要命,你可想好了?”、“謝謝你”——回答:“別,客,氣”,第二次要求“背首唐詩聽聽”——回答:“唐詩三百首,背完了,才五個字,忒簡單”。
當然,這些“智能”回答都是網(wǎng)站平臺背后的數(shù)據(jù)庫對應記錄的映射調用,但趣味性極強,非常適合低年齡段學生進行對話測試,提高他們對開源硬件編程的學習興趣。