侯龍瀟,張 樺,趙 聰,雷珊珊
(河南省機械設(shè)計研究院有限公司,河南 鄭州 450003)
在工業(yè)生產(chǎn)中,設(shè)備的操作員通常使用按鈕、觸摸屏、鼠標、鍵盤等人機交互裝置對工業(yè)設(shè)備進行控制。其原理是通過輸入裝置進行信號的輸入和參數(shù)的修改,經(jīng)由可編程邏輯控制器(PLC)內(nèi)部進行邏輯處理后輸出指令到外部執(zhí)行機構(gòu),從而實現(xiàn)對設(shè)備的控制。
隨著工業(yè)4.0時代的到來,越來越多的工廠引入自動化設(shè)備來代替原有的人工作業(yè),從原來的純手工作業(yè)和一人一機器的作業(yè)模式轉(zhuǎn)變?yōu)橐蝗丝刂埔粭l生產(chǎn)線的作業(yè)模式?!皺C器換人”模式的優(yōu)點是可以提高工作效率、節(jié)約人力成本等,但缺點也隨之而來。面對越來越復雜的生產(chǎn)工藝,為了滿足需求,工業(yè)設(shè)備的數(shù)量會越增越多,操作邏輯也會變得越發(fā)繁瑣,按鈕、觸摸屏按鍵等輸入裝置的數(shù)量也會隨之增多,傳統(tǒng)的人機交互方式的復雜程度也會相應(yīng)增加。操作人員需要從眾多的按鈕和界面中找到正確的輸入裝置進行操作,不僅浪費時間,對操作人員的素質(zhì)要求也高,沒有經(jīng)過系統(tǒng)培訓和長時間操作經(jīng)驗的操作員很難勝任工作。
基于上述問題,本文研究了一種通過使用語音指令控制PLC的方法,旨在代替?zhèn)鹘y(tǒng)的輸入裝置完成對工業(yè)設(shè)備的控制,降低人機交互的復雜程度,縮短操作人員的訓練周期。
本文所述方法的流程如圖1所示。
圖1 方法流程圖
為了獲取原始的語音樣本,本文使用pyaudio模塊對語音樣本進行采樣。采用16 kHz采樣幀率、2.5 s時長采集單個語音指令樣本。為了方便后期模型訓練,將采集到的原始語音樣本以樣本分類號加樣本序號的方式命名,樣本分類號和樣本序號之間使用符號“-”進行分隔,以wav格式保存語音樣本。
原始語音指令樣本中噪聲的主要構(gòu)成是環(huán)境噪聲,為了獲得純凈的語音樣本,需要對語音樣本進行去噪聲處理。
本文采用譜減法剔除語音樣本中的環(huán)境噪聲。譜減法的基本原理是默認混合信號(含噪信號)的前幾幀僅包含環(huán)境噪聲,并利用混合信號的前幾幀的平均幅度譜作為噪聲的幅度譜,最后利用混合信號(含噪信號)的幅度譜與估計到的幅度譜相減,得到純凈語音信號的幅度譜。
讀取采集到的原始語音樣本文件,將波形數(shù)據(jù)轉(zhuǎn)換為數(shù)組x(n)。對x(n)加漢明窗并分幀,則每幀數(shù)據(jù)為xi(n)。對第i幀信號進行傅里葉變換至頻域即可得到第i幀信號的幅度譜Xi(w):
(1)
式中:n為當前幀編號,w為時域離散信號的編號,N為時域離散信號的點數(shù)。
假設(shè)語音樣本的前幾幀中沒有有效的信息成分,即前幾幀為純粹的噪聲信號,則取語音樣本的前n幀作為噪聲幀,估計出噪聲幀的平均能量值Dn(w)為:
(2)
當語音信號大于噪聲的功率時,用原始語音減去噪聲成分;當語音信號小于噪聲的功率時,則用估計出來的噪聲信號表示下限值:
(3)
式中:Yi(w)為去噪后語音幀幅度譜,D(w)為噪聲幀幅度譜。
之后再將去噪聲后的每幀幅度譜信號進行傅里葉逆變換得到時域語音信號,將去噪聲后的語音樣本以wav格式進行保存。
每個語音樣本的采集時長為2.5 s,但是真正有意義的音頻并不是充滿整個采集周期,此外由于語音樣本經(jīng)過2.2節(jié)的去噪聲處理,會使語音樣本的起始端和末尾端產(chǎn)生空白段。端點檢測就是在一段包含語音的信號中,準確地確定語音的起始點和終止點,將語音段和非語音段區(qū)分開[1]。
本文采用雙門限法對語音指令樣本進行端點檢測。一段語音信號分為靜音區(qū)、清音區(qū)和濁音區(qū)三部分。其中濁音區(qū)的短時能量最大,取一個較高的短時能量閾值區(qū)分濁音區(qū)和清音區(qū);清音區(qū)的能量較低,取一個較低的短時能量閾值來判定語音的開始;另外由于微小的噪聲也有可能超過低閾值,但并不是語音的開始,這就需要通過短時過零率區(qū)分清音區(qū)和靜音區(qū)。流程如下:
1)取一個較高的短時能量作為閾值MH,利用這個閾值,先分出語音中的濁音區(qū)(如圖2中的A1~A2區(qū)間);
圖2 雙門限法示意圖
2)取一個較低的能量閾值ML,利用這個閾值,從A1、A2向兩端進行搜索,將較低能量清音區(qū)也加入到語音段(如圖2中的B1~B2區(qū)間);
3)取一個短時過零率的閾值Zs,利用這個閾值,從B1、B2繼續(xù)向兩端進行搜索,短時過零率大于3倍Zs的部分,則認為是語音的清音部分。將該部分加入語言段,就是求得的語音段(如圖2中的C1~C2區(qū)間)。
在語音識別領(lǐng)域,最常用到的語音特征就是梅爾倒譜系數(shù)(Mel-scale frequency cepstrum coefficients,MFCC)[2]。通過對人類聽覺的研究發(fā)現(xiàn),人類聽覺的敏感度取決于聲波的頻率,其中200~5 000 Hz的聲波頻率能最大程度地影響語音的清晰度。此外,由于頻率較低的聲音在內(nèi)耳蝸基底膜上行波傳遞的距離大于頻率較高的聲音,因此低音容易掩蔽高音[3]。為此,人們在從低頻到高頻這一段頻帶內(nèi)按臨界帶寬的大小由密到疏安排一組帶通濾波器,對輸入信號進行濾波[4]。將每個梅爾濾波器輸出的信號能量作為此信號的MFCC參數(shù),對此參數(shù)進一步處理組合后作為語音的MFCC特征。
由于高頻語音部分的能量較小,為了提升高頻部分,使信號的頻譜變得平坦,先對端點檢測后的語音信號進行預(yù)加重處理:
y(n)=x(n)-αx(n-1)
(4)
式中:y(n)為預(yù)加重后的數(shù)據(jù);x(n)為當前幀數(shù)據(jù);α為預(yù)加重系數(shù),取值0.97。
完成預(yù)加重后,將信號進行分幀。其中幀長25 ms,幀移10 ms,對每一幀數(shù)據(jù)進行加窗。對加窗后的每幀信號進行快速傅里葉變換:
(5)
式中:N1為幀總數(shù)。
獲取每一幀的能量總和:
Di=|Xi(w)|2
(6)
式中:Di為分幀后每一幀的能量總和。將功率譜通過一組梅爾尺度的三角窗濾波器組(共26個),對信號的功率譜濾波。每一個三角窗濾波器覆蓋的范圍都近似于人耳的一個臨界帶寬,以此來模擬人耳的掩蔽效應(yīng)。濾波器組的示意圖如圖3所示。
圖3 梅爾濾波器組示意圖
濾波器頻率響應(yīng)為:
(7)
式中:Hm(k)為通過梅爾濾波器后的響應(yīng)結(jié)果,k為第m個三角濾波器的譜線索引號,f(m)為各個三角濾波器的中心頻率。
計算每個濾波器組輸出的能量:
(8)
式中:H(m)為每個濾波器輸出的能量值,M為濾波器總數(shù)。
為了去除各維信號之間的相關(guān)性,對能量的對數(shù)做離散余弦變換,得到MFCC參數(shù),其中i為數(shù)據(jù)的幀號,l為第i幀的第l列:
(9)
式中:cmfcc(i)為MFCC參數(shù)。
標準的倒譜參數(shù)只反映了語音參數(shù)的靜態(tài)特性,語音的動態(tài)特性可以用靜態(tài)特征的差分參數(shù)來描述:
(10)
式中:dt為第t個一階差分,cmfcc(i+l)、cmfcc(i-l) 為當前語音幀的相鄰前后幀MFCC參數(shù)。
將一階差分的結(jié)果再代入式(10)中就可以得到二階差分的參數(shù)。最后將幀能量也加入到MFCC特征中,即MFCC特征是由MFCC參數(shù)、一階差分參數(shù)、二階差分參數(shù)和幀能量組成的。
若系統(tǒng)在時間t的狀態(tài)只與其在時間(t-1)的狀態(tài)相關(guān),那么可以將系統(tǒng)構(gòu)建成一個離散的一階馬爾科夫鏈(Markov chain)。若只考慮獨立于時間t的隨機過程:
P(qt=si|qt-1=sj)=aiji,j∈[1,N]
(11)
則該過程為馬爾科夫模型。式中qt為系統(tǒng)在時間t的狀態(tài);s為系統(tǒng)所有狀態(tài)分類中的某個狀態(tài);P(qt)為系統(tǒng)相對于時間t處于某個狀態(tài)的概率;aij為轉(zhuǎn)移概率。在馬爾科夫模型中,每個狀態(tài)代表了一個可觀察的事件。在實際應(yīng)用中,如果模型所經(jīng)過的狀態(tài)序列是未知的,只知道狀態(tài)的概率函數(shù),那么該模型是一個雙重的隨機過程。其中模型的轉(zhuǎn)換狀態(tài)是隱蔽的,可觀察事件的隨機過程是隱蔽狀態(tài)轉(zhuǎn)換過程的隨機函數(shù)[5]。
混合高斯隨機變量的分布非常適合描述語音序列的MFCC特征,用GMM建模聲學特征O1,O2,…,On,每一個特征是由一個音素確定的,不同特征可以按狀態(tài)進行聚類。假設(shè)聲學特征的概率P(O|sI)服從正態(tài)分布,則O1,O2,…,On就是一個混合高斯模型的下采樣值。
由于在HMM中音素被表示為隱狀態(tài),即每一個特征是由某幾個狀態(tài)確定的,不同音素特征可以按狀態(tài)來聚類,因此將GMM整合進HMM中來擬合基于狀態(tài)的輸出分布。
首先將語音樣本集中的每個語音樣本組隨機抽出10%的樣本數(shù)量作為測試集,然后對訓練集和測試集中語音樣本的MFCC特征和樣本序號進行分類標號。
本文使用hmmlearn框架中的GMMHMM類建立孤立詞識別模型。步驟如下:建立模型組列表;對每一個語音指令建立模型;設(shè)置每個音節(jié)的狀態(tài)數(shù)目為3,每個音節(jié)的特征由3個混合高斯成分的GMM表示,每一個狀態(tài)由一個對角協(xié)方差矩陣表示,最大迭代次數(shù)為10次,每次通過迭代學習更新狀態(tài)轉(zhuǎn)移概率、每個高斯成分的均值、每個高斯成分協(xié)方差以及每個高斯成分的權(quán)重。
模型組建立完成后使用GMMHMM.fit()函數(shù)對訓練集樣本的特征進行訓練,流程如下:
1)對語音信號的每個音素分別使用HMM-GMM進行三狀態(tài)建模,其中HMM的發(fā)射概率使用高斯分布函數(shù)建模。
2)初始化對齊。將語音信號的幀平均對應(yīng)到每個狀態(tài)。
3)更新模型參數(shù)。將統(tǒng)計獲得的每個狀態(tài)的轉(zhuǎn)移次數(shù),除以總轉(zhuǎn)移次數(shù),獲得每個狀態(tài)的轉(zhuǎn)移概率。
4)使用維特比算法,根據(jù)上一步得到的轉(zhuǎn)移概率和條件概率,重新對語音信號進行狀態(tài)級別的對齊。
5)重復步驟3)和4),直至收斂。
6)保存訓練完成的模型。
首先使用語音樣本組中隨機抽出的測試集對訓練完成的模型進行測試。將測試集語音樣本的MFCC特征放入模型組中,使用score()函數(shù)獲取該語音特征在每個語音模型上的得分。然后選取最高得分的模型與測試語音的標簽進行比對,并統(tǒng)計正確率。
S7協(xié)議是西門子PLC通信的核心協(xié)議,它是一種位于傳輸層上的通信協(xié)議[6],傳輸層為ISO-On-TCP協(xié)議,依賴于網(wǎng)絡(luò)層的IP協(xié)議,其物理層/數(shù)據(jù)鏈路層可以是MPI總線、PROFIBUS總線或者工業(yè)以太網(wǎng)。
PLC的數(shù)據(jù)存儲通過“變量”的形式與存儲區(qū)間關(guān)聯(lián),分為輸入(I)、輸出(O)、位存儲(M)和數(shù)據(jù)塊(DB)[7]。程序在訪問對應(yīng)的存儲區(qū)時,是通過訪問CPU的過程映像對相應(yīng)地址進行操作的。
snap7 是一個基于以太網(wǎng)與S7系列的西門子PLC通訊的開源庫,封裝了S7通信的底層協(xié)議,可使用普通電腦通過編程與西門子S7系列PLC進行通信。支持S7系列的S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太網(wǎng)通信。
PLC作為服務(wù)器端,基于TCP協(xié)議,PC端使用snap7作為客戶端進行網(wǎng)絡(luò)連接。PC與PLC需要處于同一網(wǎng)段,并且需要將連接的端口設(shè)置為2號端口,以避免與PLC連接的其他設(shè)備沖突。
PLC所執(zhí)行命令操作的原理是修改對應(yīng)寄存器地址中的數(shù)據(jù)。選擇snap7庫中的Client模式,Client模式里提供了讀寫PLC存儲區(qū)的函數(shù):client.read_area(area, dbnumber, start, size)和client.write_area(area, dbnumber, start, size)。area為snap7的地址;dbnumber為數(shù)據(jù)塊地址編號;start為讀寫字節(jié)的起始地址;size為讀寫的數(shù)據(jù)類型所占字節(jié)長度。其中參數(shù)area地址類型(十六進制類型)與PLC存儲區(qū)的映射關(guān)系如表1所示。
表1 參數(shù)area與PLC存儲區(qū)映射關(guān)系
通過使用snap7庫中的函數(shù)client.read_area()和client.write_area()可對PLC的輸入輸出寄存器數(shù)據(jù)中的數(shù)據(jù)進行讀取和寫入。對于V和M存儲區(qū),則需要使用函數(shù)client.db_read()和client.db_write()對V和M存儲區(qū)變量進行讀寫操作,其參數(shù)與使用方法同讀寫輸入輸出寄存器。
語音標簽首先匹配snap7的函數(shù),再通過函數(shù)對PLC存儲區(qū)的數(shù)據(jù)進行讀寫,從而建立起語音模型到PLC數(shù)據(jù)的連接。
第3節(jié)訓練完成的語音模型由若干條語音指令組成,首先建立語音指令標簽,標簽數(shù)量需等于語音指令數(shù)目,將標簽號與語音指令一一對應(yīng);然后通過語音指令的內(nèi)容,將語音指令的標簽按照讀、寫功能進行第一次分類,再按照需要修改的PLC存儲區(qū)位置進行第二次分類,經(jīng)過兩次分類可以確定語音指令標簽所調(diào)用的snap7函數(shù);最后根據(jù)PLC存儲區(qū)變量的地址確定snap7函數(shù)的參數(shù)值。
為了保證語音指令能與語音樣本模型達到良好的匹配度,語音指令的采集及預(yù)處理使用和語音樣本一樣的設(shè)置及處理流程,即以16 kHz采樣幀率、2.5 s時長采集單個語音指令,使用譜減法去除噪聲,采用端點檢測去除音頻兩端的空白部分,最后計算出MFCC特征。
創(chuàng)建語音指令特征在模型組中每個語音模型的匹配分數(shù)列表;加載訓練完成的模型組,使用score()函數(shù)獲取實時語音特征在每個語音模型上的得分,并存入預(yù)測分數(shù)列表;篩選出分數(shù)最高的模型,得到該模型對應(yīng)的語音標簽。
PC端作為客戶端與PLC建立連接,判斷語音標簽所對應(yīng)的函數(shù)、對應(yīng)PLC寄存器的地址和參數(shù);根據(jù)第4節(jié)建立的語音標簽與PLC存儲區(qū)的連接,調(diào)用對應(yīng)的函數(shù)對PLC寄存器數(shù)據(jù)進行修改,實現(xiàn)對PLC的控制。
本文設(shè)計了7個語音指令,分別為“CPU RUN”“Q0.0輸出”“Q0.0復位”“綠燈打開”“綠燈關(guān)閉”“紅燈閃爍5次”“急?!?每個語音指令進行30次錄音,以語音樣本加序號進行命名并保存;每個語音樣本隨機抽出3條語音指令作為測試集,其余的組成訓練集;對所有的原始語音樣本進行預(yù)處理并計算MFCC特征。
本文試驗用PLC使用西門子S7-smart系列的ST40 CPU模塊。CPU模塊的運行指示燈對應(yīng)語音指令“CPU RUN”,輸出DQa組第1個輸出點對應(yīng)“Q0.0”,輸出DQa組第2個輸出點對應(yīng)“綠燈”狀態(tài),輸出DQa組第3個輸出點對應(yīng)“紅燈”狀態(tài),“急?!睍rDQ輸出組全部復位。
對采集到的語音指令的MFCC特征建模進行迭代訓練,并對訓練完成的模型進行保存。部分語音模型訓練迭代收斂情況如圖4所示。
語音指令為“Q0.0輸出”時,CPU模塊DQa狀態(tài)如圖5所示。
圖5 CPU模塊DQa狀態(tài)圖
試驗時按照隨機順序說出語音指令,每個指令試驗15次,觀察PLC執(zhí)行的動作并記錄。表2為試驗結(jié)果統(tǒng)計。
實時語音指令控制PLC的試驗,進行了總計105次測試,總體成功率達到92.4%??梢姳疚奶岢龅姆椒梢詽M足一些精確度要求不高的PLC控制要求。
分析試驗結(jié)果可知,語音指令發(fā)音相近的情況下容易出現(xiàn)識別錯誤,主要原因可能是因為起到區(qū)分性作用的特征在序列上整體位置比較靠后,在模型訓練中計算概率是由狀態(tài)轉(zhuǎn)移概率乘以觀測值的概率,所以在序列后端計算出的概率就非常小,導致區(qū)分性不強。在后續(xù)的改進中考慮在計算概率時加入正則項,以防止出現(xiàn)序列后端概率數(shù)值過低的問題。另外,考慮增加冗余的語音指令模型組,共同對輸入的語音指令進行識別,以增強語音識別的容錯性。
針對傳統(tǒng)工業(yè)領(lǐng)域控制方式引發(fā)的問題,本文基于GMM-HMM語音模型,提出了一種通過語音指令控制PLC的方法。該方法通過采集語音指令樣本,對模型加以訓練,建立語音指令和PLC寄存器之間的映射,將按鈕、按鍵等工業(yè)控制手段替換成對操作人員更為友好的語音指令,完成對工業(yè)設(shè)備的控制。相較于傳統(tǒng)的控制方式,降低了操作的復雜程度,為工業(yè)控制模式增加了新的方式和思路。