廖春藍(lán)
(廣州番禺職業(yè)技術(shù)學(xué)院,廣東廣州 511400)
2021年12 月,工業(yè)和信息化部、國家發(fā)展和改革委員會、科學(xué)技術(shù)部等十五個(gè)部門聯(lián)合發(fā)布了《“十四五”機(jī)器人產(chǎn)業(yè)發(fā)展規(guī)劃》,指出機(jī)器人的研發(fā)、制造和應(yīng)用是衡量一個(gè)國家科技創(chuàng)新的重要標(biāo)志。黨中央、國務(wù)院高度重視機(jī)器人產(chǎn)業(yè)的發(fā)展,將機(jī)器人納入國家科技創(chuàng)新重點(diǎn)領(lǐng)域,大力推動(dòng)機(jī)器人研發(fā)創(chuàng)新和產(chǎn)業(yè)化應(yīng)用[1]。無論是迎賓機(jī)器人、教育機(jī)器人,還是養(yǎng)老助殘機(jī)器人、家務(wù)機(jī)器人,這些服務(wù)機(jī)器人要服務(wù)人類完成某項(xiàng)工作,就必須具備與人交流的能力,即“聽”和“說”的能力。因此,語音交互是服務(wù)機(jī)器人必不可少的一項(xiàng)功能。
機(jī)器人操作系統(tǒng)(Robot Operating System,ROS)是一個(gè)面向機(jī)器人的開源元操作系統(tǒng),遵守BSD開源許可協(xié)議。ROS屬于建立在傳統(tǒng)操作系統(tǒng)上的次級操作系統(tǒng),并為其提供一個(gè)結(jié)構(gòu)化的通信層。它提供了一系列類似傳統(tǒng)操作系統(tǒng)的功能,例如硬件抽象、設(shè)備驅(qū)動(dòng)、庫函數(shù)、可視化、消息傳遞和軟件包管理等,以幫助軟件開發(fā)者創(chuàng)建機(jī)器人的應(yīng)用軟件[2]。ROS強(qiáng)大的功能使得開發(fā)者能夠比較容易地進(jìn)行語音交互工程部署,實(shí)現(xiàn)迎賓機(jī)器人跟人類的交流并按照人類的命令完成某項(xiàng)任務(wù)。ROS具有點(diǎn)對點(diǎn)設(shè)計(jì)、多語言支持、架構(gòu)精簡、集成度高、工具包豐富、免費(fèi)開源等特點(diǎn)。
傳統(tǒng)的人機(jī)交互一般通過圖形的方式進(jìn)行強(qiáng)視覺弱邏輯的交互,也被稱為GUI(Graphic User Interface)。而語音交互(Voice User Interface,VUI)則是通過語音的方式進(jìn)行人機(jī)交互,強(qiáng)邏輯而無視覺(或者弱視覺)。VUI通過語音傳遞所有足夠的信息,承載認(rèn)知、邏輯、情緒等等一切元素,這才是智能語音交互的核心所在[3]。
語音交互系統(tǒng)是迎賓機(jī)器人的核心模塊之一,它使得機(jī)器人具有像人一樣“能聽會說、有問必答”的交互能力,是實(shí)現(xiàn)迎賓機(jī)器人跟人類交流的關(guān)鍵環(huán)節(jié)。首先,迎賓機(jī)器人身上裝載的語音輸入設(shè)備(例如麥克風(fēng)陣列模塊)采集用戶的語音,完成音頻的錄入、采樣及編碼。語音識別環(huán)節(jié)完成語音信息到機(jī)器可識別的文本信息的轉(zhuǎn)化。語言處理環(huán)節(jié)根據(jù)語音識別轉(zhuǎn)換后的文本字符或命令進(jìn)行邏輯判斷后完成相應(yīng)的操作處理。最后,語音合成環(huán)節(jié)完成文本信息到聲音信息的轉(zhuǎn)換,并將語音信號輸出反饋給人類。語音交互系統(tǒng)框圖如圖1所示。
圖1 語音交互系統(tǒng)框圖
在迎賓機(jī)器人工作過程中,當(dāng)人類對機(jī)器人下達(dá)語音命令時(shí),迎賓機(jī)器人首先會“聽懂”人的語音,在進(jìn)行語音信號的識別和處理之后,機(jī)器人會“回答”人類的提問,并按照人類的指令完成某項(xiàng)任務(wù),這就是語音交互控制系統(tǒng)的功能所在。
迎賓機(jī)器人的語音交互系統(tǒng)主要由硬件和軟件兩部分構(gòu)成。硬件部分主要由麥克風(fēng)陣列模塊、揚(yáng)聲器和相關(guān)接口電路組成,軟件部分主要是基于ROS的程序控制。
迎賓機(jī)器人選用科大訊飛的麥克風(fēng)陣列模塊實(shí)現(xiàn)語音采集,它是語音交互系統(tǒng)的核心硬件。
麥克風(fēng)陣列模塊又被稱為麥克風(fēng)陣列語音板,它采用平面環(huán)形分布結(jié)構(gòu)。麥克風(fēng)陣列模塊是一種包含一定數(shù)量的聲學(xué)傳感器(一般為麥克風(fēng)),能對聲場的空間特性進(jìn)行采樣并處理的系統(tǒng)。在機(jī)器人上裝載麥克風(fēng)陣列模塊,迎賓機(jī)器人就能“聽見”人類的語音指令。
如圖2所示,麥克風(fēng)陣列模塊在電路板外圍平均安置了6個(gè)麥克風(fēng),按照圖示的順時(shí)針順序從0~5進(jìn)行編號,可以實(shí)現(xiàn)360°等效拾音。麥克風(fēng)陣列模塊的語音喚醒分辨率為1°,并且具備抑制背景噪聲和混響、信號提取與分離等功能。
圖2 科大訊飛麥克風(fēng)陣列模塊
科大訊飛麥克風(fēng)陣列模塊利用多個(gè)麥克風(fēng)在不同位置點(diǎn)對聲源進(jìn)行測量,由于聲音信號到達(dá)不同麥克風(fēng)的時(shí)間有不同程度的延遲,利用TDOA(Time Difference of Arrival)算法對測量得到的聲音信號進(jìn)行處理,由此獲得聲源點(diǎn)相對于麥克風(fēng)的到達(dá)方向和距離等信息,因而具備聲源定位的功能[4]。在環(huán)形分布的麥克風(fēng)內(nèi)側(cè)安置的一圈共12個(gè)均勻分布的LED燈就是用于實(shí)時(shí)顯示聲源方向的。此外,麥克風(fēng)陣列語音板上配置了一個(gè)參考信號接口,可以讀取回聲并進(jìn)行處理,實(shí)現(xiàn)回聲消除功能。
基于科大訊飛的軟件開發(fā)工具包SDK,迎賓機(jī)器人的語音交互系統(tǒng)開發(fā)了ROS語音功能包,該功能包放置在工程文件夾中。ROS語音功能包含交互相關(guān)的多個(gè)功能包,主要包含以下三個(gè):離線語音識別包、離線語音合成包和在線語音合成包[5]。
離線語音識別包(xf_mic_asr_offline)可以讓迎賓機(jī)器人通過配置文件而具有良好的語音識別能力。該功能包作為與麥克風(fēng)陣列模塊相關(guān)的所有接口的服務(wù)端,提供包括喚醒角度、降噪音頻、燈光控制、離線命令詞識別等功能。其提供與麥克風(fēng)相關(guān)的多個(gè)接口,其文件目錄如圖3所示。
圖3 離線語音識別包目錄
離線語音合成包(xf_mic_tts_offline)能夠?qū)崿F(xiàn)離線的語音合成,讓迎賓機(jī)器人能夠說出中文。離線語音合成包合成的引擎在SDK中,可以在無網(wǎng)絡(luò)的情況下使用,功能包目錄如圖4所示。
圖4 離線語音合成包目錄
迎賓機(jī)器人的語音交互控制思路如下:在5 m范圍內(nèi),當(dāng)賓客用“小威小威”這個(gè)喚醒詞呼喊迎賓機(jī)器人時(shí),迎賓機(jī)器人內(nèi)部程序進(jìn)入回調(diào)函數(shù),調(diào)用相應(yīng)的服務(wù)來獲取等待識別的語句。若識別成功,迎賓機(jī)器人會“回答”一句“在呢”。當(dāng)賓客繼續(xù)說出“你是誰”“你來自哪里”等語句時(shí),機(jī)器人會根據(jù)關(guān)鍵詞進(jìn)行相應(yīng)的回答。當(dāng)賓客說出“向前走”“向后走”等語句時(shí),迎賓機(jī)器人會以一定的速度移動(dòng)。若識別失敗則不做任何操作,等待下一次的喚醒操作。
在裝載有麥克風(fēng)陣列模塊的迎賓機(jī)器人上通過編寫Python程序,實(shí)現(xiàn)了對迎賓機(jī)器人的語音交互與控制,具體流程如下:
(1)安裝音頻播放庫。
利用如下指令為迎賓機(jī)器人安裝音頻播放庫:
$sudo apt-get install sox
$sudo apt-get install mplayer
(2)啟動(dòng)語音合成。
新建一個(gè)終端,利用指令roslaunch啟動(dòng)語音合成節(jié)點(diǎn):
$ roslaunch xf_mic_asr_offline xf_mic_tts_offline.launch
(3)啟動(dòng)語音識別。
新建一個(gè)終端,利用指令roslaunch啟動(dòng)語音識別節(jié)點(diǎn):
$ roslaunch xf_mic_tts_offline xf_mic_asr_offline.launch
語音識別節(jié)點(diǎn)正常啟動(dòng)后,迎賓機(jī)器人會說一句:“語音模塊啟動(dòng)成功,請喚醒?!痹谶@里,可以通過指令rosservice list和rostopic list查看當(dāng)前所有活躍的服務(wù)和話題。
(4)運(yùn)行語音交互節(jié)點(diǎn)。
在Python程序所在目錄下新建一個(gè)終端,輸入python yuyin.py,運(yùn)行語音交互節(jié)點(diǎn)。當(dāng)終端顯示語音交互節(jié)點(diǎn)成功連接語音合成和語音識別服務(wù)器后,賓客就可以跟機(jī)器人對話了。
(5)獲取語音識別結(jié)果和任務(wù)控制。
新建一個(gè)終端,輸入下面的命令,獲取語音識別結(jié)果和任務(wù)控制:
$roslaunchxf_mic_asr_offlineget_asr_result.launch
(6)啟動(dòng)機(jī)器人基礎(chǔ)功能包。
新建一個(gè)終端,輸入下面的命令,啟動(dòng)迎賓機(jī)器人的基礎(chǔ)功能包,可以通過它控制迎賓機(jī)器人移動(dòng):
$roslaunch vkbot_bringup minimal.launch
(7)發(fā)布機(jī)器人移動(dòng)的速度信息。
新建一個(gè)終端,輸入下面的命令,獲取語音識別結(jié)果的節(jié)點(diǎn)將會發(fā)布機(jī)器人速度信息:
$rostopic info/cmd_vel_mux/input/teleop
在正常啟動(dòng)語音模塊后,迎賓機(jī)器人播報(bào)“語音模塊啟動(dòng)成功,請喚醒”。機(jī)器人在聽到賓客呼喊喚醒詞“小威小威”時(shí),會回答一句“在呢”。賓客問:“你是誰?”迎賓機(jī)器人會回答:“我是迎賓機(jī)器人小威。”
當(dāng)賓客在喚醒詞后繼續(xù)說“向前走”時(shí),迎賓機(jī)器人會以一定的速度前進(jìn)。程序成功運(yùn)行后,終端顯示信息如圖5所示。終端輸出的“前”,表示迎賓機(jī)器人識別到賓客說話的關(guān)鍵詞是“前”。終端輸出的“0.300000 0.000000”是機(jī)器人X方向和Y方向的速度值,即機(jī)器人以0.3 m/s的速度向前走。
圖5 終端顯示
本文設(shè)計(jì)的基于ROS的迎賓機(jī)器人具有較好的語音交互功能,能夠順暢地與賓客進(jìn)行語音交流,并且能夠按照賓客的語音指令完成相應(yīng)的工作任務(wù)。利用ROS可以方便快捷地進(jìn)行服務(wù)機(jī)器人的語音交互工程部署,這種設(shè)計(jì)方法具有典型性和實(shí)用性,可以推廣到服務(wù)機(jī)器人的其他復(fù)雜項(xiàng)目開發(fā)中,具有一定的參考價(jià)值和廣闊的應(yīng)用前景。