百度大腦跟聽音神童打平了,聽百度工程師聊聊聲紋識別的原理
百度大腦最近參加了綜藝節目《最強大腦》,就是那個請一堆人類記憶大師和神童上去挑戰的節目。
此前第一期節目里面,搭載了百度大腦的小度以3:2在人臉識別的比賽中贏了人類選手王峰。第二期的節目比的則是聲紋識別,大概就是從一堆人中找出說某句話的人是誰,不過,做為“最強道具組”的《最強大腦》,為了節目效果,當然不會讓項目那么簡單。
節目中的名人堂選手申一帆甚至表示,這個題目太變態了。確實,對于普通人來說,這樣的題目基本靠瞎蒙……
具體來說,節目組請來了一組專業的高校合唱團(21人),嘉賓周杰倫從中選出了聲線相近的三個人,分別對周杰倫說一句話,節目從中截取三秒不連續的只言片語。兩位選手聽過三個人的說話片段之后,現場聽合唱團合唱一曲,然后從中選出嘉賓選的三個人分別是誰。
這次百度大腦的對手是聽音神童孫亦廷。結果,兩位選手都分別只對了一題,因此打平,其中第一道題中兩位選手都錯了,而且寫錯的答案一樣。
跟上次一樣,我們來關注一下,機器是怎么辨認出說這句話的人是誰的呢?我們來聽百度工程師們講解一下。
聲紋識別要回答什么問題
本次比賽對機器來說是聲紋識別。聲紋識別和語音識別的不同之處在于,它的目的不是識別語音的內容,而是識別說話人的身份。
聲紋識別
據百度方面介紹,聲紋的理論基礎是“每個人的說話特性都具有其獨特的特征”,而決定這種獨特特征的主要因素有:
1) 聲腔的差異,其包括咽喉、鼻腔、口腔以及胸腔等,這些器官的形狀、尺寸和位置決定了聲腔的差異,不同的人說話,其聲音的頻率分布是不同的。
2) 發聲的操作方式,主要是指唇、口齒、舌頭等部位在發聲時的相互作用。
一般而言,人正常說話時的聲紋狀態還是相對穩定的。但兩個因素非常容易受身體狀況、年齡、情緒等情況的干擾,從而導致聲紋特性的變化。比如如果一個人感冒了,因為鼻腔堵塞也導致聲紋特性不一致。總而言之,聲紋特征是類似于虹膜、指紋等一種具有獨特性的生物特征。
跟上次介紹過的人臉識別類似,聲紋識別的任務主要分成兩類:聲紋確認技術(1:1)和聲紋識別技術(1:N)兩類。前者回答的是兩句話到底是不是一個人說的,比如微信登陸中使用的聲紋識別技術,回答的就是類似的問題;而后者回答的則是”給定的一句話屬于樣本庫中誰說的”問題。這次節目中要回答的就是第二類問題,從21個個合唱團成員中找出嘉賓指定的三個人。
不過,百度方面也指出,這次節目中聲紋識別的比賽比一般的聲紋識別要難。
一是因為給定的樣本(注冊語音)是屬于唱歌的聲音,但要識別的(測試語音)則是正常說話的聲音,兩種情況下同一個人的發生方式可能是不同的。二是因為合唱要求成員的聲音不能過于突出,這使得注冊語音趨同。三是測試聲音是斷續的。四是因為測試聲音時長過短,不超過10個字,有效時間不大于3秒。“我們需要更為魯棒(Robust)地來提取出短時的、斷斷續續的線人說話聲音所能夠表征的線人特性。”
聲紋識別的過程
百度方面介紹,一個基本的聲紋識別過程主要包括聲紋注冊和聲紋測試階段:
在聲紋注冊階段,每個可能的用戶都會錄制足夠的語音然后進行說話人特征的提取,從而形成聲紋模型庫。這個模型庫就像字典,所有可能的字都會在該字典中被收錄。節目中的大合唱階段就是聲紋注冊階段。
在聲紋測試階段,測試者也會錄制一定的語音,然后進行說話人特征提取,提取完成后,就會與聲紋模型庫中的所有注冊者進行相似度計算。相似度最高的注冊者即為機器認為的測試者身份。節目中斷斷續續的語音,即可以看成是線人的測試語音。
聲紋識別的一般步驟
那百度大腦如何提取聲紋特征,其中又用了什么算法?聽百度工程師聊聊具體過程。以下為百度工程師撰寫的內容,將采用工程師第一人稱(想要看簡單版的同學可以直接跳到最后):
1) 聲學特征提取
語音信號可以認為是一種 短時平穩信號 和 長時非平穩信號 ,其長時的非平穩特性是由于發音器官的物理運動過程變化而產生的。從發音機理上來說,人在發出不同種類的聲音時,聲道的情況是不一樣的,各種器官的相互作用,會形成不同的聲道模型,而這種相互作用的變化所形成的不同發聲差異是非線性的。但是,發聲器官的運動又存在一定的慣性,所以在短時間內,我們認為語音信號還是可以當成平穩信號來處理,這個短時一般范圍在10到30毫秒之間。
這個意思就是說語音信號的相關特征參數的分布規律在短時間(10-30ms)內可以認為是一致的,而在長時間來看則是有明顯變化的。在數字信號處理時,一般而言我們都期望對平穩信號進行時頻分析,從而提取特征。因此,在對語音信號進行特征提取的時候,我們會有一個20ms左右的時間窗,在這個時間窗內我們認為語音信號是平穩的。然后以這個窗為單位在語音信號上進行滑動,每一個時間窗都可以提取出一個能夠表征這個時間窗內信號的特征,從而就得到了語音信號的特征序列。這個過程,我們稱之為聲學特征提取。這個特征能夠表征出在這個時間窗內的語音信號相關信息。如下圖所示:
這樣,我們就能夠將一段語音轉化得到一個以幀為單位的特征序列。由于人在說話時的隨機性,不可能得到兩段完全一模一樣的語音,即便是同一個人連續說同樣的內容時,其語音時長和特性都不能完全一致。因此,一般而言每段語音得到的特征序列長度是不一樣的。
在時間窗里采取的不同的信號處理方式,就會得到不同的特征,目前常用的特征有濾波器組fbank,梅爾頻率倒譜系數MFCC以及感知線性預測系數PLP特征等。然而這些特征所含有的信息較為冗余,我們還需要進一步的方法將這些特征中所含有的說話人信息進行提純。
2) 說話人特征提取
我們在提取說話人特征的過程中采用了經典的DNN-ivector系統以及基于端到端深度神經網絡的說話人特征(Dvector)提取系統。兩套系統從不同的角度實現了對說話人特征的抓取。
A. 算法1 DNN-ivector
這是目前被廣泛采用的聲紋識別系統。其主要特點就是將之前提取的聲學特征通過按照一定的發聲單元對齊后投影到一個較低的線性空間中,然后進行說話人信息的挖掘。直觀上來說,可以理解成是在挖掘“不同的人在發同一個音時的區別是什么”。
首先我們會用大量的數據訓練一個能夠將聲學特征很好的對應到某一發聲單元的神經網絡,如下圖所示:
這樣,每一幀特征通過神經網絡后,就會被分配到某一發聲單元上去。然后,我們會對每一句話在所有的發聲單元進行逐個統計,按照每個發聲單元沒單位統計得到相應的信息。這樣,對于每一句話我們就會得到一個高維的特征矢量。
在得到高維的特征矢量后,我們就會采用一種稱之為total variability的建模方法對高維特征進行建模:
M=m+Tw
其中m是所有訓練數據得到的均值超矢量,M則是每一句話的超矢量,T是奇通過大量數據訓練得到的載荷空間矩陣,w則是降維后得到的ivector特征矢量,根據任務情況而言,一般取幾百維。最后,對這個ivector采用概率線性判別分析PLDA建模,從而挖掘出說話人的信息。
在實際中,我們依托百度領先的語音識別技術訓練了一個高精度的深度神經網絡來進行發聲單元的對齊,然后依托海量數據訓練得到了載荷矩陣空間T,最后創造性地采用了自適應方法來進行調整T空間和PLDA空間,大大增強了模型在唱歌和說話跨方式以及短時上的聲紋識別魯棒性。
B. 算法2 基于端到端深度學習的說話人信息提取
如果說上一套方法還借鑒了一些語音學的知識(采用了語音識別中的發聲單元分類網絡),那么基于端到端深度學習的說話人信息提取則是一個純粹的數據驅動的方式。通過百度的海量數據樣本以及非常深的卷積神經網絡來讓機器自動的去發掘聲學特征中的說話人信息差異,從而提取出聲學特征中的說話人信息表示。
我們首先通過海量的聲紋數據訓練一個深度卷積神經網絡,其輸出的類別就是說話人的ID,實際訓練中我們使用了數萬個ID來進行網絡的訓練。從而得到了能夠有效表征說話人特性底座網絡。在根據特定場景的任務進行自適應調優。具體過程如下圖所示:
在完成網絡的訓練后,我們就得到了一個能夠提取說話人差異信息的網絡,對每一句話我們通過該網絡就得到了說話人的特征。
兩套系統我們最后在得分域上進行了加權融合,從而給出最后的判決結果。
以上是百度工程師對百度聲紋識別過程的分享,在百度首席科學家吳恩達和深度學習研究院主任林元慶接受媒體采訪時,也表示百度的聲紋識別其實訓練了兩個模型,最后通過兩個模型分數相加得出最后的結果。吳恩達用非常通俗解釋了兩個模型:
第一種算法則是從一段語音中提取大概五千個特征,這些特征就包括兩種情況。一種情況就是你在說什么?第二種情況是你的聲音是什么樣的?你的特征是什么?在這五千個特征里面,其中90%是說話的內容,10%是聲音的特征,百度從中提取400個特征。輸入兩端人聲對比的時候就比對這400個特征。
另一種是端對端的系統,通過深度學習讓機器自動挖掘聲學特征中說話人的信息差異,用了2萬個人、共5千個小時左右的數據去訓練。該端對端網絡會分析每段語音中的1020個特征,分析不同語音下同一特征像不像。這個端對端的網絡的目標是輸入兩段聲音,判斷是不是同一個人說的話。
兩位科學家也說出了一個比賽現場很有意思的事。比賽中,兩個模型其實各自做對了兩道題,但分數加起來之后,最后反而只對了一道題。他們解釋,這就像兩個模型投票一樣,“其實這兩個模型,你哪一個模型是比較自信的,比較有信心的你就會選擇(它)”。
吳恩達表示,這個細節也會讓團隊發現進步的可能。團隊未來除了用更多的數據訓練模型,很有可能選擇多個模型投票的辦法。
來自:http://36kr.com/p/5062089.html