【Tutorial】一起走進 ROS 的世界吧(5) - 語音辨識篇

作者:Sco Lin

前面寫了四篇 ROS 心得文章之後,這篇也繼續以 ROS 玩一些有趣的實驗分享給大家。由於之前演講時,有提到 Simple Care 想做一台聽得懂人話的小車,類似可以移動的智能音箱,不過為什麼會有這個想法呢?

首先,當然是因為室內定位需要先做 SLAM,那不如就做個小車來 SLAM;再來是我家的三房兩廳存在高低落差,這也是為什麼廠商在賣掃地機器人時,會非常強調機器人的脫困能力,但我們又沒有要做掃地機器人,只是需要具備移動 SLAM、語音辨識、影像辨識等功能而已,那麼就做成遙控器汽車的樣子就好啦!

試想,您以前玩的遙控器汽車的脫困能力會比掃地機器人差嗎?還不是能爬上爬下,連公園的溜滑梯都能看到它的蹤跡。

試試 pocketsphinx,玩玩語音辨識

1. 安裝所需 package:

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

2. 安裝 libsphinxbase1:

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

3. 安裝 libpocketsphinx1:

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

4. 安裝 gstreamer0.10-pocketsphinx:

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

5. 接著進入:

cd ~/catkin_ws/src

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

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

pocketsphinx 的資料夾

6. 下載英文語音包

進入 sudo dpkg -i pocketsphinx-hmm-en-tidigits_0.8-5_all.deb 安裝英文語音包

7. 進入 pocketsphinx 建立一個 model 目錄:

於 pocketsphinx 建立一個 model 目錄

8. 拷貝 pocketsphinx-hmm-en-tidigits_0.8-5_all.deb 到 model 之下;解壓縮後,進入 pocketsphinx-hmm-en-tidigits_0.8-5_all 資料夾解壓縮 data.tar.xz,會出現一個 usr 資料夾。

解壓縮 data.tar.xz 後會出現一個 usr 資料夾

9. 再進去 /usr/share/pocketsphinx/model ,將 hmm 與 lm 全部複製。

複製 hmm 與 lm

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

刪除其餘資料夾

MIC 測試

我使用的是小米運動藍芽耳麥,輸入指令 roslaunch pocketsphinx robocup.launch 後,出現了錯誤:

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

1. 首先要修改 recongnizer.py:

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

2. 增加以下 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 起來沒什麼問題,但後來自行增加語音辨識字詞時卻出現問題,所以最後還是改回去了。(您也許會在網路上看到有人直接把語言包的絕對路徑寫進去,但也有些人沒寫。)

最後則會變成:

3. 接著編輯 pocketsphinx/demo/robocup.launch

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

4. 接下來就可以 roslaunch pocketsphinx robocup.launch

開個 Terminal -> echo /recognizer/output,進去 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

5. 請到這裡選取您的 commands.txt 檔案,再按「COMPILE KNOWLEDGE BASE」

6. 直接下載壓縮檔

將它解壓,並全部改名為 commands

再將所有檔案全丟至 pocketsphinx/config 資料夾內。

7. 請到這裡下載 hub4wsj_sc_8k.tar.gz :

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

接著用 gedit 做一個 launch 檔,取名為 voice_commands.launch

8. 先開 Terminal ->roslaunch pocketsphinx voice_commands.launch,再開 Terminal -> rostopic echo /recognizer/output,然後看看語音辨識的結果,在這裡我講了「back」:

或是加速「speed」:

 

好啦~前一篇【Tutorial】一起走進 ROS 的世界吧(4) — 視覺辨識篇有教過大家用「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

實戰語音助理

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

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

其實照著 Tutorials 基本上就能動,但只是「基本上」,我照著做還是不會動,查了很多文章才把一個奇怪的問題解決,所以還是來把奇怪的事件記錄一下:

1. 首先您必需要有 Google 帳號,然後進入這裡,選擇 Add/import project

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

2. 進入這個地方,您會看到我的 Icon 變成「管理」,但一開始應該是啟動(或是打開)

3. 再來就到這個地方,寫一些資料(哦哦!被大家發現我的 E-mail,也沒差啦~都找得到我的 FB 了,開放社群就是要找得到人嘛!但如果您有問題要問我,請耐心等待,我通常只有等小朋友睡了才有辦法回覆訊息哦!)

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

在左側找到 Device registration:

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

5. 下載 OAuth 2.0 credentials

6. 按下「Skip」

7. Edit the model,其實這裡的重點是要抄下 Model ID

再點進去也可以修改,記得要將 Model ID 複製到記事本裡面哦!

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

  • sudo apt-get update
  • sudo apt-get install python-dev python-virtualenv
  • virtualenv env –no-site-packages
  • env/bin/python -m pip install –upgrade pip setuptools wheelsource env/bin/activate

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

  • sudo apt-get update
  • sudo apt-get install python3-dev python3-venv
  • python3 -m venv env
  • env/bin/python -m pip install –upgrade pip setuptools wheelsource env/bin/activate

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

9. 接下來用 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

10. 然後回到安裝 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]

接著就是前面所說的下載 OAuth 2.0 credentials,請好好保存下載的檔案,例如在我的 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

11. 最後那一行就輸入下載檔案的所在位置,如下圖所示:

接著進入下圖黃框的網頁:

12. Google 會請您用某一個帳號登入:

按下「允許」

您會得到一組授權碼,請先複製下來

13. 回到 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

14. 接下來的步驟您可能比我還了解:請對著 MIC 說出「Hey Google 」或是「OK Google」!

本來覺得這一個 google assistants 是不需要寫的,但菜比巴小弟我就卡在找不到 Project_ID 與 Model_ID,因此為了各位大神研究方便,就還是寫了下來,沒想到這麼輕鬆自在!這樣的話 Pi 也可以做出簡易智能音箱了!

玩著玩著想接回 ROS,但卻發現一件事:Google 還沒支援中文耶~我是想要在 /recognizer/output 收到「打電話給警察」而不是「call the police」,ROS 如果想接中文語音,其實 pocketsphinx 也出中文包的,但它的辨識能力……可能比較適合拿來當作研究玩玩而已。

這時發現中文語音分析大廠科大訊飛威猛得不得了!而且它不是在台灣發 PR 說要找合作對象嗎?快來找我們 Simple Care 社群啊!中研院/工研院應該也有啊?之前不是辦了一個與 AI 對話的競賽?怎麼找不到什麼可以讓 Maker 玩的呢?也許還要再過一陣子吧!

曾經看過一篇文章,提到台灣的軟體工程師都跑哪裡去了? 原來都藏在社群裡啦!先研究一下科大訊飛~這時就想到我們 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。目前整體架構愈來愈接近先前演講提到的小車車了!

眼尖的朋友會發現車上有一個 CAMERA?沒錯!這就是上一篇所講的 ROS 影像視覺囉!

(本文轉載自南科 AI_ROBOT 自造基地原文連結;責任編輯:賴芳如)

Ches拔(Sco Lin)

兩個男孩的爸爸、下班變身孩子王、衝浪閱讀與coding、PM擔當RD魂。
Ches拔(Sco Lin)

Author: Ches拔(Sco Lin)

兩個男孩的爸爸、下班變身孩子王、衝浪閱讀與coding、PM擔當RD魂。

Share This Post On

2 Comments

  1. 請問在使用 Terminal ->roslaunch pocketsphinx voice_commands.launch 指令後會出現
    raise ResourceNotFound(name, ros_paths=self._ros_paths)
    ResourceNotFound: pocketphinx
    ROS path [0]=/opt/ros/kinetic/share/ros
    ROS path [1]=/home/airobotschaos/catkin_ws/src
    ROS path [2]=/opt/ros/kinetic/share
    的錯誤訊息該怎麼辦?

    Post a Reply
    • Yu Cheng 您好:
      可以加入我們MakerPRO的社群,在裡頭,有許多厲害的Maker們可以為您解答與討論
      謝謝您的提問

      MakerPRO 編輯部

      Post a Reply

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *