成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

GitChat · 人工智能 | 用語(yǔ)音和自然語(yǔ)言控制智能家居——實(shí)例分享

妤鋒シ / 2868人閱讀

摘要:代碼下載語(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;i

APPSlotEntry.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
        Map addedDeviceMapNew=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

相關(guān)文章

  • GitChat · 人工智能 | 除了深度學(xué)習(xí),機(jī)器翻譯還需要啥?

    摘要:本文的主題,初衷就是探討人機(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í)候,翻譯圈里出了一...

    Gilbertat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<