【自造DIARY】如何使用 ROS 1.0 完成語音辨識功能

作者:創客萊吧 MakerLab

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

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

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

樹莓派的 Terminal 示意圖(左)、筆電的 Terminal 示意圖(右)(圖片來源:創客萊吧提供)

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

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

  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 來完成語音辨識的功能;並使用 ROS 1.0 系統的多機通訊功能,操控遠端電腦的小烏龜。

本篇文章使用的樹梅派 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 系統 。

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

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

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

1. 在 Raspbian 作業系統 中 安裝 ROS 1.0 系統

要在 Raspbian 作業系統中,安裝 ROS 1.0 前,請確保樹莓派中的 Raspbian 系統為 2018 年 11 月 13 日所發行的版本。

本篇教學所使用的 Raspbian 作業系統版本(圖片來源:創客萊吧提供)

確認 Raspbian 系統的版本後,接下來便可以安裝 ROS 1.0 – Knietic 版本了。熟悉 Linux 系統的朋友,可以依照此網址的安裝步驟自行安裝;若是不熟悉 Linux 作業系統的朋友,可依照下列步驟,安裝 ROS 1.0—Knietic 版本。

  • 樹莓派的 Raspbian 作業系統開啟 Terminal 後 ,使用 apt 套件安裝 git 套件;Ø sudo apt-get install git。

指令輸入—使用 apt 套件下載與安裝 git 版本控制器(圖片來源:創客萊吧提供)

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

  • 下載開源專案 smart_robot

指令輸入—利用 git本版控制器下載開源專案 smart_robot(圖片來源:創客萊吧提供)

  • 執行 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 小時不等的時間。

請務必確保樹莓派是使用變壓器供給電源且散熱充足的情況下,再輸入指令 Ø source ~/smart_robot/ROS_PI_kinetic_install.sh,開始安裝 ROS 1.0 – kinetic 版本。

指令輸入—執行 ROS_PI_kinetic_install.sh 腳本(圖片來源:創客萊吧提供)

執行完「ROS_PI_kinetic_install.sh」腳本後,Raspbian 作業系統便會開始自行安裝 ROS 1.0—kinetic 桌面完整安裝版本。

2. 下載開源專案 smart_robot

當 ROS 1.0 – kinetic 版本安裝完成後,便可以下載創客萊吧 Makerlab 的開源專案—smart_robot;如果樹莓派已經在安裝步驟下載過開源專案 smart_robot 的朋友,可以直接進入步驟 3;還沒下載的朋友可以依照步驟 1 下載。

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

3. 下載與安裝開源專案 smart_robot 的依賴

在執行開源專案 smart_robot 前,我們需要下載與安裝相關的依賴。需要注意的是,因為依賴眾多的原因,加上在使用 Cmake 系統的時候,我們設定的參數選項為「-j1」,因此請確保樹莓派是使用變壓器供給電源與散熱充足的情況下,再執行下載與安裝依賴的腳本。

在樹莓派端需要執行的是「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 硬體

  • 查詢樹莓派的音效卡和數位音訊設備

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

指令輸入—查詢音效卡和數位音訊設備(錄音)(圖片來源:創客萊吧提供)

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

音效卡和數位音訊設備資訊(錄音)(圖片來源:創客萊吧提供)

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

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

指令輸入—查詢音效卡和數位音訊設備(播放)(圖片來源:創客萊吧提供)

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

音效卡和數位音訊設備資訊(播放)(圖片來源:創客萊吧提供)

  • 配置 ~/.asoundrc 文件,讓樹莓派抓取音效卡和數位音訊設備

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

設定音效卡和數位音訊設備指令(圖片來源:創客萊吧提供)

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

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

輸入指令—新增並修改 ~/.asoundrc 文件(圖片來源:創客萊吧提供)

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

配置完成 ~/.asoundrc 文件的畫面(圖片來源:創客萊吧提供)

配置好 ~/.asoundrc 文件後,便可以存檔關閉並重新啟動樹莓派,讓樹莓派在開機時自動讀取該文件的設定,使 respeaker 能夠發揮作用。這邊很重要的一點是,此配置方法是 Linux 作業系統的配置方法,在 Raspbian 作業系統及 Ubuntu 作業系統都可使用,另外也可以在筆電上用此種方法配置好關於錄音與播放所想要使用的設備。

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

  • 配置 ROS 1.0 多機通訊架構

詳細的配置方法請參照 ROS 1.0 訊息傳遞方式教學(下),文章中有詳細介紹該如何配置 ROS 1.0 的多機通訊方法。若是不想使用 ROS 1.0 多機通訊,則第 7、第 8 的所有步驟皆可在樹莓派端中執行。

  • 筆電向網域註冊 Master

本篇文章教學範例中,使用筆電向網域註冊 Master,請在可操作 ROS 1.0 系統的筆電上開啟 Terminal ,並輸入指令 Ø roscore 以註冊 Master。

輸入指令—筆電向網域註冊 Master(圖片來源:創客萊吧提供)

  • 樹莓派執行「pocketsphinx.launch」文件

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

輸入指令—樹莓派端執行pocketsphinx.launch 文件(圖片來源:創客萊吧提供)

  • 查看語音辨識結果

由於 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 並排呈現,開始使用語音控制小烏龜囉!

小結

本篇文章的語音辨識教學到此告一個段落,我們教導大家如何在 Raspbian 作業系統中安裝 ROS 1.0,並成功在擁有 Ubuntu 16.04 作業系統的筆電上,透過 ROS 1.0 系統,接收來自 Raspbian 作業系統的樹莓派語音辨識結果,相信大家在操作過程中,應該一步步解決了文章一開始提及的兩個問題。

另外,由於 smart_robot 是一個藉由眾人的力量所完成的開源專案,所以也歡迎大家自行修改裡面的程式碼,完成屬於自己的機器人!

(本文轉載自創客萊吧原文連結;責任編輯:賴佩萱)

創客萊吧MakerLab

創客萊吧MakerLab

分享有趣的創作與教學,提供Maker們創作的軍火庫,DIY 零件 | 套件| 工具。
創客萊吧MakerLab

Author: 創客萊吧MakerLab

分享有趣的創作與教學,提供Maker們創作的軍火庫,DIY 零件 | 套件| 工具。

Share This Post On
468 ad

Submit a Comment

你的電子郵件位址並不會被公開。 必要欄位標記為 *