基於TensorflowLite的人聲識別在端上的實現
摘要:現有的人聲識別絕大部分在服務端實現,這會帶來如下兩方面的問題:
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] :
圖1.1 TFlite架構圖
2. 梅爾倒頻譜演算法
2.1 概述
本章中聲音識別的演算法--梅爾倒頻譜演算法 [2] 分為如下幾步,將會再後續小節中詳細介紹。
1) 輸入聲音檔案,解析成原始的聲音資料(時域訊號)。
2) 通過短時傅立葉變換,加窗分幀將時域訊號轉變為頻域訊號。
3) 通過梅爾頻譜變換,將頻率轉換成人耳能感知的線性關係。
4) 通過梅爾倒譜分析,採用DCT變換將直流訊號分量和正弦訊號分量分離 [3] 。
5) 提取聲音訊譜特徵向量,將向量轉換成影象。
加窗分幀是為了滿足語音在時域的短時平穩特性,梅爾頻譜變換是為了將人耳對頻率的感知度轉化為線性關係,倒譜分析的重點是理解傅立葉變換,任何訊號都可以通過傅立葉變換而分解成一個直流分量和若干個正弦訊號的和。
圖2.1 聲音的時域訊號
圖2.1是聲音的時域訊號,直觀上很難看出頻率變化規律。圖2.2是聲音的頻域訊號,反映了能夠反映出聲音的音量和頻率等資訊。圖2.3是經過梅爾倒頻譜的聲音特徵,能夠提取聲音
圖2.2 聲音的頻域訊號
圖2.3 聲音的倒頻譜特徵
圖2.4 梅爾倒頻譜演算法實現流程
2.2 短時傅立葉變換
聲音訊號是一維的時域訊號,直觀上很難看出頻率變化規律。如果通過傅立葉變換把它變到頻域上,雖然可以看出訊號的頻率分佈,但是丟失了時域資訊,無法看出頻率分佈隨時間的變化。為了解決這個問題,很多時頻分析手段應運而生。短時傅立葉,小波,Wigner分佈等都是常用的時頻域分析方法。
圖2.5 FFT變換和STFT變換示意圖
通過傅立葉變換可以得到訊號的頻譜。訊號的頻譜的應用非常廣泛,訊號的壓縮、降噪都可以基於頻譜。然而傅立葉變換有一個假設,那就是訊號是平穩的,即訊號的統計特性不隨時間變化。聲音訊號就不是平穩訊號,在很長的一段時間內,有很多訊號會出現,然後立即消失。如果將這訊號全部進行傅立葉變換,就不能反映聲音隨時間的變化。
本文采用的短時傅立葉變換(STFT)是最經典的時頻域分析方法。短時傅立葉變換(STFT)是和傅立葉變換(FT)相關的一種數學變換,用以確定時變訊號其區域性區域正弦波的頻率與相位。它的思想是:選擇一個時頻區域性化的窗函式,假定分析窗函式h(t)在一個短時間間隔內是平穩的,使f(t)h(t)在不同的有限時間寬度內是平穩訊號,從而計算出各個不同時刻的功率譜。短時傅立葉變換使用一個固定的窗函式,通常使用的窗函式有漢寧窗、海明窗、Blackman-Haris窗等。本文中採用了海明窗,海明窗是一種餘弦窗,能夠很好地反映某一時刻能量隨時間的衰減關係。
因此,本文的STFT公式在原先傅立葉變換公式:公式的基礎上加了窗函式,因此STFT公式變換為
其中,為海明窗函式。
圖2.6 基於海明窗的STFT變換
2.3 梅爾頻譜
聲譜圖往往是很大的一張圖,為了得到合適大小的聲音特徵,往往把它通過梅爾標度濾波器組,變換為梅爾頻譜。什麼是梅爾濾波器組呢?這裡要從梅爾標度說起。
梅爾標度,由Stevens,Volkmann和Newman在1937年命名。我們知道,頻率的單位是赫茲(Hz),人耳能聽到的頻率範圍是20-20000Hz,但人耳對Hz這種標度單位並不是線性感知關係。例如如果我們適應了1000Hz的音調,如果把音調頻率提高到2000Hz,我們的耳朵只能覺察到頻率提高了一點點,根本察覺不到頻率提高了一倍。如果將普通的頻率標度轉化為梅爾頻率標度,對映關係如下式所示:
經過上述公式,則人耳對頻率的感知度就成了線性關係 [4] 。也就是說,在梅爾標度下,如果兩段語音的梅爾頻率相差兩倍,則人耳可以感知到的音調大概也相差兩倍。
讓我們觀察一下從Hz到梅爾頻率(mel)的對映圖,由於它們是log的關係,當頻率較小時,梅爾頻率隨Hz變化較快;當頻率很大時,梅爾頻率的上升很緩慢,曲線的斜率很小。這說明了人耳對低頻音調的感知較靈敏,在高頻時人耳是很遲鈍的,梅爾標度濾波器組啟發於此。
圖2.7 頻率轉梅爾頻率示意圖
如下圖所示,12個三角濾波器組成濾波器組,低頻處濾波器密集,門限值大,高頻處濾波器稀疏,門限值低。恰好對應了頻率越高人耳越遲鈍這一客觀規律。上圖所示的濾波器形式叫做等面積梅爾濾波器(Mel-filter bank with same bank area),在人聲領域(語音識別,說話人辨認)等領域應用廣泛。
圖2.8 梅爾濾波器組示意圖
2.4 梅爾倒頻譜
基於2.3的梅爾對數譜,採用DCT變換將直流訊號分量和正弦訊號分量分離,最後得到的結果稱為梅爾倒頻譜。
其中,
由於梅爾倒頻譜輸出的是向量,還不能用圖片顯示,需要將其轉換成影象矩陣。需要將輸出向量的範圍線性變換到影象的範圍
圖2.9 繪圖顏色標度示意圖
2.5 演算法處理速度優化
由於演算法需要在客戶端上實現,因此需要對速度做一定的改進 [5] 。優化方面如下:
1) 指令集加速:由於演算法有大量的加法和乘法矩陣運算,因此引入arm指令集,做多指令集優化,加速運算。速度可以提高4~8倍 [6] 。
2) 演算法加速:I) 選取人聲頻段(20HZ~20KHZ),並剔除非人聲頻段減少冗餘計算。II)降低音訊取樣率,由於人耳對過高的取樣率不敏感,因此降低取樣率 可以減少不必要的資料計算。III)合理分窗和切片,防止過度計算。IV) 靜音檢測,減少不必要的時間片段。
3) 取樣頻率加速:如果音訊的取樣頻率過高,選擇下采樣,處理的頻率最高設定為32kHZ。
4) 多執行緒加速:將音訊拆分為多個片段,採用多執行緒並行處理。並根據機器的能力配置執行緒數,預設為4個執行緒。
圖2.10 演算法工程端選取的引數
3. 人聲識別模型
3.1 模型選擇
卷積神經網路(ConvolutionalNeural Networks-簡稱CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影象處理有出色表現。
20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於區域性敏感和方向選擇的神經元時發現其獨特的網路結構可以有效地降低反饋神經網路的複雜性,繼而提出了卷積神經網路。現在,CNN已經成為眾多科學領域的研究熱點之一,特別是在模式分類領域,由於該網路避免了對影象的複雜前期預處理,可以直接輸入原始影象,因而得到了更為廣泛的應用。 K.Fukushima在1980年提出的新識別機是卷積神經網路的第一個實現網路。隨後,更多的科研工作者對該網路進行了改進。其中,具有代表性的研究成果是Alexander和Taylor提出的“改進認知機”,該方法綜合了各種改進方法的優點並避免了耗時的誤差反向傳播。
一般地,CNN的基本結構包括兩層,其一為特徵提取層,每個神經元的輸入與前一層的區域性接受域相連,並提取該區域性的特徵。一旦該區域性特徵被提取後,它與其它特徵間的位置關係也隨之確定下來;其二是特徵對映層,網路的每個計算層由多個特徵對映組成,每個特徵對映是一個平面,平面上所有神經元的權值相等。特徵對映結構採用影響函式核小的sigmoid, relu等函式作為卷積網路的啟用函式,使得特徵對映具有位移不變性。此外,由於一個對映面上的神經元共享權值,因而減少了網路自由引數的個數。卷積神經網路中的每一個卷積層都緊跟著一個用來求區域性平均與二次提取的計算層,這種特有的兩次特徵提取結構減小了特徵解析度。
CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由於CNN的特徵檢測層通過訓練資料進行學習,所以在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練資料中進行學習;再者由於同一特徵對映面上的神經元權值相同,所以網路可以並行學習,這也是卷積網路相對於神經元彼此相連網路的一大優勢。卷積神經網路以其區域性權值共享的特殊結構在語音識別和影象處理方面有著獨特的優越性,其佈局更接近於實際的生物神經網路,權值共享降低了網路的複雜性,特別是多維輸入向量的影象可以直接輸入網路這一特點避免了特徵提取和分類過程中資料重建的複雜度。
圖3.1 Inception-v3模型
本文選取了精度較高的Inception-v3模型作為人聲識別的模型,v3一個最重要的改進是分解,將7x7卷積網路分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算,使得網路深度進一步增加,增加了網路的非線性,還有值得注意的地方是網路輸入從224x224變為了299x299,更加精細設計了35x35/17x17/8x8的模組。
使用tensorflow session模組可以實現程式碼層面的訓練和預測功能,具體使用方法詳見tensorflow官網 [10] 。
圖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倍。
圖3.3 卷積處理函式
然後經過tensorflow提供的toco工具生成lite模型,該模型可以直接在客戶端上使用tensorflowLite框架呼叫。
圖3.4 toco工具呼叫介面
3.4 模型預測
對聲音檔案使用梅爾倒頻譜演算法提取特徵,並生成預測圖片。之後使用訓練產生的lite模型即可預測,預測結果示意圖如下:
圖3.5 模型預測結果
ofollow,noindex">閒魚技術
加入閒魚,一起玩些酷的。(阿里巴巴集團閒魚官方技術號,歡迎同道者技術交流。) 簡歷投遞:[email protected]
工程 人聲識別 TensorflowLite
相關資料
Artificial Intelligence
在學術研究領域,人工智慧通常指能夠感知周圍環境並採取行動以實現最優的可能結果的智慧體(intelligent agent)
來源: Russell, S., & Norvig, P. (2003). Artificial Intelligence: A Modern Approach.
Neural Network
(人工)神經網路是一種起源於 20 世紀 50 年代的監督式機器學習模型,那時候研究者構想了「感知器(perceptron)」的想法。這一領域的研究者通常被稱為「聯結主義者(Connectionist)」,因為這種模型模擬了人腦的功能。神經網路模型通常是通過反向傳播演算法應用梯度下降訓練的。目前神經網路有兩大主要型別,它們都是前饋神經網路:卷積神經網路(CNN)和迴圈神經網路(RNN),其中 RNN 又包含長短期記憶(LSTM)、門控迴圈單元(GRU)等等。深度學習是一種主要應用於神經網路幫助其取得更好結果的技術。儘管神經網路主要用於監督學習,但也有一些為無監督學習設計的變體,比如自動編碼器和生成對抗網路(GAN)。
來源:機器之心
Convergence
在數學,電腦科學和邏輯學中,收斂指的是不同的變換序列在有限的時間內達到一個結論(變換終止),並且得出的結論是獨立於達到它的路徑(他們是融合的)。 通俗來說,收斂通常是指在訓練期間達到的一種狀態,即經過一定次數的迭代之後,訓練損失和驗證損失在每次迭代中的變化都非常小或根本沒有變化。也就是說,如果採用當前資料進行額外的訓練將無法改進模型,模型即達到收斂狀態。在深度學習中,損失值有時會在最終下降之前的多次迭代中保持不變或幾乎保持不變,暫時形成收斂的假象。
Feed-forward neural network
前饋神經網路(FNN)是人工智慧領域中最早發明的簡單人工神經網路型別。在它內部,引數從輸入層經過隱含層向輸出層單向傳播。與遞迴神經網路不同,在它內部不會構成有向環。FNN由一個輸入層、一個(淺層網路)或多個(深層網路,因此叫作深度學習)隱藏層,和一個輸出層構成。每個層(除輸出層以外)與下一層連線。這種連線是 FNN 架構的關鍵,具有兩個主要特徵:加權平均值和啟用函式。
來源:機器之心
Convolutional neural network
卷積神經網路(Convolutional Neural Network, CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影象處理有出色表現。卷積神經網路由一個或多個卷積層和頂端的全連通層(對應經典的神經網路)組成,同時也包括關聯權重和池化層(pooling layer)。這一結構使得卷積神經網路能夠利用輸入資料的二維結構。與其他深度學習結構相比,卷積神經網路在影象和語音識別方面能夠給出更好的結果。這一模型也可以使用反向傳播演算法進行訓練。相比較其他深度、前饋神經網路,卷積神經網路需要考量的引數更少,使之成為一種頗具吸引力的深度學習結構。 卷積網路是一種專門用於處理具有已知的、網格狀拓撲的資料的神經網路。例如時間序列資料,它可以被認為是以一定時間間隔取樣的一維網格,又如影象資料,其可以被認為是二維畫素網格。
來源:Goodfellow, I.; Bengio Y.; Courville A. (2016). Deep Learning. MIT Press. 維基百科
Image processing
影象處理是指對影象進行分析、加工、和處理,使其滿足視覺、心理或其他要求的技術。 影象處理是訊號處理在影象領域上的一個應用。 目前大多數的影象均是以數字形式儲存,因而影象處理很多情況下指數字影象處理。
來源: 維基百科
Machine Learning
機器學習是人工智慧的一個分支,是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、計算複雜性理論等多門學科。機器學習理論主要是設計和分析一些讓計算機可以自動“學習”的演算法。因為學習演算法中涉及了大量的統計學理論,機器學習與推斷統計學聯絡尤為密切,也被稱為統計學習理論。演算法設計方面,機器學習理論關注可以實現的,行之有效的學習演算法。
來源:Mitchell, T. (1997). Machine Learning. McGraw Hill.
neurons
(人工)神經元是一個類比於生物神經元的數學計算模型,是神經網路的基本組成單元。 對於生物神經網路,每個神經元與其他神經元相連,當它“興奮”時會向相連的神經元傳送化學物質,從而改變這些神經元的電位;神經元的“興奮”由其電位決定,當它的電位超過一個“閾值”(threshold)便會被啟用,亦即“興奮”。 目前最常見的神經元模型是基於1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神經元模型”。 在這個模型中,神經元通過帶權重的連線接處理來自n個其他神經元的輸入訊號,其總輸入值將與神經元的閾值進行比較,最後通過“啟用函式”(activation function)產生神經元的輸出。
來源: Overview of Artificial Neural Networks and its Applications. (2018). medium.com.
Speech Recognition
自動語音識別是一種將口頭語音轉換為實時可讀文字的技術。自動語音識別也稱為語音識別(Speech Recognition)或計算機語音識別(Computer Speech Recognition)。自動語音識別是一個多學科交叉的領域,它與聲學、語音學、語言學、數字訊號處理理論、資訊理論、電腦科學等眾多學科緊密相連。由於語音訊號的多樣性和複雜性,目前的語音識別系統只能在一定的限制條件下獲得滿意的效能,或者說只能應用於某些特定的場合。自動語音識別在人工智慧領域佔據著極其重要的位置。
Fourier transform
傅立葉變換(法語:Transformation de Fourier、英語:Fourier transform)是一種線性積分變換,用於訊號在時域(或空域)和頻域之間的變換,在物理學和工程學中有許多應用。因其基本思想首先由法國學者約瑟夫·傅立葉系統地提出,所以以其名字來命名以示紀念。實際上傅立葉變換就像化學分析,確定物質的基本成分;訊號來自自然界,也可對其進行分析,確定其基本成分。
來源: 維基百科
Tensor
張量是一個可用來表示在一些向量、標量和其他張量之間的線性關係的多線性函式,這些線性關係的基本例子有內積、外積、線性對映以及笛卡兒積。其座標在 維空間內,有 個分量的一種量,其中每個分量都是座標的函式,而在座標變換時,這些分量也依照某些規則作線性變換。稱為該張量的秩或階(與矩陣的秩和階均無關係)。 在數學裡,張量是一種幾何實體,或者說廣義上的“數量”。張量概念包括標量、向量和線性運算元。張量可以用座標系統來表達,記作標量的陣列,但它是定義為“不依賴於參照系的選擇的”。張量在物理和工程學中很重要。例如在擴散張量成像中,表達器官對於水的在各個方向的微分透性的張量可以用來產生大腦的掃描圖。工程上最重要的例子可能就是應力張量和應變張量了,它們都是二階張量,對於一般線性材料他們之間的關係由一個四階彈性張量來決定。
來源: 維基百科
feature extraction