基於TensorflowLite的人聲識別在端上的實現

閒魚技術發表於2018-10-19

摘要:現有的人聲識別絕大部分在服務端實現,這會帶來如下兩方面的問題:

1)    當網路較差的情況下會造成較大的延時,帶來較差的使用者體驗。

2)    當訪問量較大的情況下,會大量佔用服務端資源。

為解決以上兩個問題,我們選擇在客戶端上實現人聲識別功能。本文使用機器學習的方法識別人聲。採用的框架是谷歌的tensorflowLite框架,該框架跟它的名字一樣具有小巧的特點。在保證精度的同時,框架的大小隻有300KB左右,且經過壓縮後產生的模型是tensorflow模型的四分之一[1]。因此,tensorflowLite框架比較適合在客戶端上使用。

為了提高人聲的識別率,需要提取音訊特徵作為機器學習框架的輸入樣本。本文使用的特徵提取演算法是基於人耳聽覺機理的梅爾倒頻譜演算法[2]

由於在客戶端上使用人聲識別比較耗時,在工程上需要做很多優化,優化方面如下:

1) 指令集加速:引入arm指令集,做多指令集優化,加速運算。

2) 多執行緒加速:對於耗時的運算採用多執行緒併發處理。

3) 模型加速:選用支援NEON優化的模型,並預載入模型減少預處理時間。

4) 演算法加速:I) 降低音訊取樣率。II) 選取人聲頻段(20hz~20khz),剔除非人聲頻段。

                     III) 合理分窗和切片,防止過度計算。IV) 靜音檢測,減少不必要的時間片段。

1.概述

1.1 人聲識別流程

人聲識別分為訓練和預測兩個部分。訓練指的是生成預測模型,預測是利用模型產生預測結果。

首先介紹下訓練的過程,分為以下三個部分:

1) 基於梅爾倒頻譜演算法,提取聲音特徵,並將其轉換成頻譜圖片。

2) 將人聲頻譜作為正樣本,動物聲音和雜音等非人聲作為負樣本,交由神經網路模型    訓練。

3) 基於訓練產生的檔案,生成端上可執行的預測模型。

簡而言之,人聲識別訓練的流程分為三個部分,提取聲音特徵,模型訓練和生成端上模型。最後,是人聲識別的部分:先提取聲音特徵,然後載入訓練模型即可獲得預測結果。

1.2 人工智慧框架

2017年11月,谷歌曾在 I/O 大會上宣佈推出 TensorFlow Lite,這是一款 TensorFlow 用於移動裝置和嵌入式裝置的輕量級解決方案。可以在多個平臺上執行,從機架式伺服器到小型 IoT 裝置。但是隨著近年來機器學習模型的廣泛使用,出現了在移動和嵌入式裝置上部署它們的需求。而 TensorFlow Lite 允許裝置端的機器學習模型的低延遲推斷。

本文基於的tensorflowLite是谷歌研發的人工智慧學習系統,其命名來源於本身的執行原理。Tensor張量)意味著N維陣列,Flow(流)意味著基於資料流圖的計算,TensorFlow為張量從流圖的一端流動到另一端計算過程。TensorFlow是將複雜的資料結構傳輸至人工智慧神經網中進行分析和處理過程的系統。

下圖展示了tensorflowLite的架構設計[1]

基於TensorflowLite的人聲識別在端上的實現圖1.1 TFlite架構圖

2.梅爾倒頻譜演算法

2.1 概述

本章中聲音識別的演算法--梅爾倒頻譜演算法[2]分為如下幾步,將會再後續小節中詳細介紹。

1) 輸入聲音檔案,解析成原始的聲音資料(時域訊號)。

2) 通過短時傅立葉變換,加窗分幀將時域訊號轉變為頻域訊號。

3) 通過梅爾頻譜變換,將頻率轉換成人耳能感知的線性關係。

4) 通過梅爾倒譜分析,採用DCT變換將直流訊號分量和正弦訊號分量分離[3]

5) 提取聲音訊譜特徵向量,將向量轉換成影像。

加窗分幀是為了滿足語音在時域的短時平穩特性,梅爾頻譜變換是為了將人耳對頻率的感知度轉化為線性關係,倒譜分析的重點是理解傅立葉變換,任何訊號都可以通過傅立葉變換而分解成一個直流分量和若干個正弦訊號的和。

基於TensorflowLite的人聲識別在端上的實現

圖2.1 聲音的時域訊號

圖2.1是聲音的時域訊號,直觀上很難看出頻率變化規律。圖2.2是聲音的頻域訊號,反映了能夠反映出聲音的音量和頻率等資訊。圖2.3是經過梅爾倒頻譜的聲音特徵,能夠提取聲音

基於TensorflowLite的人聲識別在端上的實現

圖2.2 聲音的頻域訊號

基於TensorflowLite的人聲識別在端上的實現

圖2.3 聲音的倒頻譜特徵

基於TensorflowLite的人聲識別在端上的實現圖2.4 梅爾倒頻譜演算法實現流程

2.2 短時傅立葉變換

聲音訊號是一維的時域訊號,直觀上很難看出頻率變化規律。如果通過傅立葉變換把它變到頻域上,雖然可以看出訊號的頻率分佈,但是丟失了時域資訊,無法看出頻率分佈隨時間的變化。為了解決這個問題,很多時頻分析手段應運而生。短時傅立葉,小波,Wigner分佈等都是常用的時頻域分析方法。

基於TensorflowLite的人聲識別在端上的實現

圖2.5 FFT變換和STFT變換示意圖

通過傅立葉變換可以得到訊號的頻譜。訊號的頻譜的應用非常廣泛,訊號的壓縮、降噪都可以基於頻譜。然而傅立葉變換有一個假設,那就是訊號是平穩的,即訊號的統計特性不隨時間變化。聲音訊號就不是平穩訊號,在很長的一段時間內,有很多訊號會出現,然後立即消失。如果將這訊號全部進行傅立葉變換,就不能反映聲音隨時間的變化。

本文采用的短時傅立葉變換(STFT)是最經典的時頻域分析方法。短時傅立葉變換(STFT)是和傅立葉變換(FT)相關的一種數學變換,用以確定時變訊號其區域性區域正弦波的頻率與相位。它的思想是:選擇一個時頻區域性化的窗函式,假定分析窗函式h(t)在一個短時間間隔內是平穩的,使f(t)h(t)在不同的有限時間寬度內是平穩訊號,從而計算出各個不同時刻的功率譜。短時傅立葉變換使用一個固定的窗函式,通常使用的窗函式有漢寧窗、海明窗、Blackman-Haris窗等。本文中採用了海明窗,海明窗是一種餘弦窗,能夠很好地反映某一時刻能量隨時間的衰減關係。

因此,本文的STFT公式在原先傅立葉變換公式:公式的基礎上加了窗函式,因此STFT公式變換為

其中,為海明窗函式。

基於TensorflowLite的人聲識別在端上的實現

圖2.6 基於海明窗的STFT變換

2.3 梅爾頻譜

聲譜圖往往是很大的一張圖,為了得到合適大小的聲音特徵,往往把它通過梅爾標度濾波器組,變換為梅爾頻譜。什麼是梅爾濾波器組呢?這裡要從梅爾標度說起。

梅爾標度,由Stevens,Volkmann和Newman在1937年命名。我們知道,頻率的單位是赫茲(Hz),人耳能聽到的頻率範圍是20-20000Hz,但人耳對Hz這種標度單位並不是線性感知關係。例如如果我們適應了1000Hz的音調,如果把音調頻率提高到2000Hz,我們的耳朵只能覺察到頻率提高了一點點,根本察覺不到頻率提高了一倍。如果將普通的頻率標度轉化為梅爾頻率標度,對映關係如下式所示: 

經過上述公式,則人耳對頻率的感知度就成了線性關係[4]。也就是說,在梅爾標度下,如果兩段語音的梅爾頻率相差兩倍,則人耳可以感知到的音調大概也相差兩倍。

讓我們觀察一下從Hz到梅爾頻率(mel)的對映圖,由於它們是log的關係,當頻率較小時,梅爾頻率隨Hz變化較快;當頻率很大時,梅爾頻率的上升很緩慢,曲線的斜率很小。這說明了人耳對低頻音調的感知較靈敏,在高頻時人耳是很遲鈍的,梅爾標度濾波器組啟發於此。 

基於TensorflowLite的人聲識別在端上的實現

圖2.7 頻率轉梅爾頻率示意圖

如下圖所示,12個三角濾波器組成濾波器組,低頻處濾波器密集,門限值大,高頻處濾波器稀疏,門限值低。恰好對應了頻率越高人耳越遲鈍這一客觀規律。上圖所示的濾波器形式叫做等面積梅爾濾波器(Mel-filter bank with same bank area),在人聲領域(語音識別,說話人辨認)等領域應用廣泛。

基於TensorflowLite的人聲識別在端上的實現

圖2.8 梅爾濾波器組示意圖

2.4 梅爾倒頻譜

基於2.3的梅爾對數譜,採用DCT變換將直流訊號分量和正弦訊號分量分離,最後得到的結果稱為梅爾倒頻譜。

其中,

由於梅爾倒頻譜輸出的是向量,還不能用圖片顯示,需要將其轉換成影像矩陣。需要將輸出向量的範圍線性變換到影像的範圍

基於TensorflowLite的人聲識別在端上的實現

圖2.9 繪圖顏色標度示意圖

2.5 演算法處理速度優化

由於演算法需要在客戶端上實現,因此需要對速度做一定的改進[5]。優化方面如下:

1) 指令集加速:由於演算法有大量的加法和乘法矩陣運算,因此引入arm指令集,做多指令集優化,加速運算。速度可以提高4~8倍[6]

2) 演算法加速:I) 選取人聲頻段(20HZ~20KHZ),並剔除非人聲頻段減少冗餘計算。II)降低音訊取樣率,由於人耳對過高的取樣率不敏感,因此降低取樣率        可以減少不必要的資料計算。III)合理分窗和切片,防止過度計算。IV) 靜音檢測,減少不必要的時間片段。

3) 取樣頻率加速:如果音訊的取樣頻率過高,選擇下采樣,處理的頻率最高設定為32kHZ。

4) 多執行緒加速:將音訊拆分為多個片段,採用多執行緒並行處理。並根據機器的能力配置執行緒數,預設為4個執行緒。

基於TensorflowLite的人聲識別在端上的實現

圖2.10 演算法工程端選取的引數

3.人聲識別模型

3.1模型選擇

卷積神經網路(Convolutional Neural Networks-簡稱CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影像處理有出色表現。

20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於區域性敏感和方向選擇的神經元時發現其獨特的網路結構可以有效地降低反饋神經網路的複雜性,繼而提出了卷積神經網路。現在,CNN已經成為眾多科學領域的研究熱點之一,特別是在模式分類領域,由於該網路避免了對影像的複雜前期預處理,可以直接輸入原始影像,因而得到了更為廣泛的應用。 K.Fukushima在1980年提出的新識別機是卷積神經網路的第一個實現網路。隨後,更多的科研工作者對該網路進行了改進。其中,具有代表性的研究成果是Alexander和Taylor提出的“改進認知機”,該方法綜合了各種改進方法的優點並避免了耗時的誤差反向傳播。

一般地,CNN的基本結構包括兩層,其一為特徵提取層,每個神經元的輸入與前一層的區域性接受域相連,並提取該區域性的特徵。一旦該區域性特徵被提取後,它與其它特徵間的位置關係也隨之確定下來;其二是特徵對映層,網路的每個計算層由多個特徵對映組成,每個特徵對映是一個平面,平面上所有神經元的權值相等。特徵對映結構採用影響函式核小的sigmoid, relu等函式作為卷積網路的啟用函式,使得特徵對映具有位移不變性。此外,由於一個對映面上的神經元共享權值,因而減少了網路自由引數的個數。卷積神經網路中的每一個卷積層都緊跟著一個用來求區域性平均與二次提取的計算層,這種特有的兩次特徵提取結構減小了特徵解析度。

CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由於CNN的特徵檢測層通過訓練資料進行學習,所以在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練資料中進行學習;再者由於同一特徵對映面上的神經元權值相同,所以網路可以並行學習,這也是卷積網路相對於神經元彼此相連網路的一大優勢。卷積神經網路以其區域性權值共享的特殊結構在語音識別影像處理方面有著獨特的優越性,其佈局更接近於實際的生物神經網路,權值共享降低了網路的複雜性,特別是多維輸入向量的影像可以直接輸入網路這一特點避免了特徵提取和分類過程中資料重建的複雜度。

基於TensorflowLite的人聲識別在端上的實現

圖3.1 Inception-v3模型

本文選取了精度較高的Inception-v3模型作為人聲識別的模型,v3一個最重要的改進是分解,將7x7卷積網路分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算,使得網路深度進一步增加,增加了網路的非線性,還有值得注意的地方是網路輸入從224x224變為了299x299,更加精細設計了35x35/17x17/8x8的模組。

使用tensorflow session模組可以實現程式碼層面的訓練和預測功能,具體使用方法詳見tensorflow官網[10]

基於TensorflowLite的人聲識別在端上的實現

圖3.2 tensorflow session使用示意圖

3.2模型樣本

有監督的機器學習中,一般需要將樣本分成獨立的三部分訓練集(train set),驗證集(validation set)和測試集(test set)。其中訓練集用來估計模型,驗證集用來確定網路結構或者控制模型複雜程度的引數,而測試集則檢驗最終選擇最優的模型的效能如何。

具體定義如下:

訓練集:學習樣本資料集,通過匹配一些引數來建立一個分類器。建立一種分類的方式,主要是用來訓練模型的。

驗證集:對學習出來的模型,調整分類器的引數,如在神經網路中選擇隱藏單元數。驗證集還用來確定網路結構或者控制模型複雜程度的引數,用來防止模型過擬合現象。

測試集:主要是測試訓練好的模型的分辨能力(識別率等)

根據第二章的梅爾倒頻譜演算法可以得到聲音識別的樣本檔案,將人聲頻譜作為正樣本,動物聲音和雜音等非人聲作為負樣本,交由Inception-v3模型進行訓練。

本文采用了tensorflow作為訓練框架,選取人聲和非人聲各5000個樣本作為測試集,1000個樣本作為驗證集

3.3 模型訓練

樣本準備完成後,即可使用Inception-v3模型訓練。當訓練模型收斂時,即可生成端上可使用的pb模型。模型選取時選擇編譯armeabi-v7a或者以上版本即可預設開啟NEON優化,即開啟USE_NEON的巨集,能夠達到指令集加速的效果。例如CNN網路一半以上的運算都在卷積(conv)運算,使用指令集優化可以至少加速4倍。

基於TensorflowLite的人聲識別在端上的實現

圖3.3 卷積處理函式

然後經過tensorflow提供的toco工具生成lite模型,該模型可以直接在客戶端上使用tensorflowLite框架呼叫。

基於TensorflowLite的人聲識別在端上的實現

圖3.4 toco工具呼叫介面

3.4 模型預測

對聲音檔案使用梅爾倒頻譜演算法提取特徵,並生成預測圖片。之後使用訓練產生的lite模型即可預測,預測結果示意圖如下:

基於TensorflowLite的人聲識別在端上的實現

圖3.5 模型預測結果

相關文章