基于TensorFlow,人声识别如何在端上实现?
阿里妹導(dǎo)讀:閑魚作為阿里巴巴在閑置流通領(lǐng)域的主要產(chǎn)品,主要研發(fā)移動應(yīng)用來解決閑置物品/資產(chǎn)/時間在個人領(lǐng)域的再次流通問題,用到跨端技術(shù)(Base Flutter/Weex/Dart技術(shù)棧)和計算機視覺技術(shù)(Base Tensorflow Lite)在移動終端上的前沿實踐。
本文章由閑魚技術(shù)團隊出品。針對服務(wù)端上人聲識別具有延時和占用資源的問題,本文提出了在客戶端上基于tensorflowLite框架實現(xiàn)人聲識別方案,下面一起來深入了解。
本文作者:仝輝,上葉
摘要
現(xiàn)有的人聲識別絕大部分在服務(wù)端實現(xiàn),這會帶來如下兩方面的問題:
1) 當(dāng)網(wǎng)絡(luò)較差的情況下會造成較大的延時,帶來較差的用戶體驗。
2) 當(dāng)訪問量較大的情況下,會大量占用服務(wù)端資源。
為解決以上兩個問題,我們選擇在客戶端上實現(xiàn)人聲識別功能。本文使用機器學(xué)習(xí)的方法識別人聲。采用的框架是谷歌的tensorflowLite框架,該框架跟它的名字一樣具有小巧的特點。在保證精度的同時,框架的大小只有300KB左右,且經(jīng)過壓縮后產(chǎn)生的模型是tensorflow模型的四分之一[1]。因此,tensorflowLite框架比較適合在客戶端上使用。
為了提高人聲的識別率,需要提取音頻特征作為機器學(xué)習(xí)框架的輸入樣本。本文使用的特征提取算法是基于人耳聽覺機理的梅爾倒頻譜算法[2]。
由于在客戶端上使用人聲識別比較耗時,在工程上需要做很多優(yōu)化,優(yōu)化方面如下:
1) 指令集加速:引入arm指令集,做多指令集優(yōu)化,加速運算。
2) 多線程加速:對于耗時的運算采用多線程并發(fā)處理。
3) 模型加速:選用支持NEON優(yōu)化的模型,并預(yù)加載模型減少預(yù)處理時間。
4) 算法加速:I) 降低音頻采樣率。II) 選取人聲頻段(20hz~20khz),剔除非人聲頻段。III) 合理分窗和切片,防止過度計算。IV) 靜音檢測,減少不必要的時間片段。
1.概述
1.1人聲識別應(yīng)用場景
本文提出的人聲識別的方法,使用場景大體如下:
1) 音視頻質(zhì)量分析:判斷是否存在人聲,通話無聲,嘯叫聲,背景雜音等現(xiàn)象。
2) 識別特定聲音:識別是否是某人的特定聲音,用于聲音解鎖,遠程身份認(rèn)證等。
3) 識別情緒:用于判斷說話者的情緒和狀態(tài)等。聲紋結(jié)合內(nèi)容和情感信息的結(jié)合可以有效阻止聲紋假冒和人身脅迫。
4) 識別性別:可以識別是男聲還是女聲。
1.2人聲識別流程
人聲識別分為訓(xùn)練和預(yù)測兩個部分。訓(xùn)練指的是生成預(yù)測模型,預(yù)測是利用模型產(chǎn)生預(yù)測結(jié)果。
首先介紹下訓(xùn)練的過程,分為以下三個部分:
1) 基于梅爾倒頻譜算法,提取聲音特征,并將其轉(zhuǎn)換成頻譜圖片。
2) 將人聲頻譜作為正樣本,動物聲音和雜音等非人聲作為負(fù)樣本,交由神經(jīng)網(wǎng)絡(luò)模型 ?訓(xùn)練。
3) 基于訓(xùn)練產(chǎn)生的文件,生成端上可運行的預(yù)測模型。
簡而言之,人聲識別訓(xùn)練的流程分為三個部分,提取聲音特征,模型訓(xùn)練和生成端上模型。最后,是人聲識別的部分:先提取聲音特征,然后加載訓(xùn)練模型即可獲得預(yù)測結(jié)果。
1.3人工智能框架
2017年11月,谷歌曾在 I/O 大會上宣布推出TensorFlowLite,這是一款
TensorFlow 用于移動設(shè)備和嵌入式設(shè)備的輕量級解決方案。可以在多個平臺上運行,從機架式服務(wù)器到小型 IoT 設(shè)備。但是隨著近年來機器學(xué)習(xí)模型的廣泛使用,出現(xiàn)了在移動和嵌入式設(shè)備上部署它們的需求。而TensorFlowLite 允許設(shè)備端的機器學(xué)習(xí)模型的低延遲推斷。
本文基于的tensorflowLite是谷歌研發(fā)的人工智能學(xué)習(xí)系統(tǒng),其命名來源于本身的運行原理。Tensor(張量)意味著N維數(shù)組,Flow(流)意味著基于數(shù)據(jù)流圖的計算,TensorFlow為張量從流圖的一端流動到另一端計算過程。TensorFlow是將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)中進行分析和處理過程的系統(tǒng)。
下圖展示了tensorflowLite的架構(gòu)設(shè)計[1]:
圖1.1?tensorflowlite架構(gòu)圖
2.梅爾倒頻譜算法
2.1 概述
本章中聲音識別的算法--梅爾倒頻譜算法[2]分為如下幾步,將會在后續(xù)小節(jié)中詳細(xì)介紹。
1) 輸入聲音文件,解析成原始的聲音數(shù)據(jù)(時域信號)。
2) 通過短時傅里葉變換,加窗分幀將時域信號轉(zhuǎn)變?yōu)轭l域信號。
3) 通過梅爾頻譜變換,將頻率轉(zhuǎn)換成人耳能感知的線性關(guān)系。
4) 通過梅爾倒譜分析,采用DCT變換將直流信號分量和正弦信號分量分離[3]。
5) 提取聲音頻譜特征向量,將向量轉(zhuǎn)換成圖像。
加窗分幀是為了滿足語音在時域的短時平穩(wěn)特性,梅爾頻譜變換是為了將人耳對頻率的感知度轉(zhuǎn)化為線性關(guān)系,倒譜分析的重點是理解傅里葉變換,任何信號都可以通過傅里葉變換而分解成一個直流分量和若干個正弦信號的和。
圖2.1 聲音的時域信號
圖2.1是聲音的時域信號,直觀上很難看出頻率變化規(guī)律。圖2.2是聲音的頻域信號,反映了能夠反映出聲音的音量和頻率等信息。圖2.3是經(jīng)過梅爾倒頻譜的聲音特征,能夠提取聲音。
圖2.2 聲音的頻域信號
圖2.3 聲音的倒頻譜特征
圖2.4 梅爾倒頻譜算法實現(xiàn)流程
2.2 短時傅里葉變換
聲音信號是一維的時域信號,直觀上很難看出頻率變化規(guī)律。如果通過傅里葉變換把它變到頻域上,雖然可以看出信號的頻率分布,但是丟失了時域信息,無法看出頻率分布隨時間的變化。為了解決這個問題,很多時頻分析手段應(yīng)運而生。短時傅里葉,小波,Wigner分布等都是常用的時頻域分析方法。
圖2.5FFT變換和STFT變換示意圖
通過傅里葉變換可以得到信號的頻譜。信號的頻譜的應(yīng)用非常廣泛,信號的壓縮、降噪都可以基于頻譜。然而傅里葉變換有一個假設(shè),那就是信號是平穩(wěn)的,即信號的統(tǒng)計特性不隨時間變化。聲音信號就不是平穩(wěn)信號,在很長的一段時間內(nèi),有很多信號會出現(xiàn),然后立即消失。如果將這信號全部進行傅里葉變換,就不能反映聲音隨時間的變化。
本文采用的短時傅里葉變換(STFT)是最經(jīng)典的時頻域分析方法。短時傅里葉變換(STFT)是和傅里葉變換(FT)相關(guān)的一種數(shù)學(xué)變換,用以確定時變信號其局部區(qū)域正弦波的頻率與相位。它的思想是:選擇一個時頻局部化的窗函數(shù),假定分析窗函數(shù)h(t)在一個短時間間隔內(nèi)是平穩(wěn)的,使f(t)h(t)在不同的有限時間寬度內(nèi)是平穩(wěn)信號,從而計算出各個不同時刻的功率譜。短時傅里葉變換使用一個固定的窗函數(shù),通常使用的窗函數(shù)有漢寧窗、海明窗、Blackman-Haris窗等。本文中采用了海明窗,海明窗是一種余弦窗,能夠很好地反映某一時刻能量隨時間的衰減關(guān)系。
因此,本文的STFT公式在原先傅里葉變換公式:
公式的基礎(chǔ)上加了窗函數(shù),因此STFT公式變換為
其中,
為海明窗函數(shù)。
圖2.6 基于海明窗的STFT變換
2.3 梅爾頻譜
聲譜圖往往是很大的一張圖,為了得到合適大小的聲音特征,往往把它通過梅爾標(biāo)度濾波器組,變換為梅爾頻譜。什么是梅爾濾波器組呢?這里要從梅爾標(biāo)度說起。
梅爾標(biāo)度,由Stevens,Volkmann和Newman在1937年命名。我們知道,頻率的單位是赫茲(Hz),人耳能聽到的頻率范圍是20-20000Hz,但人耳對Hz這種標(biāo)度單位并不是線性感知關(guān)系。例如如果我們適應(yīng)了1000Hz的音調(diào),如果把音調(diào)頻率提高到2000Hz,我們的耳朵只能覺察到頻率提高了一點點,根本察覺不到頻率提高了一倍。如果將普通的頻率標(biāo)度轉(zhuǎn)化為梅爾頻率標(biāo)度,映射關(guān)系如下式所示:
經(jīng)過上述公式,則人耳對頻率的感知度就成了線性關(guān)系[4]。也就是說,在梅爾標(biāo)度下,如果兩段語音的梅爾頻率相差兩倍,則人耳可以感知到的音調(diào)大概也相差兩倍。
讓我們觀察一下從Hz到梅爾頻率(mel)的映射圖,由于它們是log的關(guān)系,當(dāng)頻率較小時,梅爾頻率隨Hz變化較快;當(dāng)頻率很大時,梅爾頻率的上升很緩慢,曲線的斜率很小。這說明了人耳對低頻音調(diào)的感知較靈敏,在高頻時人耳是很遲鈍的,梅爾標(biāo)度濾波器組啟發(fā)于此。
圖2.7 頻率轉(zhuǎn)梅爾頻率示意圖
如下圖所示,12個三角濾波器組成濾波器組,低頻處濾波器密集,門限值大,高頻處濾波器稀疏,門限值低。恰好對應(yīng)了頻率越高人耳越遲鈍這一客觀規(guī)律。上圖所示的濾波器形式叫做等面積梅爾濾波器(Mel-filter
bank with same bank area),在人聲領(lǐng)域(語音識別,說話人辨認(rèn))等領(lǐng)域應(yīng)用廣泛。
圖2.8 梅爾濾波器組示意圖
2.4 梅爾倒頻譜
基于2.3的梅爾對數(shù)譜,采用DCT變換將直流信號分量和正弦信號分量分離,最后得到的結(jié)果稱為梅爾倒頻譜。
其中,
由于梅爾倒頻譜輸出的是向量,還不能用圖片顯示,需要將其轉(zhuǎn)換成圖像矩陣。需要將輸出向量的范圍
線性變換到圖像的范圍
圖2.9 繪圖顏色標(biāo)度示意圖
2.5 算法處理速度優(yōu)化
由于算法需要在客戶端上實現(xiàn),因此需要對速度做一定的改進[5]。優(yōu)化方面如下:
1) 指令集加速:由于算法有大量的加法和乘法矩陣運算,因此引入arm指令集,做多 ?指令集優(yōu)化,加速運算。速度可以提高4~8倍[6]。
2) 算法加速:I) 選取人聲頻段(20HZ~20KHZ),并剔除非人聲頻段減少冗余計算。II)降低音頻采樣率,由于人耳對過高的采樣率不敏感,因此降低采樣率 ?可以減少不必要的數(shù)據(jù)計算。III)合理分窗和切片,防止過度計算。IV) 靜音檢測,減少不必要的時間片段。
3) 采樣頻率加速:如果音頻的采樣頻率過高,選擇下采樣,處理的頻率最高設(shè)定為 ?32kHZ。
4) 多線程加速:將音頻拆分為多個片段,采用多線程并行處理。并根據(jù)機器的能力配 ?置線程數(shù),默認(rèn)為4個線程。
圖2.10 算法工程端選取的參數(shù)
3.人聲識別模型
3.1模型選擇
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks-簡稱CNN)是一種前饋神經(jīng)網(wǎng)絡(luò),它的人工神經(jīng)元可以響應(yīng)一部分覆蓋范圍內(nèi)的周圍單元,對于大型圖像處理有出色表現(xiàn)。
20世紀(jì)60年代,Hubel和Wiesel在研究貓腦皮層中用于局部敏感和方向選擇的神經(jīng)元時發(fā)現(xiàn)其獨特的網(wǎng)絡(luò)結(jié)構(gòu)可以有效地降低反饋神經(jīng)網(wǎng)絡(luò)的復(fù)雜性,繼而提出了卷積神經(jīng)網(wǎng)絡(luò)?,F(xiàn)在,CNN已經(jīng)成為眾多科學(xué)領(lǐng)域的研究熱點之一,特別是在模式分類領(lǐng)域,由于該網(wǎng)絡(luò)避免了對圖像的復(fù)雜前期預(yù)處理,可以直接輸入原始圖像,因而得到了更為廣泛的應(yīng)用。
K.Fukushima在1980年提出的新識別機是卷積神經(jīng)網(wǎng)絡(luò)的第一個實現(xiàn)網(wǎng)絡(luò)。隨后,更多的科研工作者對該網(wǎng)絡(luò)進行了改進。其中,具有代表性的研究成果是Alexander和Taylor提出的“改進認(rèn)知機”,該方法綜合了各種改進方法的優(yōu)點并避免了耗時的誤差反向傳播。
一般地,CNN的基本結(jié)構(gòu)包括兩層,其一為特征提取層,每個神經(jīng)元的輸入與前一層的局部接受域相連,并提取該局部的特征。一旦該局部特征被提取后,它與其它特征間的位置關(guān)系也隨之確定下來;其二是特征映射層,網(wǎng)絡(luò)的每個計算層由多個特征映射組成,每個特征映射是一個平面,平面上所有神經(jīng)元的權(quán)值相等。特征映射結(jié)構(gòu)采用影響函數(shù)核小的sigmoid,relu等函數(shù)作為卷積網(wǎng)絡(luò)的激活函數(shù),使得特征映射具有位移不變性。此外,由于一個映射面上的神經(jīng)元共享權(quán)值,因而減少了網(wǎng)絡(luò)自由參數(shù)的個數(shù)。卷積神經(jīng)網(wǎng)絡(luò)中的每一個卷積層都緊跟著一個用來求局部平均與二次提取的計算層,這種特有的兩次特征提取結(jié)構(gòu)減小了特征分辨率。
CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN的特征檢測層通過訓(xùn)練數(shù)據(jù)進行學(xué)習(xí),所以在使用CNN時,避免了顯式的特征抽取,而隱式地從訓(xùn)練數(shù)據(jù)中進行學(xué)習(xí);再者由于同一特征映射面上的神經(jīng)元權(quán)值相同,所以網(wǎng)絡(luò)可以并行學(xué)習(xí),這也是卷積網(wǎng)絡(luò)相對于神經(jīng)元彼此相連網(wǎng)絡(luò)的一大優(yōu)勢。卷積神經(jīng)網(wǎng)絡(luò)以其局部權(quán)值共享的特殊結(jié)構(gòu)在語音識別和圖像處理方面有著獨特的優(yōu)越性,其布局更接近于實際的生物神經(jīng)網(wǎng)絡(luò),權(quán)值共享降低了網(wǎng)絡(luò)的復(fù)雜性,特別是多維輸入向量的圖像可以直接輸入網(wǎng)絡(luò)這一特點避免了特征提取和分類過程中數(shù)據(jù)重建的復(fù)雜度。
圖3.1?Inception-v3模型
本文選取了精度較高的Inception-v3模型作為人聲識別的模型,v3一個最重要的改進是分解,將7x7卷積網(wǎng)絡(luò)分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算,使得網(wǎng)絡(luò)深度進一步增加,增加了網(wǎng)絡(luò)的非線性,還有值得注意的地方是網(wǎng)絡(luò)輸入從224x224變?yōu)榱?99x299,更加精細(xì)設(shè)計了35x35/17x17/8x8的模塊。
使用tensorflow session模塊可以實現(xiàn)代碼層面的訓(xùn)練和預(yù)測功能,具體使用方法詳見tensorflow官網(wǎng)[7]。
圖3.2 tensorflow session使用示意圖
3.2模型樣本
有監(jiān)督的機器學(xué)習(xí)中,一般需要將樣本分成獨立的三部分訓(xùn)練集(train
set),驗證集(validation set)和測試集(test set)。其中訓(xùn)練集用來估計模型,驗證集用來確定網(wǎng)絡(luò)結(jié)構(gòu)或者控制模型復(fù)雜程度的參數(shù),而測試集則檢驗最終選擇最優(yōu)的模型的性能如何。
具體定義如下:
訓(xùn)練集:學(xué)習(xí)樣本數(shù)據(jù)集,通過匹配一些參數(shù)來建立一個分類器。建立一種分類的方式,主要是用來訓(xùn)練模型的。
驗證集:對學(xué)習(xí)出來的模型,調(diào)整分類器的參數(shù),如在神經(jīng)網(wǎng)絡(luò)中選擇隱藏單元數(shù)。驗證集還用來確定網(wǎng)絡(luò)結(jié)構(gòu)或者控制模型復(fù)雜程度的參數(shù),用來防止模型過擬合現(xiàn)象。
測試集:主要是測試訓(xùn)練好的模型的分辨能力(識別率等)
根據(jù)第二章的梅爾倒頻譜算法可以得到聲音識別的樣本文件,將人聲頻譜作為正樣本,動物聲音和雜音等非人聲作為負(fù)樣本,交由Inception-v3模型進行訓(xùn)練。
本文采用了tensorflow作為訓(xùn)練框架,選取人聲和非人聲各5000個樣本作為測試集,1000個樣本作為驗證集。
3.3 模型訓(xùn)練
樣本準(zhǔn)備完成后,即可使用Inception-v3模型訓(xùn)練。當(dāng)訓(xùn)練模型收斂時,即可生成端上可使用的pb模型。模型選取時選擇編譯armeabi-v7a或者以上版本即可默認(rèn)打開NEON優(yōu)化,即打開USE_NEON的宏,能夠達到指令集加速的效果。例如CNN網(wǎng)絡(luò)一半以上的運算都在卷積(conv)運算,使用指令集優(yōu)化可以至少加速4倍。
圖3.3 卷積處理函數(shù)
然后經(jīng)過tensorflow提供的toco工具生成lite模型,該模型可以直接在客戶端上使用tensorflowLite框架調(diào)用。
圖3.4 toco工具調(diào)用接口
3.4 模型預(yù)測
對聲音文件使用梅爾倒頻譜算法提取特征,并生成預(yù)測圖片。之后使用訓(xùn)練產(chǎn)生的lite模型即可預(yù)測,預(yù)測結(jié)果示意圖如下:
圖3.5 模型預(yù)測結(jié)果
參考文獻:
[1] https://www.tensorflow.org/mobile/tflite
[2] 基于MFCC與IMFCC的說話人識別研究[D]. 劉麗巖. 哈爾濱工程大學(xué) . 2008
[3] 一種基于MFCC和LPCC的文本相關(guān)說話人識別方法[J].
于明,袁玉倩,董浩,王哲. 計算機應(yīng) ?用. 2006(04)
[4] Text dependent Speaker
Identification in Noisy Enviroment[C]. Kumar Pawan,Jakhanwal Nitika,
Chandra Mahesh. International
Conference on Devices and Communications . 2011
[5] https://github.com/weedwind/MFCC
[6] https://baike.baidu.com/item/ARM指令集/907786?fr=aladdin
[7] https://www.tensorflow.org/api_docs/python/tf/Session
總結(jié)
以上是生活随笔為你收集整理的基于TensorFlow,人声识别如何在端上实现?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为了在全球“买买买”,阿里工程师自研了一
- 下一篇: 小邪在阿里的十年技术人生