摘要:代碼下載語(yǔ)音和自然語(yǔ)言控制智能家居輸出協(xié)議實(shí)例源碼注下載代碼后請(qǐng)仔細(xì)閱讀說(shuō)明文檔。表示處理來(lái)自接口的語(yǔ)義結(jié)果錄音處理為文字處理為是和的數(shù)據(jù)傳遞媒介,中會(huì)將需要的控件傳過(guò)去用來(lái)處理智能家居的語(yǔ)法解析和命令輸出。
前言GitChat 作者:晶晶郭
原文:用語(yǔ)音和自然語(yǔ)言控制智能家居——實(shí)例分享
關(guān)注公眾號(hào):GitChat 技術(shù)雜談,一本正經(jīng)的講技術(shù)
ZigBee作為一種短距離、低功耗的無(wú)線通信局域網(wǎng)協(xié)議,其優(yōu)點(diǎn)是超低功耗、安全性高和自組網(wǎng),并且可容納多個(gè)設(shè)備,因此在智能家居控制中占有很大的優(yōu)勢(shì)。
同時(shí),隨著人工智能、語(yǔ)音識(shí)別、自然語(yǔ)義理解的發(fā)展,語(yǔ)音控制智能家居將成為一種趨勢(shì),這里會(huì)以window java應(yīng)用程序?yàn)槔?,講解如何通過(guò)語(yǔ)音識(shí)別控制智能家居,并輸出ZigBee3.0協(xié)議,也很方便和ZigBee協(xié)調(diào)器進(jìn)行對(duì)接,實(shí)現(xiàn)語(yǔ)音直接控制硬件。
下面詳細(xì)介紹程序的功能和代碼實(shí)現(xiàn),希望語(yǔ)音、語(yǔ)義理解今后能廣泛的應(yīng)用在家居等控制領(lǐng)域。
代碼下載語(yǔ)音和自然語(yǔ)言控制智能家居輸出Zibee3.0協(xié)議實(shí)例源碼
注:下載代碼后請(qǐng)仔細(xì)閱讀說(shuō)明文檔。
APP 測(cè)試請(qǐng)查看第3節(jié)。
功能分析 APP 工作流程APP的工作流程如下圖所示,圖中虛線框部分均由OLAMI開發(fā)平臺(tái)提供,后面會(huì)具體介紹OLAMI開發(fā)平臺(tái)的使用方法。
其余部分由APP來(lái)完成
語(yǔ)音輸入
OLAMI的語(yǔ)音識(shí)別支持兩種格式:
WAV 格式的 PCM 錄音數(shù)據(jù),單聲道(mono)、16K 采樣率(16 KHz Sample Rate)、16 bits 位深(Bit
Resolution)。Speex 音頻壓縮,節(jié)省數(shù)據(jù)傳輸量,壓縮參數(shù):Wideband 模式、Quality(壓縮比)= 10、單聲道(mono)、16K
采樣率(16 KHz Sample Rate)。
首先要確保硬件設(shè)備沒(méi)有問(wèn)題,可以進(jìn)行正常的語(yǔ)音錄入。在電腦上安裝好麥克風(fēng)之后,在“開始菜單”中輸入“錄音機(jī)”。
然后在彈出的錄音機(jī)中點(diǎn)擊“開始錄音”,使用話筒錄音后點(diǎn)擊“停止錄音”后會(huì)彈出保存錄音結(jié)果的對(duì)話框,保存,聽聽聲音正常即可。當(dāng)然,也可以使用QQ等第三方測(cè)試麥克風(fēng)的軟件。
確定硬件設(shè)備無(wú)誤之后,只要通過(guò)javax.sound.sampled.TargetDataLine調(diào)用windows錄音功能,錄下符合OLAMI語(yǔ)音識(shí)別接口的聲音數(shù)據(jù)即可,我的錄音方式是一邊錄音,同時(shí)將原始數(shù)據(jù)通過(guò)speex壓縮的方式post給 OLAMI 語(yǔ)音識(shí)別的API接口。不是保存為wav文件之后再上傳,這樣能夠提高語(yǔ)音識(shí)別的效率。
文字輸入
文字輸入即直接文本輸入,比如“打開空調(diào)”,“把彩燈調(diào)成紅色”。
處理NLI輸出
即根據(jù)OLAMI NLI的語(yǔ)義輸出結(jié)果決定如何操作設(shè)備,比如當(dāng)輸入為“打開燈”時(shí),我們可以收到如下JSON數(shù)據(jù):
{ "data": { "asr": { "result": "打開燈", "speech_status": 0, "final": true, "status": 0 }, "seg": "打開 燈 ", "nli": [ { "desc_obj": { "status": 0 }, "semantic": [ { "app": "smarthome", "input": "打開燈", "slots": [ { "modifier": [ "open" ], "name": "control_obj", "value": "燈" } ], "modifier": [], "customer": "593664ad84ae0a0a3feec056" } ], "type": "smarthome" } ] }, "status": "ok" }
slots中的“control_obj”即要操作的設(shè)備,上面的結(jié)果可以看到需要操作的設(shè)備是"燈",動(dòng)作為"打開"。應(yīng)用程序根據(jù)這兩個(gè)信息就可以在自己的設(shè)備中尋找“燈”這個(gè)設(shè)備,并發(fā)出“打開”命令。
輸出ZigBee 3.0 協(xié)議
根據(jù)NLI的輸出我們可以判定要控制的設(shè)備是燈,而燈的cluster我們選擇了ZCL_CLUSTER_ID_GEN_ON_OFF, 根據(jù)這個(gè)cluster以及等的device ID等輸出命令即可。
連接硬件
這里沒(méi)有提供驅(qū)動(dòng)硬件的代碼,但基本流程就是,將ZigBee協(xié)調(diào)器的開發(fā)版通過(guò)串口和電腦相連,軟件發(fā)出的命令經(jīng)串口發(fā)送給協(xié)調(diào)器,再由協(xié)調(diào)器控制ZigBee協(xié)議即可。
APP功能文字輸入
通過(guò)設(shè)備選擇可以切換不同的例句。同時(shí),可以在例句的框里輸入其他控制語(yǔ)句,按回車可以重復(fù)輸入。比如:“請(qǐng)幫我打開燈”,“燈給我打開”,“開一下空調(diào)”,“空調(diào)的溫度提高一點(diǎn)”
語(yǔ)音輸入
點(diǎn)擊”開始錄音”,如果沒(méi)有點(diǎn)擊“停止錄音”,3秒之后會(huì)自動(dòng)停止錄音。如果在這之前點(diǎn)擊了“停止錄音”,那么會(huì)及時(shí)停止錄音,并進(jìn)行語(yǔ)音識(shí)別。
識(shí)別后的文字會(huì)顯示在按鈕的上方,如下圖所示:
設(shè)備模擬
如上圖所示,應(yīng)用程序中會(huì)模擬彩燈的顏色和空調(diào)的溫度、模式、風(fēng)力,其原理就是根據(jù)輸出的Zigbee3.0協(xié)議進(jìn)行顯示。
命令輸出
即輸出ZigBee3.0的協(xié)議。下面列出例子中的幾種設(shè)備的協(xié)議信息。
燈
功能:僅支持打開和關(guān)閉
Device Dype: 0x100
命令:
Cluster ID: 0x0300
Cluster ID 的TI定義:ZCL_CLUSTER_ID_GEN_ON_OFF
actionID | Action_frame(1 bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x00 | 0x01 | 無(wú) | Off,關(guān)閉 |
0x01 | 0x01 | 無(wú) | On,打開 |
彩燈
功能:打開,關(guān)閉,顏色調(diào)節(jié)(例子僅支持紅、橙、黃、綠、青、藍(lán)、紫),氛圍調(diào)節(jié),色調(diào)調(diào)節(jié)。比如運(yùn)動(dòng)氛圍、浪漫氛圍、冷色調(diào)、暖色調(diào)等。
Device Dype:0x0102
命令:
Cluster ID: 0x0006
Cluster ID 的TI定義:ZCL_CLUSTER_ID_GEN_ON_OFF
actionID | Action_frame(1 bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x00 | 0x01 | 無(wú) | Off,關(guān)閉 |
0x01 | 0x01 | 無(wú) | On,打開 |
Cluster ID: 0x0300
Cluster ID 的TI定義:ZCL_CLUSTER_ID_LIGHTING_COLOR_CONTROL
actionID | Action_frame(1 bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x08 | 0x01 | Attr1,Attr2 | (均為int16,即兩個(gè)字節(jié),數(shù)據(jù)格式編號(hào)為0x29 ) 設(shè)置彩燈的顏色,即R,G,B值。 |
第一個(gè)參數(shù)的高八位表示R值。
第一個(gè)參數(shù)的低八位表示G值。
第二個(gè)參數(shù)的高八位表示B值。
第二個(gè)參數(shù)的低八位無(wú)意義。
電視
功能:打開,關(guān)閉,提高降低音量,換臺(tái)。
Device Dype:0x0006
命令:
Cluster ID: 0x0006
Cluster ID 的TI定義:ZCL_CLUSTER_ID_GEN_ON_OFF
actionID | Action_frame(1 bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x00 | 0x01 | 無(wú) | Off,關(guān)閉 |
0x01 | 0x01 | 無(wú) | On,打開 |
0x05 | 0x01 | 無(wú) | 提高音量 |
0x06 | 0x01 | 無(wú) | 降低音量 |
Cluster ID: 0x0008
Cluster ID 的TI定義:ZCL_CLUSTER_ID_GEN_LEVEL_CONTROL
actionID | Action_frame(1bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x00 | 0x01 | 1個(gè)字節(jié),uint8 | 切換頻道 |
0x01 | 0x01 | 無(wú) | 切換下個(gè)頻道 |
0x02 | 0x01 | 無(wú) | 切換上個(gè)頻道 |
空調(diào)
功能:
開關(guān)功能,即打開和關(guān)閉空調(diào)。
切換模式,順序?yàn)椤白詣?dòng)-制冷-除濕-送風(fēng)-加熱”模式按順序循環(huán)切換,但不支持某個(gè)模式的設(shè)置。
風(fēng)力切換,切換順序?yàn)椤白詣?dòng)-低速-中低速-中速-中高速-高速-超強(qiáng)”。
其中,制冷和制熱模式支持上述7種風(fēng)力切換。
送風(fēng)和自動(dòng)模式?jīng)]有“超強(qiáng)”風(fēng)力
除濕無(wú)風(fēng)力調(diào)節(jié)。
注意,僅支持切換,無(wú)風(fēng)力設(shè)置。
升高溫度,切換一次,溫度上升一度,基礎(chǔ)范圍是16-30.
降低溫度,每切換一次,溫度下降一度,基礎(chǔ)范圍是16-30
狀態(tài)查詢,開關(guān)、溫度、風(fēng)力、模式查詢。
Device Dype:0x0102
命令:
Cluster ID: 0x0300
Cluster ID 的TI定義:ZCL_CLUSTER_ID_LIGHTING_COLOR_CONTROL
actionID | Action_frame(1bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x00 | 0x01 | 無(wú) | 切換開關(guān) |
0x01 | 0x01 | 無(wú) | 切換模式 |
0x02 | 0x01 | 無(wú) | 切換風(fēng)速 |
0x03 | 0x01 | 無(wú) | Setup Button |
0x04 | 0x01 | 無(wú) | Setdown Button |
窗簾
功能:
打開,關(guān)閉,停止運(yùn)行,指定窗簾運(yùn)行的位置。
Device Dype: 0x202
命令:
Cluster ID: 0x102
Cluster ID 的TI定義:ZCL_CLUSTER_ID_CLOSURES_WINDOW_COVERING
actionID | Action_frame(1bit ) | 參數(shù)組 | 說(shuō)明 |
---|---|---|---|
0x00 | 0x01 | 無(wú) | 打開 |
0x01 | 0x01 | 無(wú) | 關(guān)閉 |
0x02 | 0x01 | 無(wú) | 窗簾電機(jī)停止移動(dòng),并返回當(dāng)前位置的百分比 |
0x04 | 0x01 | 窗簾號(hào)房間號(hào),2bytes | 設(shè)置窗簾號(hào),房間號(hào).其中高8位是房間號(hào),低8位是窗簾號(hào) |
0x05 | 0x01 | 百分比 | 單位百分比 |
其余設(shè)備和傳感器的ZigBee 輸出協(xié)議不再一 一列出,可以直接在APP中測(cè)試。
APP測(cè)試代碼下載解壓之后,可以在根目錄找到 smarthome.jar,在windows7 環(huán)境下雙擊即可以運(yùn)行。
應(yīng)用程序支持的語(yǔ)料除了選項(xiàng)里的,其他的相似說(shuō)法也支持。
APP源碼解析 OLAMI語(yǔ)法加載因?yàn)锳PP調(diào)用了OLAMI的自然語(yǔ)言理解接口,所以首先是必須先寫語(yǔ)法,來(lái)匹配智能家居控制語(yǔ)句。比如:“打開燈”,“幫我打開空調(diào)”,必須在完成語(yǔ)法之后,才能從OLAMI的接口中獲取NLI結(jié)果。語(yǔ)法相關(guān)定義和寫法等請(qǐng)參考博客:告訴你如何使用OLAMI自然語(yǔ)言理解開放平臺(tái)API制作自己的智能對(duì)話助手
如果你希望修改語(yǔ)法,添加更多的句子支持,必須將語(yǔ)法文件導(dǎo)入到歐拉蜜NLI系統(tǒng)。
下載包解壓之后,根目錄找到smarthome.osl,這個(gè)就是智能家居支持的語(yǔ)法。然后注冊(cè)并登錄歐拉蜜官網(wǎng),在自己的賬號(hào)下找到“應(yīng)用管理”,并進(jìn)入NLI系統(tǒng)。如下圖所示。
接著新增模塊,并將智能家居語(yǔ)法smarthome.osl導(dǎo)入,如下圖所示,點(diǎn)擊“新建”并輸入APP的名字“smarthome”,這個(gè)名字必須與smarthome.osl的名字相同,否則導(dǎo)入時(shí)會(huì)報(bào)錯(cuò)。當(dāng)然也可以修改,但同時(shí)要修改smarthome.ols中APP name相關(guān)字段。
模塊創(chuàng)建之后,選擇“上傳OSL文件”,然后選擇smarthome.osl并確認(rèn)即可。上傳成功之后會(huì)進(jìn)入該模塊內(nèi)部,然后在例句庫(kù)中可以看到很多智能家居控制的句子,同時(shí)也可以查看Grammar,Rule等。至此OLAMI語(yǔ)法加載完畢。
獲取應(yīng)用程序的APP KEY和APP Secreat如果希望獲取句子解析后的結(jié)果,必須在歐拉蜜平臺(tái)中創(chuàng)建自己的應(yīng)用程序,名字任意,我的叫“smarthome”。
回到“應(yīng)用管理”界面-----創(chuàng)建應(yīng)用程序。
應(yīng)用程序創(chuàng)建成功之后,還需要把剛才創(chuàng)建的smarthome 語(yǔ)法模塊添加到應(yīng)用程序中,一個(gè)應(yīng)用程序可以支持多個(gè)語(yǔ)法模塊。
點(diǎn)擊圖中的“測(cè)試”,輸入“打開燈”,就可以看到JSON格式的語(yǔ)義輸出結(jié)果了:
語(yǔ)法模塊配置好之后,點(diǎn)擊應(yīng)用程序的”查看Key”的按鈕,可以看到平臺(tái)分配的APP Key和APP Secret.
源碼分析源碼工程是demosourcecode.jar,解壓之后,添加入Eclispe工程,我的開發(fā)環(huán)境是JDK1.8.
Eclipse Version: Mars.2 Release (4.5.2).
注意:導(dǎo)入工程后,如果出現(xiàn)文字報(bào)錯(cuò),請(qǐng)將默認(rèn)編碼修改為UTF-8,方法 Project->Properties->Resource
代碼結(jié)構(gòu):
替換KEY
在smarthome packge中的NLIProcess.java中,替換之前創(chuàng)建語(yǔ)法應(yīng)用時(shí)的APP Key和APP Secreat:
// * Replace your APP KEY with this variable. private static String appKey = "*****your APP Key******"; // * Replace your APP SECRET with this variable. private static String appSecret = "****your APP Secret*****";
程序入口:
程序入口為smarthome packge下的window.java,可以安裝windows Builder插件,直接操作界面。
smarthome packge:
smarthome包里的源碼包括了APP應(yīng)用的基本框架,其中:
window.java為APP入口,即界面。
NLIProces.java表示處理來(lái)自O(shè)LAMI NLI接口的語(yǔ)義結(jié)果.
錄音處理為:getSemanticBySpeech()
文字處理為:getSemanticByText(String inputText)
windowVariable.java是window.java和NLIProces.java的數(shù)據(jù)傳遞媒介, window.java中會(huì)將
NLIProcess.java 需要的控件傳過(guò)去:
private void initialize() { nliwindowdata.setCmdTable(cmd_table); nliwindowdata.setcolortext(color_text); nliwindowdata.setAnswerText(answer_Text); nliwindowdata.setModetext(mode_text); nliwindowdata.setTempetext(tempe_text); nliwindowdata.setVoicetext(voice_text); nliwindowdata.setWindtext(wind_text); nliwindowdata.setisRed(isred); nliprocess.SetAnswerConfigCom(nliwindowdata);
smartHomeApp.java用來(lái)處理智能家居APP的語(yǔ)法解析和命令輸出。是NLIProces.java中其中一個(gè)小模塊。 你還可以在NLI處理中添加其他處理模塊,比如天氣查詢、詩(shī)歌背誦等等。目前NLIprocess.java中僅處理了smarthome相關(guān)的NLI輸出:
private void ProcessNLIResults(NLIResult[] nliResults) { // TODO Auto-generated method stub String answer="對(duì)不起,你說(shuō)的話我還不能理解"; boolean isnormal=false; for(int i=0;iAPPSlotEntry.java----處理NLI返回的JSON數(shù)據(jù)中slots相關(guān)信息
OutputMap.java------存放smartHomeApp.java返回給NLIProcess.java的輸出語(yǔ)句和命令。
Smarthome.definition packge
該包是智能家居處理中用到的定義和設(shè)備狀態(tài)解析。
Demo中模擬了燈,彩燈,電視,空調(diào),傳感器等設(shè)備,初始化數(shù)據(jù)見smartHomeApp.java的InitDeviceData()。
所有設(shè)備信息通過(guò)ClientHomeAutomation.java解析并存儲(chǔ)。
//key is deviceID MapaddedDeviceMapNew=new ConcurrentHashMap (); Smarthome.util
DataBuffer.java 和Microphone.java用來(lái)進(jìn)行麥克風(fēng)錄音;錄音格式按照歐拉蜜平臺(tái)的要求,參數(shù)為16位深采樣率,16KHZ頻率,單聲道。
源碼為
public Microphone() { this.sampleRate = 16000; this.bigEndian = false; this.signed = true; this.desiredFormat = new AudioFormat (sampleRate, 16, 1, signed, bigEndian); //this.closeBetweenUtterances = closeBetweenUtterances; this.msecPerRead = 100; //this.keepDataReference = keepLastAudio; //this.stereoToMono = stereoToMono; //this.selectedChannel = selectedChannel; //this.selectedMixerIndex = selectedMixerIndex; this.audioBufferSize = 9600; recorderData = new DataBuffer(); }麥克風(fēng)的錄音開始和停止通過(guò)線程監(jiān)控完成。直到?jīng)]有聲音錄入時(shí),錄音線程才會(huì)觸發(fā)錄音停止機(jī)制,因此希望停止錄音時(shí)必須通Microphone.stopRecording()關(guān)閉錄音,程序才能停止錄音。
因此錄音時(shí)最好設(shè)置默認(rèn)的錄音時(shí)長(zhǎng)或者通過(guò)標(biāo)志來(lái)停止錄音,并調(diào)用Microphone.stopRecording(),我這里的默認(rèn)錄音時(shí)長(zhǎng)為3s.
代碼見NLIProcess.java的
//最多錄3秒數(shù)據(jù),因?yàn)椴蓸宇l率是16000點(diǎn)每秒,每個(gè)點(diǎn)占兩個(gè)字節(jié)。 // readcount<=0表示錄音結(jié)束 int num=0; int srcint=0; while(readcount > 0 ) { if(total_count >= 48000*2||needstop) break; num++; System.out.println("數(shù)據(jù)"+(num+1)); total_count += readcount; System.out.println("單數(shù)"+readcount); speechrecoginzer.appendAudioFramesData(databytes); readcount = mic.getData(databytes, 0, temsize); } mic.stopRecording();WaveFileWriter.java可以為錄音數(shù)據(jù)添加wav頭。
和硬件設(shè)備對(duì)接和硬件設(shè)備對(duì)接,需要串口或者USB等將輸出的ZigBee協(xié)議發(fā)給協(xié)調(diào)器,由協(xié)調(diào)器控制各智能設(shè)備做出反應(yīng)。
實(shí)錄:《晶晶郭:用語(yǔ)音快速控制智能家居實(shí)戰(zhàn)解析》
彩蛋重磅 Chat 分享:《一場(chǎng) Chat 讓你搞清 BAT 程序員的技術(shù)職級(jí)》
分享人:
勝洪宇,一線互聯(lián)網(wǎng)公司前端技術(shù)組長(zhǎng),掘金簽約作者,前端博客博主,所講課程幫助超過(guò)20萬(wàn)前端小伙伴學(xué)習(xí)。
Chat簡(jiǎn)介:
很多程序員向往進(jìn)入 BAT 這樣的大型互聯(lián)網(wǎng)公司,但是又不知道他們?nèi)绾卧u(píng)定技術(shù)職級(jí)。阿里集團(tuán)薪資職級(jí)如何劃分?讓你快速得到馬云的青睞。
在百度明白這些,你將快速晉升。
騰訊職級(jí)里的小秘密,這樣工作你會(huì)更強(qiáng)。
一場(chǎng) Chat 讓你搞清 BAT 的技術(shù)評(píng)價(jià)體系,為您進(jìn)入超級(jí)互聯(lián)網(wǎng)公司指明技術(shù)方向,時(shí)刻做好準(zhǔn)備!如果您希望您的技術(shù)團(tuán)隊(duì)也像這些互聯(lián)網(wǎng)巨頭一樣強(qiáng)大,本場(chǎng) Chat 我將幫您馬上模仿建立有效的技術(shù)職級(jí)體系。想要免費(fèi)參與本場(chǎng) Chat ?很簡(jiǎn)單,「GitChat技術(shù)雜談」公眾號(hào)后臺(tái)回復(fù)「BAT」
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19633.html
摘要:本文的主題,初衷就是探討人機(jī)結(jié)合對(duì)于機(jī)器翻譯發(fā)展的重要性。所以絕大部分的機(jī)器翻譯訓(xùn)練,無(wú)論是統(tǒng)計(jì)機(jī)器翻譯還是人工神經(jīng)網(wǎng)絡(luò),都以和人工譯文語(yǔ)料庫(kù)的最大似然度為訓(xùn)練目標(biāo)。其下界低于機(jī)器翻譯的水準(zhǔn),是最正常不過(guò)的事情了。 來(lái)自 GitChat 作者:魏勇鵬更多IT技術(shù)分享,盡在微信公眾號(hào):GitChat技術(shù)雜談 眼球不夠,八卦來(lái)湊 以一個(gè)八卦作為開頭吧。 本文開始要寫作的時(shí)候,翻譯圈里出了一...
閱讀 3038·2023-04-25 18:06
閱讀 3307·2021-11-22 09:34
閱讀 2869·2021-08-12 13:30
閱讀 2058·2019-08-30 15:44
閱讀 1669·2019-08-30 13:09
閱讀 1638·2019-08-30 12:45
閱讀 1726·2019-08-29 11:13
閱讀 3617·2019-08-28 17:51