Respeaker mic array v2教學

Respeaker mic array V2(後簡稱array V2)就如上圖所示,是一片圓形的麥克風陣列擴展版。由於以USB通訊的關係,他能接到各種支援USB的裝置上作為聲音類感測器使用。

目前我們測試兩個連接方案──Windows系統和樹莓派,其中比較推薦使用樹莓派進行連接:

樹莓派:

插上之後請輸入以下指令安裝必要的函式庫

sudo apt-get update(可省略)

sudo pip3 install pyusb click

windows:

請至http://zadig.akeo.ie/ 下載安裝用的小程式,開啟後選擇SEEED DFU,以及在Driver上選擇libusb-win32

到這步驟完成,array V2至少已經有麥克風的功能了,各位可以利用一些錄音軟體或者python的錄音函式庫來測試一下狀況:


 

控制LED燈與DOA

相信各位都有注意到,array V2上有一圈LED燈。接上電之後他內建的DOA程式就開始執行(晶片組內),上面的亮藍色燈光便會一直追著聲音的方向。在說明DOA之前,我們先說明如何控制上面的LED燈光,使他能像很多語音助理一樣透過燈號表示各種狀態。

首先我們要先得到相關的函式庫,請至https://github.com/respeaker/pixel_ring/tree/master/pixel_ring中,下載usb_pixel_ring_v2.py這個檔案,以及至https://github.com/respeaker/usb_4_mic_array中,下載tuning.py,並將這兩個檔案放置在你開發python程式的資料夾中。

接著請依照以下程式碼引用函式庫,並定義裝置:


from tuning import Tuning

from usb_pixel_ring_v2 import PixelRing

import usb.core

import usb.util

 

dev = usb.core.find(idVendor=0x2886, idProduct=0x0018)

if dev:

pixel_ring = PixelRing(dev)
Mic_tuning = Tuning(dev)


接著,只要使用以下方法就可以控制LED陣列:

 

pixel_ring.wakeup(角度數值)

就可以像他預設執行的DOA一樣,在特定角度以亮藍燈,其餘角度深藍燈的方式標出角度

 

pixel_ring.think()

pixel_ring.speak()

這邊的兩個函式則是像語音助理的燈號,分別為兩種LED變化模式表達思考跟回答

 

pixel_ring.mono()

可以讓整個陣列變成同色,接收參數為0xRRGGBB

 

pixel_ring.set_color_palette()

這個函式可以調整think、wakeup等雙色顯示的雙色是哪兩色

比方說,pixel_ring.set_color_palette(0xf00000, 0x0000f0)就會將它變成紅+藍

對於DOA而言,前面的參數會是指示方向的顏色

 

pixel_ring.off()

這個函式可以關閉LED陣列。

 

pixel_ring.trace()

開啟DOA模式,注意這個函式實測時他會變更wakeup的角度,不推薦直接使用而是以底下的DOA方法。


以上所有指令在樹莓派下都需要sudo權限,但這樣會產生一些問題──比方說ALSA系統在sudo模式下會無法正常放出聲音這點,作為智慧音箱或智慧機器人的配件來說是個有點致命的問題。

但不代表沒辦法解決:

至於DOA的取得,則是利用Mic_tuning.direction()取得即時的DOA數據,也就是說,利用一個while迴圈包覆pixel_ring.wakeup(Mic_tuning.direction())這行程式碼,就會跟pixel_ring.trace()達成類似的效果。

而錄音的部分,請參考seeed原廠文件,或是參加研習的老師有取得我們的示範程式碼,則可以直接引用record_wave子程式或是Ex_2_1的main即可。

若需要更詳細資料請參考seeed wiki:http://wiki.seeedstudio.com/ReSpeaker_Mic_Array_v2.0/

包含有接入其他語音助理的方法、其他的STT方法等等。

Read More

LineBot開源教學

第一章、 前言
在現在這時代,最多人使用的通訊軟體就是LINE了。我們想做一些服務或展示,比起生一個APP,使用網頁或者其他軟體內嵌服務可能更快速。而AI能應用的東西很廣,如果有一個可以結合我們上述提到的那些小系統的方案,顯然是個不錯的展示平台。
而我們想到的就是LINE了,LINE提供了一個開發者介面,讓開發者可以將LINE連結自己的API來做一些有趣的應用,而其中一個就是聊天機器人,許多的明星或者公司會利用這個技術做類似客服的LINE帳號。這類機器人通常會對特定的語句做出反應,高階一點的則是語句有些許變化也能容忍──這剛好是我們前面NLP部分的應用。而LINE也有接收聲音、圖片的事件,可以結合智慧音箱和影像辨識。
我們利用Heroku提供的雲端API執行平台,連結Line開發者帳號來嘗試製作一個對話機器人Kotori(吉祥物教阿的日文名字)。

第二章、 前置準備
要將我們設計的機器人架在LINE上面得先做一點準備,第一步,我們先申請一個Heroku帳號,從官方網站https://www.heroku.com/點選右上角的SignUp註冊。
註冊完成後,登入點選右上角的New->Create New App,建立一個自己喜歡的App專案(請記住專案的名稱)。完成之後依以下網址下載Heroku CLI並安裝:https://devcenter.heroku.com/articles/heroku-cli。
第二步,安裝git:https://git-scm.com/downloads。
第三步:申請Line的開發者專案,詳情可以參考https://developers.line.me/en/docs/messaging-api/getting-started/。
以上,先期的準備大致完成,接著進入程式碼撰寫的部分。由於程式本身要在雲端執行,故main裡面和一般的程式寫法有一點差異。另外本程式基於line-bot-sdk開發而成。

第三章、 文字訊息事件
在linebot之中有許多的事件類型,當你需要針對某個類型事件作處理的時候就要先宣告它的接收體,@handler.add幫助各位建立各種不同的接收體,以下我們將為各位說明幾個比較常用的大類
文字訊息是LINE上面最常見的訊息,大致上就是純文字所構成,偶爾可能混一些符號:

LineBot_1

這類訊息我們可以使用

@handler.add(MessageEvent, message=TextMessage)

來宣告接收體,並在handle_message(event)中對訊息做處理。處理LINE訊息時,第一個要記起來的物件是event.message.text,如字面翻譯,就是當有人傳訊息給這個機器人時訊息的主體。如上圖,我傳送給教阿後,教阿透過event.message.text取得我傳送的訊息(”C4cat是什麼”,以及”?”),並分析後回應。

而第二個重要的物件是event.reply_token,這個物件決定你收到這條訊息要回應的對象。event.reply_token是一次性的,即使是同一個人,第二次傳訊過來你收到的event.reply_token也不會一樣。

而文字訊息分析我們前面提過幾個方法,比方說全句對應型或者是斷詞後對特定詞作反應:

        第1節. 全句符合
包含了全句式的回應(智慧居家管家系統、智慧講桌系統)以及占卜系統(占卜球),占卜球因為強制要求日期格式,劃分至全句符合的區塊。具體內容前面章節皆有說明,不再贅述。


        第2節. 關鍵詞符合
包含股票查詢系統和WikiQA系統,股票查詢系統利用twstock函式庫取得資料,要求有股票關鍵字,以及上市代號或名稱。
twstock在本系統主要利用它的幾個功能:即時交易價查詢、最高最低點查詢(前二皆為twstock.realtime.get取得)以及四大買賣點分析(BestFourPoint)。
WikiQA系統則需要有5W(什麼、誰、哪裡之類)疑問詞,以及最好有介系詞(是、在之類)來幫助教阿利用wikipedia函式庫尋找答案並回答


        第3節. 子字串符合
本機器人已經上線一段時間了,觀察使用者使用紀錄以及程式歷程,訊息無法正確回應的一大原因是斷詞系統錯誤,造成以關鍵詞為準的分析無法觸發。
依照此現象,一個想法是將詞的概念去除,單純以子字串作為觸發來做為最後防線。字串物件的find方法可以達成這件事情。
子字串方法由於不受斷詞正確率影響,通常做為檢查的最後手段,注意它雖然不受斷詞干擾,但容易被誤觸發──比方說以上面例子,萬一用戶說的是”這個公式老師沒有教阿!”這種句子就會誤觸發,雖然正常來說作為語尾助詞「阿」應該是選「啊」這個字,但很遺憾的是,其實LINE用戶在打字時選字是很隨便的。

第四章、 貼圖訊息事件
在LINE上第二多的應該算是貼圖訊息,某些人在好友群組甚至可以光依靠貼圖就完成對話和意見交流。因此我們也會稍微對貼圖訊息做處理,但LineBot本身只能回應前4組Line內建的普通貼圖。
第一件事情當然是建立貼圖的接收器,和文字訊息類似,使用@handler.add(MessageEvent, message=StickerMessage)宣告接收器,再從之後的handle_sticker_message(event)編寫對應。
貼圖在LINE之中是以兩組號碼代表,第一組號碼是該貼圖屬於那個系列的貼圖,在event物件中為event.message.package_id,第二組號碼是該貼圖在系列中的第幾張,為event.message.sticker_id物件。因為版權問題,此處不方便截圖說明建立的貼圖,但可以藉由自行發送貼圖給Line機器人,再請它回傳的方式得到這些號碼。

第五章、 PostBack事件
PostBack事件是一種比較特殊的事件,用戶不會因為打字或傳送什麼東西而觸發它,比較常見的觸發方法是用了LINE提供的內建選單,像底下這種:

LineBot_2

這種清單當你按下按鈕,有可能是傳回PostBack到LINE Bot的伺服器,LINE Bot再根據PostBack做回應,類似我們一般程式傳變數的感覺。我們將在回應部分說明如何生出這種選單式的LINE訊息。
而要接收PostBack使用的是@handler.add(PostbackEvent),一樣使用後面的handle_postback(event)定義接收到的反應。
我們的系統中,PostBack基本上只對列表或按鈕做出反應,而其中包含了兩個列表:說明文件和IoT列表。原理相同都是分析PostBack傳回的變數。

第六章、 回應
回應部分雖然分為四片,但實質上就只是更動一些物件及變數,主要方法並沒有變更,故合併一起說明。
回應的基本函式都是基於以下函式:

line_bot_api.reply_message(event.reply_token, message)

差別只在message的種類差別。


 

        第1節. 文字訊息

TextSendMessage(text=message)

最常見的回應,單純回一個文字字串回去:

LineBot_3


 

        第2節. 貼圖訊息

StickerSendMessage(
package_id=event.message.package_id,
sticker_id=event.message.sticker_id)

參考前面有關貼圖事件,發送一樣也是兩個id組成。前面也提到過只能使用前四組普通貼圖,很無聊就不示範了

LineBot_4


 

        第3節. 圖形訊息

message = ImageSendMessage(
original_content_url=’https://i.imgur.com/Hn6lBtg.jpg’,
preview_image_url=’https://i.imgur.com/Hn6lBtg.jpg’)

圖形訊息必須從url傳送,且格式限制為jpg。程式接受自己製作縮圖,縮圖和原圖的大小有其限制(請參考line-sdk)。
預防各種版權問題,這邊不呈現運作結果。


        第4節. Template訊息
Template訊息可以視為是Line的互動功能,按下列表會有特定反應,也可以讓點列表的用戶說出特定訊息:

LineBot_5

在電腦版上不能顯示列表時就是顯示替代文字:

LineBot_6

其他部分對應程式碼大略可以推出是哪部分的參數,比較麻煩的是actions部分。actions有許多種類,PostbackTemplateAction可以在點選之後傳一個Postback,觸發我們前面提到的Postback事件。另外也有MessageTemplateAction事件,點選之後使用者會發出選單指定的訊息──再使用一般文字訊息事件做回應。

第七章、 發佈
最後就是架到雲端執行的部分。如果各位還記得我們開始寫程式前的步驟(申請帳號等等),那些都是為了現在所做的前期工作。
開啟聊天機器人python檔放置之資料夾,並在路徑列輸入cmd:
就會直接開啟命令提示字元,在底下依序輸入指令:
heroku login
git config –global user.name 你的名字
git config –global user.email 你的信箱
git init
heroku git:remote -a 前面步驟你為APP取的專案名稱
git add .
git commit -m “任意名字" 以後更新程式時下最後這三行藍字指令即可
git push heroku master
上傳完成,可以到Line添加你的開發者專案產生的機器人好友,開始測試。

Read More

Respeaker Core V2 安裝與啟動教學

Respeaker啟動說明

官方wiki原網址:

http://wiki.seeedstudio.com/ReSpeaker_Core_v2.0/

 

若你為一般通路購買,請至官方wiki下載映像檔(因採用的是雲端硬碟分享,目錄改變網址會跟著跑,此處無法附上)

若為參加研習時獲取我們預先建置好的SD卡,則不需進行燒錄動作

RespeakerCore_1

基本上,找到lxqt-sd-更新日期-4gb的映像檔(副檔名img.xz),燒好燒滿(O

windows用戶可能還需要安裝CDC Drivers:下載連結

燒錄完之後,請將燒錄好的SD卡插入,再以USB線連結Respeaker Core V2(後簡稱Core V2)的OTG孔和電腦的USB孔,注意一定要接在OTG孔上:

RespeakerCore_9

接著打開你的PUTTY(若沒有,請至https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html下載)

RespeakerCore_2

請點選開啟正確的程式(紅框處),因為很多名稱都是Pu開頭很相近,請不要開錯了

打開之後長得像這樣:

RespeakerCore_3

我們注意到Serial line需要指定COM Port,於是我們從裝置管理員查看Core V2的編號,再將該編號輸入:

RespeakerCore_4

另外請將Speed改成115200,Speed底下的選取框選擇Serial

設定完成後,請至Putty視窗的最下方點選open按鈕

若前面設定完全正確且映像檔正常(請注意,seeed原廠的映像檔會持續更新,為了各種功能的支援跟修正,但忙中有錯,偶爾會跑出有問題的映像檔……),會看到像命令提示字元的視窗

RespeakerCore_10

……話說它已經明確的告訴你預設的帳號跟密碼了,請直接以預設的帳密登入(皆為respeaker)

確認登入後輸入:sudo nmtui

RespeakerCore_5

選取Activate a connection,找到一個你能用的wifi連線,確認已經連結上了之後回到命令提示字元視窗,輸入ip address查看wifi分配給你的區網IP(請記住這個ip位置,之後連線時會用到)

請確保自己準備遠端連線的電腦和Core V2在同一個wifi連線中

我們遠端連線的軟體使用VNC,若電腦內沒安裝過的話請至:

https://www.realvnc.com/en/connect/download/viewer/

開啟VNC,在紅圈處輸入剛剛記下來的ip位置,按下Enter,出現登入用的視窗:

RespeakerCore_6

密碼一樣是respeaker

進入圖形介面,前置作業到此結束。

RespeakerCore_7

注意:Respeaker的桌面系統,在三月份映像檔測試時只有第一次登入時會看到這張摺紙鳥的桌布,之後都會是全黑的桌布,其不影響系統正常執行。

另外,Respeaker中內置2.7以及3.5版的python,分別以python和python3開啟,並分別以pip和pip3管理各自的函式庫。

教師研習時獲得的SD卡,請注意盡量不要再次進行燒錄。
研習的範例檔預設都由python3執行,請藉由命令列輸入python3+執行的範例檔路徑,後續我們會考慮適合的IDE介面,請耐心等待後續的更新。

另外,由於原廠系統暫時無法切換到中文語系(6月份映像檔版本),所以中文輸入暫時無法運作,牽涉到中文輸入的Ex_3_1並沒有辦法輸入中文執行。當然,也可以使用其他方式複製到中文字串貼上,此時請記得在執行指令加上sudo(即命令列為:sudo python3 路徑/Ex_3_1.py)。jieba本身會在系統目錄底下寫暫存檔,需要使用者權限才能正常寫入。

而GPIO由於跟樹莓派設定不同,Ex_2_5不能用原先樹莓派的程式碼,請參考seeed原廠using GPIO的章節更改GPIO的設定。
原seeed提供的映像檔非常輕量,輕量到python語音辨識課程的大多數相依庫是未安裝狀態(若參考seeed的wiki將所有DEMO都安裝執行過,則會稍微改善,但依然不足以執行我們研習時的範例檔案)
若教師有更新映像檔的需求,則請先以WinSCP將SD卡附的範例(NLP資料夾)先備份至電腦。重新燒錄完映像檔之後執行以下指令補齊函式庫,再將範例資料夾放回應可順利執行:


sudo apt-get install libasound-dev portaudio19-dev libportaudiocpp0 flac
sudo apt-get install -y python python-dev python-pip build-essential swig git libpulse-dev
sudo apt-get install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev
sudo apt-get install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
sudo apt-get install python3-tk
sudo pip3 install pocketsphinx webrtcvad monotonicsudo
sudo pip3 install freetype-py pygame jieba wikipedia
sudo pip3 install pyaudio respeaker requests gTTS SpeechRecognition


 

Read More