學習輕鬆應用 ROS 機器人作業系統的技術 – ROS 與語音辨識

一、 ROS 1.0 與語音辨識學習前注意事項

在開始閱讀本篇文章前,請先確保下列事項:

本文章範例將會有樹莓派的 Terminal gif動畫與筆電的 gif動畫,分辨方式為查看開頭的使用者帳戶與實體主機名稱,如下兩張圖與紅框所示

樹莓派的 Terminal 示意圖

筆電的 Terminal 示意圖

若上述事項已準備就緒,便可以開始閱讀下列的教學文章囉 !

二、 ROS 1.0 基本介紹

在本篇文章中我們將可以了解到

  1. 如何使用樹莓派原生系統 Raspbian 安裝 ROS 1.0 – Kinetic 版本
  2. 建置使用語音辨識時的工作環境
  3. 即使使用不同的作業系統操作 ROS 1.0,依舊能夠完成多機通訊操作
  4. 使用基於語音辨識系統 Sphinx 的 ROS package , 「 pocketsphinx 」,完成語音辨識
  5. 利用語音辨識結果與ROS 1.0,遠端操控 ROS 1.0 tutorial 中的 turtlesim

確認上列事項皆已完成後,我們便可以開始進行本篇文章的教學囉!

早在電腦發明之前,自動語音辨識的設想就已經被提上了議事日程,早期的聲碼器可被視作語音辨識及合成的雛形。

而語音辨識技術的最重大突破是 「 隱馬爾科夫模型( Hidden Markov Model )」的應用。現今大多數的語音辨識或多或少都與隱馬爾科夫模型的應用有關。

因此本篇文章我們將使用由卡內基梅隆大學的李開復教授,基於隱馬爾科夫模型的大詞彙量語音辨識系統 「 Sphinx 」,搭配ROS系統來完成語音辨識的功能囉!

本篇文章將使用樹莓派與 ReSpeaker 4-Mic Array for Raspberry Pi 來完成語音辨識的功能 ; 並使用 ROS1.0 系統的多機通訊功能,操控遠端電腦的小烏龜。

關於本篇教學文章中,所使用的樹莓派與 ReSpeaker 4-Mic Array for Raspberry Pi

詳細資訊可點選下列使用源見圖片參考樹莓派 Modul 3B 電源包ReSpeaker 4-Mic Array for Raspberry Pi

ROS 1.0系統較為困難的操作之一,便是「開發環境的建置」。因此在前幾篇教學文章中我們多採用 Ubuntu 作業系統來安裝,這是因為 ROS 與 Ubuntu系統相容性最高,也最容易安裝。然而,在這次我們使用的 Respeaker 4-Mic Array for Raspberry Pi ( 以下皆簡稱為 respeaker ) ,目前為止並不支援 Ubuntu-mate 16.04 系統 。

因此若是想利用 ROS1.0系統 與 respeaker 完成語音辨識,勢必將須使用另一外套作業系統。剛好截至目前為止,創客萊吧Makerlab 被多次詢問二個問題:

  1. 是否可以在別的作業系統,安裝 ROS 1.0 ?
  2. 若是以不同作業系統來操作 ROS 1.0,是否依然可以完成多機通訊的操作?

三、 ROS 1.0 與語音辨識執行功能介紹

接下來,我們將透過本篇的 ROS 1.0 與語音辨識的教學文章,回答大家兩個問題吧!

我們將執行 8個步驟,來執行 ROS 1.0 與 語音辨識的功能,分別為

  1. 在 Raspbian作業系統 中 安裝 ROS1.0 系統
  2. 下載開源專案 smart_robot
  3. 下載與安裝開源專案 smart_robot 的依賴
  4. 建立開源專案 smart_robot 的 ROS 1.0 工作空間
  5. 關閉樹梅派,並安裝 respeaker 硬體
  6. 設定樹梅派抓取 Respeaker 硬體
  7. 使用 ROS 1.0 進行語音辨識
  8. 使用 ROS 1,0 與語音辨識,控制 turtlesim

1. 在 Raspbian作業系統中 安裝 ROS1.0系統

要在 Raspbian 作業系統中,安裝 ROS 1.0 之前,請確保樹莓派中的Raspbian 系統為 2018年11月13日所發行的版本,此為本篇教學中所使用的 Raspbian 作業系統版本,詳見下圖( 點擊圖片進入下載網址 )Raspbian 作業系統版本

確認好 Raspbian 系統的版本後,接下來便可以安裝 ROS 1.0 – Knietic 版本了。

若是熟悉 Linux系統的朋友,可以照下列網址的安裝步驟自行安裝:

若是不熟悉 Linux 作業系統的朋友,可依照下列步驟,安裝 ROS 1.0 – Knietic 版本。

1-1 樹莓派的 Raspbian 作業系統開啟 Terminal後 ,使用 apt套件安裝 git 套件

Ø sudo apt-get install git

指令輸入 – 使用 apt 套件下載與安裝 git 版本控制器

由於小編先前已在樹莓派的 Raspbian作業系統上安裝過 git 版本控制器,因此上方的動畫呈現的是已經安裝的動畫。

1-2 下載開源專案 smart_robot

指令輸入 – 利用 git本版控制器下載開源專案 smart_robot

1-3 執行 ROS_PI_kinetic_install.sh 腳本

這裡需要注意的是,因為 Raspbian作業系統的源倉庫中,並沒有 ROS 1.0 相關的安裝套件 ( 也就是無法使用 sudo apt-get install ros-kinetic-desktop-full 安裝 ROS 1.0 )。因此,我們是透過 python 中的 rosinstall 套件產生下載 ROS-kinetic 相關套件的連結,再使用 python 中的 wstool 套件來管理ROS-kinetic 相關套件的連結,決定是否下載該套件的原始碼。

最後,再透過Cmake 系統,將剛剛下載的 ROS kinetic 相關套件原始碼,進行編譯與安裝。在此編譯與安裝過程中,因為樹莓派本身硬體限制,無法一次執行多個編譯與安裝任務,因此我們在 make 的選項後面 , 加入「 -j1 」 的參數選項 ,即告知樹莓派請一次執行一個編譯或安裝,因此此步驟將會執行 3 ~ 5 小時不等的時間。

請務必確保樹莓派是使用變壓器供給電源與散熱充足的情況下,再輸入下列的指令,開始安裝 ROS 1.0 – kinetic 版本。

Ø source ~/smart_robot/ROS_PI_kinetic_install.sh

指令輸入 – 執行 ROS_PI_kinetic_install.sh 腳本

執行完 「ROS_PI_kinetic_install.sh」腳本後,Raspbian作業系統便會開始自行安裝 ROS 1.0 – kinetic 桌面完整安裝版本。2. 下載開源專案 smart_robot

當 ROS 1.0 – kinetic 版本安裝完成後,便可以下載CIRCUS Pi 的開源專案(連結) , smart_robot。如果樹莓派已經在安裝步驟下載過開源專案 smart_robot的朋友,便可以直接進入 step3。還沒下載的朋友可以依照 1-1 、 1-2 步驟下載。

若是想要進行 ROS 1.0 系統的多機通訊操作,也請務必在主控電腦端( 已安裝完成 Ubuntu 作業系統與 ROS 1.0 -kinetic 版本 ),下載開源專案 smart_robot。 3. 下載與安裝開源專案 smart_robot 的 依賴

在執行開源專案 smart_robot前,我們需要下載與安裝相關的依賴。

需要注意的是,因為依賴眾多的原因加上在使用 Cmake 系統的時候,我們設定的參數選項為 「 -j1 」( 詳細解說請查看 1-3 步驟 )。因此請確保樹梅派是使用變壓器供給電源與散熱充足的情況下,再執行下載與安裝依賴的腳本。

在樹莓派端需要執行的是「dependencies_for_smartRobot_pi_ws_tools.sh」腳本檔案。

Ø source ~/smart_robot/dependencies_for_smartRobot_pi_ws_tools.sh

指令輸入 – 樹莓派下載安裝開源專案 smart_robot 的依賴

當然,若是想要進行 ROS 1.0 多機通訊操作,也請務必在筆電端下載安裝開源專案 smart_robot 相關的依賴。

在筆電端需要執行的是「dependencies_for_laptop.sh」腳本檔案。

Ø source ~/smart_robot/dependencies_for_laptop.sh

指令輸入 – 筆電端下載安裝開源專案 smart_robot 的依賴

到目前為止,在樹莓派原生系統 Raspbian作業系統中, 配置 ROS 1.0 – kinetic 版與執行開源專案 smart_robot 的工作環境終於完成了! 4. 建立 開源專案 smart_robot 的 ROS 1.0 工作空間

當開源專案 smart_robot 所需要的工作環境建立完成後,我們便可以開始構建該專案的 ROS 1.0 工作空間了,請輸入下列指令

Ø cd ~/smart_robot/catkin_ws && catkin_make -j1

指令輸入 – 構建開源專案 smart_robot 工作空間

由於 開源專案 smart_robot 擁有的 package較少,因此即使以 [ -j1 ] 的參數選項來構建 ROS 1.0 工作空間,也不會耗費太多時間 。 5. 關閉樹梅派,並安裝 respeaker 硬體

當開源專案 smart_robot 相關的工作環境、工作空間都就緒後,我們就可以先將樹梅派關機。確保樹梅派無任何外部電源供電後,便可以將 respeaker 安裝至樹莓派。安裝方法非常簡單,只要將 respeaker 的母座,對準樹莓派所有GPIO 的腳位後,再輕輕地安裝上去即可。

樹梅派 GPIO腳位 與 Respeaker 母座 ( 紅框處 )

Respeaker 安裝至樹莓派後的示意圖6. 設定樹莓派抓取 Respeaker 硬體

6-1 查詢樹莓派的音效卡和數位音訊設備

Respeaker 安裝完成後,接下來是韌體端的設定了。將樹梅派啟動後,開啟 Terminal 並輸入下列指令查找目前的音效卡和數位音訊設備(錄音):

Ø arecord -l

指令輸入 – 查詢音效卡和數位音訊設備(錄音)

輸入指令後,便會出現關於樹梅派本身所搭載的音效卡和數位音訊設備(錄音)相關資訊。這裡我們需要紀錄的是 card 的編號與 device的編號。

音效卡和數位音訊設備資訊(錄音)

如上圖所示,在本篇文章教學中,respeaker 的card 的編號為 1 ,device 的編號為0。

我們也順便查找一下音效卡和數位音訊設備(播放)的相關設備資訊,以便之後可以直接自行開發 Google 的 語音助理相關功能:

指令輸入 – 查詢音效卡和數位音訊設備(播放)

輸入指令後,便會出現關於樹梅派本身所搭載的音效卡和數位音訊設備(播放)相關資訊。同樣地我們需要紀錄的是 card 的編號與 device的編號,我們選擇樹梅派本身就具有的 3.5 mm jack 作為播放聲音的設備(下圖紅框的編號 )。

音效卡和數位音訊設備資訊(播放)

6-2 配置 ~/.asoundrc 文件,讓樹梅派抓取音效卡和數位音訊設備

紀錄好錄音與播放的 card 與 device 編號後,接著我們需要告知樹莓派使用這一組編號作為預設的使用編號。相關的設定指令如下圖所示:

設定音效卡和數位音訊設備指令

這裡需要注意的是紅框部分,在 mic 部分需要替換成剛剛記錄 respeaker 的 card 編號與 device 編號 ;在 speaker 部分需要替換成剛剛紀錄 3.5 mm – jack 的 card 編號與 device 編號。

請輸入下列指令新增並修改 ~/.asoundrc 文件( 此篇教學文章使用 vim 作為文字編輯器 ),將設定音效卡和數位音訊設備指令輸入至此文件。

Ø sudo vim ~/.asoundrc

輸入指令 – 新增並修改 ~/.asoundrc 文件

因小編的樹莓派已經有新增並修改過 ~/.asoundrc 文件,因此上面的 gif 動畫顯示的結果是已經配置好設定指令的畫面,若是第一次輸入指令的朋友呈現的應該會是空白的畫面。小編在此將配置完成後的結果截圖至下方

配置完成 ~/.asoundrc 文件的畫面

配置好 ~/.asoundrc 文件後,便可以存檔關閉並重新啟動樹莓派,讓樹梅派在開機時自動讀取該文件的設定,使得 respeaker 能夠發揮作用。

  • 還有很重要的一點是,此配置方法是 Linux 作業系統的配置方法,因此不僅僅在 Raspbian 作業系統可以使用,在 Ubuntu 作業系統上也依然可以使用。因此我們也可以在筆電上用此種方法配置好關於錄音與播放所想要使用的設備。

7. 使用 ROS 系統進行語音辨識

7-1 配置 ROS 1.0 多機通訊架構

詳細的配置方法請參照: 輕鬆應用 ROS 機器人作業系統的技術 – 理解 ROS 1.0 訊息傳遞方式(下)

這篇文章有詳細地介紹該如何配置 ROS 1.0 的多機通訊方法。

若是不想使用ROS 1.0 多機通訊,則第7、第8所有步驟皆可在樹莓派端中執行。

7-2 筆電向網域註冊 Master

本篇文章教學範例中,使用筆電向網域註冊 Master,請在可操作 ROS1.0 系統的筆電上開啟 Terminal ,並輸入下列指令用以註冊 Master

Ø roscore

輸入指令 – 筆電向網域註冊 Master

7-3 樹梅派執行 「 pocketsphinx.launch 」文件

在開源專案 smart_robot 中,有著由 github上的作者 UTNuclearRoboticsPublic 所改編而來的 ROS 1.0 Package – 「pocketsphinx」。這個 Package 便是使用語音辨識系統 Sphinx 的模型,來實現語音辨識。因此我們僅需要執行 pocketsphinx.launch 的文件,便可以開啟語音辨識的功能了。請在樹莓派端輸入下列指令執行「 pocketsphinx.launch 」文件:

Ø roslaunch pocketsphinx pocketsphinx.launch

輸入指令 – 樹莓派端執行pocketsphinx.launch 文件

7-4 查看語音辨識結果

由於 sphinx 語音辨識模型是以本地資料庫來交叉比對測試者的語音,

因此我們需要先知道該模型可辨識的關鍵字詞與資料庫所擁有的資料,

才能說出正確的字詞,讓樹莓派辨識語音結果。

關鍵字詞與資料庫皆存放在 pocketsphinx/vocab/hub4wsj_sc_8k 資料夾

裡,如下圖所示

/pocketsphinx/vocab/hub4wsj_sc_8k 資料夾內容

其中,「 voice_cmd.dic 」存放的便是語音資料庫 ; 「 voice_cmd.kwlist 」存放的是關鍵字詞。

我們可以開啟 「 voice_cmd.kwlist 」,查看目前有哪些關鍵字詞可供辨認。

voice_cmd.kwlist內的關鍵字詞

當知道有那些關鍵字詞可供辨認後,我們便可以查看此時ROS 1.0系統中的topic : /pocketsphinx_recognizer/output ,來查看樹莓派是否真的能夠辨識出我們所說的關鍵字

在筆電的 Terminal 上,輸入下列指令查看該 topic的資料,此資料便是語音辨識的結果

輸入指令 – 查看語音辨識結果

由於我們使用的 sphinx 語音辨識模型是以外國人士的聲學模型,

所建立的語音辨識模型。因此在實測時可以發現,對於並非以英文為母語

的測試者,辨識的準確率實際上並不高。若是想自行更換關鍵字詞與資料庫,

可至該網站自行下載: 

神經網路的語音模型下載連結 8. 語音控制 turtlesim

請確保 第 7 步驟已順利執行,且可辨認「 go 、stop 、back、left、right 」 等簡單詞彙後,

我們便可以控制 turtlesim囉 !

首先請在筆電端開啟terminal ,並執行開啟turtlesim的指令

Ø rosrun turtlesim turtlesim_node

輸入指令 – 開啟 turtlesim

當小烏龜出現後,我們便可以在樹莓派端,執行節點 「 voice_control_turtlesim 」 ,

用語音控制小烏龜囉 !

輸入指令 – 執行節點 voice_control_turtlesim

執行完畢後,我們便可以將開啟小烏龜的 terminal 與 執行

voice_control_turtlesim 並排呈現,開始使用語音控制小烏龜囉 !

本篇文章的語音辨識教學到此告一個段落囉 ! 相信大家應該在操作過程中,

不知不覺地解決了本文章一開始提及的兩個問題:

Q1. 是否可以在別的作業系統,安裝 ROS 1.0 ?

A1:本篇文章中已教導大家如何在 Raspbian作業系統中安裝 ROS 1.0囉!

Q2. 若是以不同作業系統來操作 ROS 1.0,是否依然可以完成多機通訊的操作?

A2:本篇文章中,我們成功的在擁有 Ubuntu 16.04 作業系統的筆電上,透過 ROS 1.0 系統,接收來自 Raspbian 作業系統的樹莓派語音辨識結果囉!

因為 smart_robot 是一個藉由眾人的力量所完成的開源專案,所以也歡迎大

家自行修改裡面的程式碼,完成屬於自己的機器人囉 !

創客萊吧 Makerlab 在這裡也幫助大家將一台可以自行開發語音辨識的機器人

套件 – 「 智慧機器人 」整理好囉 ! 有興趣的朋友們也可以點擊下方圖片,

將智慧機器人帶回家,開始自行改造成可以語音控制的機器人吧
( 小編正在自行改造成「可語音控制的掃地機器人」~ ) !
擁有語音模組、超音波、鏡頭的機器人 – 智慧機器人