【自己動(dòng)手做一臺(tái)SLAM導(dǎo)航機(jī)器人】第七章:語音交互與自然語言處理

本專欄目錄:
第七章:語音交互與自然語言處理
附錄A:用于ROS機(jī)器人交互的Android手機(jī)APP開發(fā)
附錄B:用于ROS機(jī)器人管理調(diào)度的后臺(tái)服務(wù)器搭建
附錄C:如何選擇ROS機(jī)器人平臺(tái)進(jìn)行SLAM導(dǎo)航入門
視頻教程
https://www.bilibili.com/video/BV1jS4y1a7Lz
這一章將進(jìn)入機(jī)器人語音交互的學(xué)習(xí),讓機(jī)器人能跟人進(jìn)行語音對(duì)話交流。這是一件很酷的事情,本章將涉及到語音識(shí)別、語音合成、自然語言處理方面的知識(shí)。本章內(nèi)容:
1.語音交互相關(guān)技術(shù)
2.機(jī)器人語音交互實(shí)現(xiàn)
3.自然語言處理云計(jì)算引擎

下面這本書是本篇文章的參考文獻(xiàn),大家有需要可以入手一本:


1.語音交互相關(guān)技術(shù)
要機(jī)器人能完成跟人對(duì)話,涉及到語音識(shí)別、語音合成、自然語言處理等技術(shù)。簡(jiǎn)單點(diǎn)說,語音識(shí)別就是將人的聲音轉(zhuǎn)換成文字便于機(jī)器人計(jì)算與理解;語音合成就是將機(jī)器人要說的文字內(nèi)容轉(zhuǎn)換為聲音;自然語言處理相當(dāng)于機(jī)器人的大腦,負(fù)責(zé)回答提問。整個(gè)語音交互的過程,如圖1。

1.1.語音識(shí)別
語音識(shí)別技術(shù),也被稱為自動(dòng)語音識(shí)別Automatic Speech Recognition(ASR),其目標(biāo)是將人類的語音中的詞匯內(nèi)容轉(zhuǎn)換為計(jì)算機(jī)可讀的輸入,例如按鍵、二進(jìn)制編碼或者字符序列,如圖2。

語音識(shí)別技術(shù)所涉及的領(lǐng)域包括:信號(hào)處理、模式識(shí)別、概率論和信息論、發(fā)聲機(jī)理和聽覺機(jī)理、人工智能等等。語音識(shí)別技術(shù)的最重大突破是隱馬爾科夫模型Hidden Markov Model的應(yīng)用。從Baum提出相關(guān)數(shù)學(xué)推理,經(jīng)過Labiner等人的研究,卡內(nèi)基梅隆大學(xué)的李開復(fù)最終實(shí)現(xiàn)了第一個(gè)基于隱馬爾科夫模型的非特定人大詞匯量連續(xù)語音識(shí)別系統(tǒng)Sphinx。此后嚴(yán)格來說語音識(shí)別技術(shù)并沒有脫離HMM框架。當(dāng)然神經(jīng)網(wǎng)絡(luò)方法是一種新的語音識(shí)別方法,人工神經(jīng)網(wǎng)絡(luò)本質(zhì)上是一個(gè)自適應(yīng)非線性動(dòng)力學(xué)系統(tǒng),模擬了人類神經(jīng)活動(dòng)的原理,具有自適應(yīng)性、并行性、魯棒性、容錯(cuò)性和學(xué)習(xí)特性,其強(qiáng)的分類能力和輸入-輸出映射能力在語音識(shí)別中都很有吸引力。但由于存在訓(xùn)練、識(shí)別時(shí)間太長(zhǎng)的缺點(diǎn),目前仍處于實(shí)驗(yàn)探索階段。
1.2.語音合成
語音合成是語音識(shí)別的逆過程,也稱為文字轉(zhuǎn)語音(TTS),它是將計(jì)算機(jī)自己產(chǎn)生的、或外部輸入的文字信息轉(zhuǎn)變?yōu)榭梢月牭枚?、流利的漢語或其他口語輸出的技術(shù)。如圖3。

TTS過程包括這些步驟:語言處理,在文語轉(zhuǎn)換系統(tǒng)中起著重要的作用,主要模擬人對(duì)自然語言的理解過程,文本規(guī)整、詞的切分、語法分析和語義分析,使計(jì)算機(jī)對(duì)輸入的文本能完全理解,并給出后兩部分所需要的各種發(fā)音提示;韻律處理,為合成語音規(guī)劃出音段特征,如音高、音長(zhǎng)和音強(qiáng)等,使合成語音能正確表達(dá)語意,聽起來更加自然;聲學(xué)處理,根據(jù)前兩部分處理結(jié)果的要求輸出語音,即合成語音。
1.3.自然語言處理
有了語音識(shí)別和語音合成,要讓機(jī)器人能智能的對(duì)答如流的和人交談,還需要賦予機(jī)器人以靈魂。自然語言處理技術(shù)(NLP)就是來賦予聊天機(jī)器人內(nèi)在靈魂的。
NLP是計(jì)算機(jī)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要分支。由于數(shù)據(jù)的大幅度增強(qiáng)、計(jì)算力的大幅度提升、深度學(xué)習(xí)實(shí)現(xiàn)端到端的訓(xùn)練,深度學(xué)習(xí)引領(lǐng)人工智能進(jìn)入有一個(gè)高潮。人們也逐漸開始將如日中天的深度學(xué)習(xí)方法引入到NLP領(lǐng)域,在機(jī)器翻譯、問答系統(tǒng)、自動(dòng)摘要等方向取得成功。經(jīng)過互聯(lián)網(wǎng)的發(fā)展,很多應(yīng)用積累了足夠多的數(shù)據(jù)可以用于學(xué)習(xí)。當(dāng)數(shù)據(jù)量增大之后,以支持向量機(jī)(SVM)、條件隨機(jī)場(chǎng)(CRF)為代表的傳統(tǒng)淺層模型,由于模型過淺,無法對(duì)海量數(shù)據(jù)中的高維非線性映射做建模,所以不能帶來性能的提升。然而,以CNN、RNN為代表的深度模型,可以隨著模型復(fù)雜度的增大而增強(qiáng),更好貼近數(shù)據(jù)的本質(zhì)映射關(guān)系。一方面,深度學(xué)習(xí)的word2vec的出現(xiàn),使得我們可以將詞表示為更加低維的向量空間。另一方面,深度學(xué)習(xí)模型非常靈活,使得之前的很多任務(wù),可以使用端到端的方式進(jìn)行訓(xùn)練。

為了讓大家更好的理解基于深度學(xué)習(xí)的自然語言處理過程,舉一個(gè)比較通用的模型,如圖4。問題句子通過Seq2Seq循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)處理和編碼,然后進(jìn)入答案搜索,接著通過DQN強(qiáng)化學(xué)習(xí)網(wǎng)絡(luò)對(duì)問答策略進(jìn)程學(xué)習(xí)。這樣,隨著時(shí)間的推移,問答系統(tǒng)回答問題的水平會(huì)越來越高,就達(dá)到了不斷在線學(xué)習(xí)的目的了。
2.機(jī)器人語音交互實(shí)現(xiàn)
其實(shí)要自己做一款語音對(duì)話機(jī)器人還是很容易的,我們只需要選擇好語音識(shí)別、語音合成、自然語言處理的技術(shù),就可以在一款樹莓派3開發(fā)板上實(shí)現(xiàn)了。由于語音交互系統(tǒng)的核心技術(shù)是云端自然語言處理技術(shù),所以我們可以選擇網(wǎng)上免費(fèi)提供的語音識(shí)別、語音合成等現(xiàn)有方案,將主要精力用在云端自然語言處理技術(shù)的研發(fā)上。語音識(shí)別與語音合成SDK有:科大訊飛、百度語音、Google…,對(duì)于我們墻內(nèi)玩家…(Google頭疼)。經(jīng)過我自己的實(shí)測(cè),發(fā)現(xiàn)比較好用的免費(fèi)SDK是科大訊飛家的,所以強(qiáng)烈推薦。為了測(cè)試方便,我先推薦圖靈機(jī)器人API作為云端自然語言處理技術(shù)。等大家將整個(gè)語音交互系統(tǒng)的工作原理學(xué)會(huì)后,隨時(shí)可以將圖靈機(jī)器人API替換成自己的云端服務(wù)器,從而將主要精力轉(zhuǎn)移到云端自然語言處理技術(shù)的研發(fā)上。說了這么多,我們先來看看咱們的機(jī)器人語音交互軟硬件實(shí)現(xiàn)的真容吧,如圖5。

USB麥克風(fēng)拾取聲音,USB聲卡和音響播放聲音,樹莓派3開發(fā)板上運(yùn)行語音識(shí)別、語音合成、QA及NLP請(qǐng)求。其中,語音識(shí)別和語音合成采用科大訊飛的SDK,QA及NLP請(qǐng)求調(diào)用圖靈機(jī)器人的API接口。
這里特別說明一下,為什么選用USB聲卡而不用樹莓派自帶AV聲卡的原因。你可以直接將耳機(jī)插口插入樹莓派的AV接口試試,肯定很酸爽!雜音太大。這里就需要硬件支持。雜音原因: 因?yàn)闃漭?的AV接口是音頻和視頻合并輸出的,這個(gè)接口是美標(biāo)接口,而在中國是國標(biāo)的,接口的接地和音頻是相反的,這就導(dǎo)致根本不能用了。另外對(duì)播放器的支持并不完善。
2.1.獲取科大訊飛的SDK
科大訊飛提供用于研究用途的語音識(shí)別、語音合成的免費(fèi)SDK,科大訊飛分發(fā)該SDK的形式是庫文件(libmsc.so)+庫授權(quán)碼(APPID),庫文件libmsc.so與庫授權(quán)碼APPID是綁定在一起的,這也是大多說商業(yè)軟件分發(fā)的方式。
注冊(cè)科大訊飛賬號(hào):
首先,前往訊飛開放平臺(tái)(https://www.xfyun.cn),注冊(cè)科大訊飛賬號(hào),注冊(cè)好后,就可以進(jìn)入自己的控制臺(tái)進(jìn)行設(shè)置了,如圖6。
創(chuàng)建應(yīng)用:
我們要在科大訊飛的開放平臺(tái)創(chuàng)建我們需要的應(yīng)用,這樣訊飛就根據(jù)應(yīng)用類型給我們生成對(duì)應(yīng)的SDK庫。
進(jìn)入訊飛開放平臺(tái)的控制臺(tái)后,找到左側(cè)欄的[創(chuàng)建應(yīng)用],按要求填寫各個(gè)選項(xiàng),注意[應(yīng)用平臺(tái)]一欄填Linux,因?yàn)槲覀冇玫臉漭?開發(fā)板裝的是Linux系統(tǒng),如圖7。
創(chuàng)建應(yīng)用完成后,就要給該應(yīng)用添加相應(yīng)的AI技能了,由于我們需要訊飛的在線語音合成、在線語音識(shí)別(也就是語音聽寫),所以添加這兩個(gè)服務(wù)就行了。如圖8。
(圖8)添加語音合成與識(shí)別服務(wù)
申請(qǐng)樹莓派3平臺(tái)對(duì)應(yīng)的Linux SDK庫:
由于科大訊飛開放平臺(tái)默認(rèn)只提供PC端x86架構(gòu)的Linux庫,所以如果我們想在樹莓派3(樹莓派3為ARM架構(gòu))上使用科大訊飛的Linux SDK庫,就需要另外申請(qǐng)。其實(shí)申請(qǐng)方法也很簡(jiǎn)單,進(jìn)入科大訊飛中我的語音云頁面:
http://www.xfyun.cn/index.php/mycloud/app/linuxCrossCompile
進(jìn)行樹莓派Linux平臺(tái)庫文件交叉編譯申請(qǐng),選擇應(yīng)用(必須是linux平臺(tái)的應(yīng)用),按照默認(rèn)勾選全部在線服務(wù),平臺(tái)架構(gòu)ARM硬件型號(hào)Broadcom BCM2837(樹莓派3代b型,即樹莓派3的SOC,其余版本樹莓派,樹莓派2為BroadcomBCM2836,更早的版本為BroadcomBCM2835),處理器位數(shù)32,運(yùn)行內(nèi)存填了1GB。最后記得填上自己的郵箱,提交后,如填寫無誤正確,你的郵箱將收到可下載庫的鏈接,下載解壓后得到libmsc.so,這個(gè)庫文件就是我們申請(qǐng)的樹莓派3平臺(tái)對(duì)應(yīng)的Linux SDK庫了。如圖9。關(guān)于交叉編譯器和編譯腳本,從這里http://pan.baidu.com/s/1pLFPTYr下載,具體交叉可以參考這一篇
http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=32028&highlight=
關(guān)于這個(gè)庫文件對(duì)應(yīng)的庫授權(quán)碼APPID,可以在[我的應(yīng)用]界面查看,如圖10。
2.2.編譯安裝訊飛語音交互實(shí)例ROS版DEMO
利用科大訊飛提供的SDK庫文件和官方API說明文檔,我們就可以開發(fā)出自己的語音交互實(shí)例程序,當(dāng)然也可以開發(fā)對(duì)應(yīng)的ROS程序。在我們的miiboo機(jī)器人上開發(fā)的語音交互ROS功能包叫miiboo_asr。miiboo_asr功能包文件組織結(jié)構(gòu),如圖11。其中l(wèi)ib文件夾下存放科大訊飛提供的libmsc.so庫文件,iat.cpp是語音識(shí)別節(jié)點(diǎn)源文件,tts.cpp是語音合成節(jié)點(diǎn)源文件,qa_nlp.cpp是QA&NLP邏輯處理節(jié)點(diǎn)源文件,其他的文件我們可以不用關(guān)心。

了解了miiboo_asr功能包的基本情況后,我們就開始編譯安裝吧。首先,將miiboo_asr包拷貝到~/catkin_ws_apps/src/目錄下。然后將上面申請(qǐng)到的樹莓派3平臺(tái)對(duì)應(yīng)的Linux SDK庫libmsc.so文件拷貝到miiboo_asr/lib/中,并將miiboo_asr/CMakeLists.txt文件中有關(guān)libmsc.so的路徑替換為你存放該libmsc.so的實(shí)際路徑。如圖12。

接著我們需要將miiboo_asr/launch/xf.launch文件中的各個(gè)appid、聲卡硬件地址、麥克風(fēng)硬件地址設(shè)置成自己實(shí)際的值。關(guān)于與libmsc.so庫綁定的appid上面已經(jīng)介紹了查看方法,而聲卡硬件地址、麥克風(fēng)硬件地址的查詢也很簡(jiǎn)單。
麥克風(fēng)硬件地址的查詢直接使用命令arecord -l,如圖13。

在這里麥克風(fēng)錄制設(shè)備處于卡1,設(shè)備0,于是我們的麥克風(fēng)硬件地址就是“plughw::CameraB409241”。
聲卡硬件地址的查詢直接使用命令aplay -l,如圖14。

在這里聲卡播放設(shè)備有三個(gè),卡0中的設(shè)備0為3.5音頻輸出,卡0設(shè)備1為HDMI音頻輸出,卡2設(shè)備0為USB聲卡輸出。這里我推薦使用USB聲卡輸出,所以我們的聲卡硬件地址就是“plughw:DAC”。
在編譯miiboo_asr前,我們還需要安裝一些依賴項(xiàng),其實(shí)就是麥克風(fēng)錄音和音樂播放工具,安裝命令如下:
現(xiàn)在可以編譯miiboo_asr了,編譯命令如下:
編譯完成后,就可以運(yùn)行語音交互節(jié)點(diǎn)來實(shí)現(xiàn)語音對(duì)話了,溫馨提醒,請(qǐng)確保樹莓派已連接網(wǎng)絡(luò),因?yàn)檎Z音交互節(jié)點(diǎn)運(yùn)行時(shí)需要訪問網(wǎng)絡(luò)。啟動(dòng)語音交互各個(gè)節(jié)點(diǎn)很簡(jiǎn)單,直接一條命令:
節(jié)點(diǎn)都運(yùn)行起來后,會(huì)聽到歡迎語句“你好,歡迎使用miiboo機(jī)器人語音控制系統(tǒng)”,之后就可以對(duì)著麥克風(fēng)說出自己的指令,經(jīng)語音識(shí)別被轉(zhuǎn)換為文本,文本經(jīng)圖靈機(jī)器人得到應(yīng)答,并通過語音合成使我們能聽到回答的聲音。這樣一個(gè)語音交互的聊天機(jī)器人就誕生了,盡情享受和機(jī)器人聊天的樂趣吧^_^
這里說明一下,如果你使用我們的miiboo機(jī)器人,那么miiboo機(jī)器人上已經(jīng)安裝編譯好了miiboo_asr功能包,所以只需要上面roslaunch miiboo_asr xf.launch這條啟動(dòng)命令,就可以開始機(jī)器人聊天之旅。但是,miiboo機(jī)器人上安裝的miiboo_asr功能包的libmsc.so的訪問次數(shù)和頻率是有限制的,只能供學(xué)習(xí)使用。如果大家需要將miiboo_asr功能包用來二次開發(fā)或?qū)嶋H應(yīng)用,就需要按照上面的步驟去科大訊飛官網(wǎng)申請(qǐng)自己的SDK庫了。
3.自然語言處理云計(jì)算引擎
這一節(jié)的內(nèi)容作為展望內(nèi)容,供大家參考和進(jìn)一步的學(xué)習(xí)研究。前面也提過,語音交互系統(tǒng)的核心技術(shù)是云端自然語言處理技術(shù),等我們采用成熟的方案將語音識(shí)別、語音合成等基礎(chǔ)問題解決后,就要投入自然語言處理技術(shù)的研發(fā)了。我的想法是這樣的,首先需要在云端服務(wù)器上搭建一個(gè)WEB服務(wù)器,然后需要有一個(gè)網(wǎng)絡(luò)爬蟲系統(tǒng)不斷從互聯(lián)網(wǎng)上爬去各種訓(xùn)練數(shù)據(jù),接著需要搭建一個(gè)深度學(xué)習(xí)框架并運(yùn)行在線學(xué)習(xí)算法不斷的利用爬到的數(shù)據(jù)學(xué)習(xí),這樣自然語言處理云計(jì)算引擎同時(shí)處于學(xué)習(xí)和工作狀態(tài),圖15是我構(gòu)想的系統(tǒng)結(jié)構(gòu)。

后記
為了防止后續(xù)大家找不到本篇文章,我同步制作了一份文章的pdf和本專欄涉及的例程代碼放在github和gitee方便大家下載,如果下面給出的github下載鏈接打不開,可以嘗試gitee下載鏈接:
github下載鏈接:https://github.com/xiihoo/DIY_A_SLAM_Navigation_Robot
gitee下載鏈接:https://gitee.com/xiihoo-robot/DIY_A_SLAM_Navigation_Robot
技術(shù)交流
QQ技術(shù)交流群:117698356
參考文獻(xiàn)
[1] 張虎,機(jī)器人SLAM導(dǎo)航核心技術(shù)與實(shí)戰(zhàn)[M]. 機(jī)械工業(yè)出版社,2022.
