【知識教學文】一起走進ROS的世界吧!-Part5

【知識教學文】一起走進ROS的世界吧!-Part5

 

前面寫了四篇ROS心得文章之後,這篇也持續用ROS玩一些有趣的實驗分享給大家。由於之前在演講時,有提到Simple Care想做一台聽得懂人話的小車,這有點像是台會移動的智能音箱,那為什麼會有這個想法呢? 首先,當然是因為室內定位需要先做SLAM,那不如就做個小車來SLAM;再來是我家三房兩廳存在著高低落差,這也是為什麼廠商在賣掃地機器人時,會非常強調機器人的脫困能力,但我們又沒有要做掃地機器人,而是只要有移動SLAM、語音辨識、影像辨識等功能,所以做遙控器汽車的樣子就好啦!試想您以前玩的遙控器汽車的脫困能力會比掃地機器人差嗎?還不是飛上飛下,連公園的溜滑梯都有它的蹤跡。

在這篇我們就來試試pocketsphinx,玩玩語音辨識吧!

 

首先安裝一堆的package:

sudo apt-get install ros-kinetic-audio-common libasound2 gstreamer0.10-*  gstreamer1.0-pocketsphinx

 

再安裝libsphinxbase1

sudo dpkg -i libsphinxbase1_0.8-6_amd64.deb

 

然後安裝libpocketsphinx1

sudo dpkg -i libpocketsphinx1_0.8-5_amd64.deb

 

接下來安裝gstreamer0.10-pocketsphinx

sudo dpkg -i gstreamer0.10-pocketsphinx_0.8-5_amd64.deb

 

接著

cd ~/catkin_ws/src

git clone https://github.com/mikeferguson/pocketsphinx

 

您會發現在src裡面有pocketsphinx的資料夾

然後下載英文語音包

再進入下載的地方 sudo dpkg -i pocketsphinx-hmm-en-tidigits_0.8-5_all.deb 去安裝

 

接下來進入pocketsphinx下面建一個model目錄

拷貝pocketsphinx-hmm-en-tidigits_0.8-5_all.deb到model下,然後解壓縮,再進入pocketsphinx-hmm-en-tidigits_0.8-5_all資料夾解壓縮data.tar.xz

會出現一個usr資料夾

再進去 /usr/share/pocketsphinx/model 把hmm與lm全部copy

回到catkin_ws/src/pocketsphinx/model下,把除了hmm與lm的東東全部刪除,這樣我們在pocketsphinx裡就有語音模型了!

再來就是MIC的測試,這裡簡單寫一下我用的是小米運動藍芽耳麥

因為MAC Air沒有耳機孔啊!!!不然用耳機孔收音比藍芽耳麥好多了!

 

然後輸入以下指令

roslaunch pocketsphinx robocup.launch

結果就出現了錯誤

小弟查了很久發現網上的教程幾乎都是indigo或更早之前的舊版本,所以用在kinetic需要一些特別的方式,這個時候就是詢問google大神啦!!!

 

首先要修改recongnizer.py

  1. 把asr.set_property(’configured’, True) 標注掉

  1. 增加以下code

if rospy.has_param(self._hmm_param):

hmm = rospy.get_param(self._hmm_param)

else:

rospy.logerr(‘Recognizer not started. Please specify a hmm.’)

return

 

然後改一下

self.asr.set_property(‘lm’, lm)

self.asr.set_property(‘dict’, dic)

self.asr.set_property(‘hmm’, hmm)

 

眼尖的朋友會發現上圖有三行被小弟畫掉了,那是因為我一開始這樣寫,run起來沒什麼問題,但後來自行增加語音辨識字詞時卻出現問題,所以最後還是改回去了。(您也許會在網路上看到有人直接把語言包的絕對路徑寫進去,但也有些人沒寫。)

 

最後是長這樣

接下來編輯 pocketsphinx/demo/robocup.launch

由於先前我們已將model下面全放語音模型,所以將robocup.launch修正如下

接下來就可以 roslaunch pocketsphinx robocup.launch

然後再開個Terminal -> echo /recognizer/output

 

這裡其實應該要貼一張圖上來看看語音辨識的結果,但我發現後來居然沒截到圖,所以只好唱一首歌say sorry了!

進去tidigits.dic看一下,只有做0~9還有oh的語音辨識

如果要讓小烏龜亂跑,可以講one讓它往左、two往右、three往上與four往下,但是這樣很沒FU,所以我們就來自建語音庫,在pocketsphinx建一個config資料夾,資料夾內生成一個commands.txt,而txt的內容如下:

go forwared

go backward

go back

go left

go right

go straight

turn left

turn right

faster

speed up

slower

slow down

stop

halt

shut down

 

然後去這兒,選取您的commands.txt檔案,再按COMPILE KNOWLEDGE BASE

接著我是直接下載壓縮檔

把它解壓全改名為commands

再把所有檔案全丟到pocketsphinx/config資料夾下

然後再到這兒,下載hub4wsj_sc_8k.tar.gz

解壓縮把hub4wsj_sc_8k資料夾全丟到model/hmm/en下

接著用gedit做一個launch檔,叫作voice_commands.launch

開Terminal ->roslaunch pocketsphinx voice_commands.launch

再開Terminal -> rostopic echo /recognizer/output

 

然後看看語音辨識的結果,這裡我講了back

 

或是加速speed

好啦~前一篇有教過大家用echo這個指令,相信大家都知道這是debug好幫手

 

即然有了/recognizer/output,要讓小烏龜走動,就subscribe /recognizer/output 就好啦~所以才說這跟先前我們教的MQTT有87%像!

 

這樣就可以開始用python玩code啦~運氣很好的是,更早之前KNN演算法已經用python試過一輪啦!玩ROS還把之前玩過的東西又給回憶一波,居然有這麼好的事!

 

這裡我們直接用古月居大大寫的voice_teleop.py

這是小弟在網上看到寫的最容易懂的語音控制節點

把它copy到pocketsphinx/node

所以您的node資料夾會有 Recognizer.py、voice_cmd_vel.py與voice_teleop.py

 

開啟Terminal -> roslaunch pocketsphinx voice_commands.launch

再開啟Terminal -> rosrun pocketsphinx voice_teleop.py

此時會發現Terminal回覆您找不到voice_teleop.py的執行檔(又沒截到圖!)

去node資料夾用ll看一下,發現顏色不同

原來這個voice_teleop.py需要改權限,輸入 → chmod + x voice_teleop.py

誠如ptt上說的,顏色正確!!! 再key一次rosrun pocketsphinx voice_teleop.py

再再開啟Terminal → rosrun turtlesim turtlesim_node

哦哦哦! 可以動口不動手移動小烏龜啦!

 

重新寫一次step:

  1. roslaunch pocketsphinx voice_commands.launch
  2. rosrun pocketsphinx voice_teleop.py
  3. rosrun turtlesim turtlesim_node

但為什麼想要動口不動手呢? 因為之前演講完後,跟聽眾聊天時想到:假設長輩不小心跌倒,家裡又沒人時該怎麼辦?這個時候會移動的音箱就派上用場了!

說個語音指令 → call the police,這樣是不是很有用處呀!?

後來看到創客閣樓,台灣Maker界大神之一的Felix,做了一個台灣版Assistant kit,想想既然我們要做會移動的音箱,不如也來玩玩語音助理,所以就詢問了一下Felix大神,分享一些經驗,小的發現目前網上資料有些照著做都不會動了,還是得看Google的開發文件

 

有發現嗎?在Pi與Ubuntu和其他Linux platforms都能用耶~ 在這裡選Ubuntu Desktop或Other Linux-based platforms都可以

其實照著Tutorials基本上就能動,但只是「基本上」,我照著做還是不會動XD

查了很多文章才把一個奇怪的問題解決,所以還是把奇怪的事件記錄一下

 

首先您必需要有Google帳號,然後進入這裡

選擇Add/import project

我是取名叫作Sco Assistant,然後按下Create project

然後再進入這個地方,您會看到我的Icon變成”管理”,但一開始應該是啟動(還是打開)我忘了 XD

再來就是到這個地方,寫一些資料

哦哦!被大家發現我的E-mail,也沒差啦~都找的到我的FB了(審稿的小編幫Sco大大放FB連結,與大師交流要快啊!!),開放社群就是要找的到人嘛~XD 但如果您有問題要問我,請耐心等待,我通常只有小朋友睡了才有辦法回應訊息哦~

接下來回到這裡,進入剛才建立的名稱

在左側找到Device registration

輕鬆寫入您想到的好名字,按下REGISTER MODEL

再來就進入第二步的Downloard OAuth 2.0 credentials,好好的保存它

第三步就直接skip它吧 ~ 第二步比第三步還重要的

再來就是要Edit the model了,其實這裡重點是要抄下Model ID

您看我這邊嘔心瀝血建立如下,已可以看到Model ID

再點進去也可以修改,記得Model ID要 Copy到記事本裡面哦~

接下來要安裝許多套件,因為我的python是2.7版,所以是

1.sudo apt-get update

2.sudo apt-get install python-dev python-virtualenv

3.virtualenv env –no-site-packages

4.env/bin/python -m pip install –upgrade pip setuptools wheel

source env/bin/activate

 

如果您的python是3.x版,請服用

1.sudo apt-get update

2.sudo apt-get install python3-dev python3-venv

3.python3 -m venv env

4.env/bin/python -m pip install –upgrade pip setuptools wheel

source env/bin/activate

 

然後

5.sudo apt-get install portaudio19-dev libffi-dev libssl-dev libmpg123-dev

接下來用pip,如果您還沒安裝pip,以下提供二種方法

 

a、更新安裝

1.sudo apt-get update

2.sudo apt-get upgrade

3.sudo apt-get install python-pip(其實直接下這個command也行啦)

 

b、用easy-install安裝

1.sudo apt-get install python-setuptools python-dev build-essential

2.sudo easy_install pip

 

接下來回到安裝google assistant

6.python -m pip install –upgrade google-assistant-library

7.python -m pip install –upgrade google-assistant-sdk[samples]

8.python -m pip install –upgrade google-auth-oauthlib[tool]

 

接下來就是在前面說” 第二步的Downloard OAuth 2.0 credentials,好好的保存它”的那一步download下來的檔案,例如在我的Chrome是長的這個樣子

https://www.googleapis.com/auth/assistant-sdk-prototype \

–scope https://www.googleapis.com/auth/gcm \

–save –headless –client-secrets /path/to/client_secret_client-id.json

 

最後那一行就輸入下載檔案所在位置

如下圖

接著進入下圖黃框的網頁

然後google會說麻煩您用某一個帳號sign in,就選擇您常用的那個吧~

按下允許

然後您就會得到一組授權碼,先COPY一下~

回到Terminal貼上去,就把google的授權檔案存起來囉~

最後就是跑Sample Code

googlesamples-assistant-hotword –project_id my-dev-project –device_model_id my-model

 

還記得前面有請各位在記事本裡貼上Model ID嗎?

這個my-model就是Model ID

現在我們來找一下什麼是Project_ID,回到這裡,按下黃框的地方,就會出現目前專案的ID,這就是Project_ID,也一併貼上記事本吧~

在記事本內整理後,Command會長這樣,貼上Terminal!!!

googlesamples-assistant-hotword –project_id xxx –device_model_id xxx

 

接下來您可能比我還了解,對著MIC說出,Hey Google或OK Google吧!

 

本來覺得這一個google assistants是不需要寫的,但菜比巴小弟我就卡在找不到Project_ID與Model_ID,為了各位大神研究方便還是寫了下來,原來就是這麼輕鬆自在!!!

這樣Pi也可以做出簡易的智能音箱了!

 

玩著玩著想接回ROS,但卻發現一件事!Google還沒支援中文耶~

我是想要在/recognizer/output收到 ”打電話給警察” 而不是”call the police”

ROS如果想接中文語音,其實pocketsphinx也有中文包的,但⋯辨識能力⋯拿來當研究玩玩ok~

這個時候發現中文語音分析大廠科大訊飛威猛的不得了 ~

中研院/工研院應該也有啊!? 之前不是辦了一個與AI對話的競賽?怎麼找不到什麼可以讓Maker玩的呢!? 也許過一陣子吧~

而且科大訊飛不是在台灣發PR說要找合作對像嗎? 快來找我們Simple Care社群啊! 拜託!!!

 

曾經看過一篇文章! 台灣的軟體工程師都跑哪裡去了? 原來都藏在社群裡啦!!!

先研究一下科大訊飛~這時就想到我們Maker另一個大神柯大!改天要再與柯大聊一下LPWAN的串接方式! 但說實在的,做這個Simple Care專案讓我把台灣Maker界的大神又都串了一遍 XD

 

好了,回到用ROS測試科大訊飛

這次我們直接用古大寫好的package

 

下載到catkin_ws/src/robot_voice

進入robot_voice/src,此時我們需要改科大訊飛的APPID為你自已的

去一下科大訊飛首頁,申請一個帳號,然後再create一個新的應用(這裡就不教怎麼操作了,雖然是簡體中文,但很好懂的

然後就會得到APPID囉~ 如下圖被我槓掉的那個,按SDK下載

接著把robot_voice/src下的三個.cpp檔案裡,把APPID全改為自已的

以iat_publish.cpp為例,把appid改為自已的

然後回到catkin_ws key -> catkin_make

 

開4個Terminal

  1. roscore
  2. rosrun robot_voice iat_publish
  3. rostopic echo /voiceWords
  4. rostopic pub /voiceWakeup std_msgs/String “data: ‘any string’”

 

如果有出現Error Code,可參閱訊飛的error code chart

 

下圖左的紅框就是中文語音輸入,一開始我其實是在說hey google與ok google,後來才說你好,哈囉,吃飽沒?

現在可以用中文語音控制了! 小弟看過2016~2017年ROS串接訊飛的許多文章,包括indigo與kinetic的連接方式,經過測試後,只有古大的package下載到catkin_ws/src再改APPID,然後catkin_make就完成,其他的都要修改一堆Error Code啊!!! 真的是欺負我是ROS的菜比巴小弟啊!

好的! 我們終於玩到語音控制這部分了~ 其實在2017年底接觸了定位廠商,當初提到可以把SLAM那部份的APP讓Simple Care社群朋友試試,但很可惜最後沒談成,所以只好自已硬學ROS的SLAM。

 

如今為南科AI_ROBOT自造基地寫了五篇ROS快速入門,有學又有得玩,真的很感謝當初沒合作成功的廠商,有時候一時失利也不見得是壞事,這或許就是因禍得福,讓目前整體架構愈來愈接近先前演講提到的小車車了。

 

眼尖的朋友會發現車上有一個CAMERA?沒錯! 這就是上一篇所講的ROS影像視覺。有沒有發現這四篇的寫法都很鄉民!?之前KNN室內定位用文言文寫反應超熱烈,一個月後完全看不懂自已在寫什麼,所以就用改為鄉民文寫囉~

 

打算寫完這五篇ROS快速入門後,再嘗試ROS硬體實作文章,到時再用其他文體寫大家會不會暈到囉~

想跟我們一起開發到暈倒嗎? 加入我們吧~

Simple Care – 開放長照智慧系統 !

 

歡迎加入智慧醫療主題論壇:https://goo.gl/aNBkuN

(作者:智慧醫療主題論壇版主Sco;責任編輯:葉佳錚)

 

ROS系列教學文:

【知識教學文】一起走進ROS的世界吧!-Part1

【知識教學文】一起走進ROS的世界吧!- Part2

【知識教學文】一起走進ROS的世界吧!- Part3

【知識教學文】一起走進ROS的世界吧!- Part4

No Comments

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料