中文語者(聲紋)識別

Chinese Speaker Recognition

找到描述特定對象的聲紋特徵,通過聲音判別說話人身份的技術;借助不同人的聲音,在語譜圖的分佈情況不同這一特徵,去對比兩個人的聲音,來判斷是否同人

那些語音處理 (Speech Processing) 踩的坑
#speechprocessing_deeplearning101

提高聲紋辨識正確率 更添防疫新利器

Meeting & Minutes Master | TW Deep Master
Call for Partner or POC (Proof of Concept) Contact: TonTon ( at ) TWMAN.ORG
中文語音增強中文語音識別中文語者分離

投入約150天。通常我們是怎樣開始項目的研究與開發?首先會先盡可能的把3年內的學術論文或比賽等SOTA都查到,然後分工閱讀找到相關的數據集和論文及相關實作;同時會找到目前已有相關產品的公司(含新創)及他們提交的專利,這部份通常再花約30天的時間;通常就是透過 Google patens、paper with codes、arxiv等等。

聲紋識別這塊在對岸查到非常多的新創公司,例如: 國音智能在我們研究開發過程就是一直被當做目標的新創公司。可以先看一下上方的DEMO影片效果;然後介紹相關實驗結果前,避免之後有人還陸續踩到我們踩過的坑;需注意的是上述很多數據集都是放在對岸像是百度雲盤等,百度是直接封鎖台灣的IP,所以你打不開是很正常的;另外像是voxcelab是切成7份,下載完再合起來也要花上不少時間,aishell、CMDS, TIMIT 比起來相對好處理就是。

簡單總結為:1. 幾種 vector 的抽取 (i-vector, d-vector, x-vector) 跟 2. 模型架構 (CNN, ResNet) 和調參,再來就是 3. 評分方式 (LDA, PLDA (Probabilistic Linear Discriminant Analysis)) 等等幾種組合;我們也使用了 kaldi 其中內附的功能,光是 kaldi 就又投入了不少時間和精力 ! 其實比起自然語言處理做聲紋識別,最小的坑莫過於雖然數據集不是很容易獲取,但是聲音是可以自行用程式加工做切割合併,然後因為場景限制,錄聲紋時的時長頗短,還得處理非註冊聲紋的處理,所以前前後後花了很多時間在將相關的數據搭配評分模式調整,也算是個大工程。

由左而右、由上而下:任意連續唸至少30秒文章做聲紋註冊,可用 M$ Azure、Google GCP、NVIDIA Nemo 做語音識別,再搭配Sincnet做聲紋跟閱讀理解

The VoxCeleb Speaker Recognition Challenge 2020 (VoxSRC-20)

聲紋識別原理:https://www.zhihu.com/question/30141460

深度學習在聲紋識別中的應用:https://yutouwd.github.io/posts/600d0d5d/

相關聲紋識別介紹匯整:http://xinguiz.com/category/#/声纹识别

CN-Celeb:中國明星聲紋數據集發布:https://mp.weixin.qq.com/s/f_oFRDuSAuqwbOAby07a5Q

基於Kaldi和Pytorch,廈大語音實驗室推出聲紋識別開源工具ASV-Subtools:https://github.com/Snowdar/asv-subtools

騰訊朱雀實驗室最新研究成果入選全球安全頂會:聲音克隆風險需警惕:https://mp.weixin.qq.com/s/iGhVMy73E-bRJ6oB_4t-yQ

1. 應用場景

  • 1:1驗證(驗證:Verification):已知對象打電話來,你確認他的身份

  • 1:n驗證(識別:Identification):未知對象打電話來,你判斷他的身份

2. Features:

  • 聽覺特徵(Auditory feature):人耳可以鑑別和描述的聲音特徵

  • 聲學特徵(Acoustic features):利用數學方法計算出的描述參數(向量)

  • 特徵可以輔助縮小1:n驗證的檢索範圍對象

    • 短時特徵:最常使用

    • 長時特徵:通常是短時特徵的平均(基礎頻率/頻譜特徵),較不會受到說話語氣或說話者身體情況變化的影響

3. 鑑別方法好壞

  • Interclass Varience:從不同聲紋對象提取的不同特徵向量的區分度

  • Intraclass Varience:從相同聲紋對象在不同時間提取的特徵向量間的相似度

  • Ex:胎記:Interclass大, Intraclass小

  • 將聲紋向量與已註冊的聲紋向量計算歐氏距離,大於某值則這是源自不同人,反之則為同一人

4. 特徵擷取方法

  • 傳統方法:可用精確數學模型對聲音進行分析,得到的特徵有較好的可解釋性,需要的資料量小。

    • 模板匹配

    • 高斯混合模型(GMM)

    • 聯合因子分析法(JFA)

  • 深度神經網路:一種資料驅動方法,需要大量資料進行訓練,若有夠多與夠好的資料即可預期較好的結果。

5. 公開數據集:aishell 1, aishell 2, CMDS, TIMIT, voxcelab 1, voxcelab 2, CN-celab

常見特徵工程

GMM-JFA

  • UBM-MAP-GMM為一種確認發話者技術的系統

  • 在JFA模型下,可將模型擴展為說話人空間(V)與環境空間(U)

  • 為了克服訓練資料不夠的狀況因此引入UBM,但是實際應用中U, V無法完美分離

  • Dehak提出從GMM super-vector中提取更好的向量作為改良方法,稱為I-Vector(Identity-Vector)

iVector-based:Dehak, 2009

  • 利用GMM高斯混合模型提取i-vector

  • 採用Total Variability Space(T),即包含了說話者間的差異與空間上的差異(代表不用嚴格區分是說話者的影響還是空間的影響)

  • PLDA:用來弱化空間影響的方法

  • 需要較長的(數十秒到數分鐘)的語音,不適用於Text-Dependent Speaker Verification Task (因為語音很短)

DNN-based

  • d-vector:Google, 2014 中文翻譯

    • 從DNN提取最後一層hidden layer作為embedding

    • 訓練好DNN後,把每一幀語音的Filterbank Energy特徵作為DNN輸入,從Last Hidden Layer提取Activations,做完L2正規化後累加起來得到的向量稱為d-vector;若有多條Enroll語音則將所有d-vectors取平均作為此人的Representation

    • 在不改變model size的前提下使用更多的資料進行訓練:因softmax layer被跳過了因此不考慮softmax layer的節點數

  • x-vector:Snyder, D, 2018

    • 從TDNN網路中提取embedding進行plda scoring

    • Utterance-Level的特征计算Loss

    • Statistics Pooling Layer: 將Frame-level Layer Map到Segment-Level Layer以便計算frame-level Layer的Mean和standard deviation

    • 在短語音上表現較強:TDNN是時延架構,Output Layer可學到Long-Time feature,所以x-vector可以利用短短的10s左右的語音抓到聲紋訊息

    • 提取x-vector,LDA降维,然后以PLDA作为back-end,便可以做Verification

    • 訓練速度非常快,在訓練資料量大時可有較低的EER

  • j-vector:j-vector, 2015j-vector join Bayesian, 2017

    • 為了解決Text-Dependent Speaker Verification而提出的,此任務同時要驗證身份也要驗證語音內容,屬於multi-task

    • j-vector从Last Hidden Layer提取。相比于Cosine Similarity、Joint PLDA,使用Joint Gaussian Discriminant Function作为back-end时,实验效果最佳

    • 適用文本相關的說話者驗證

End-to-end:希望能直接輸入兩段語音來判斷是否來自同一人。

  • Triplet-Loss-based:實際使用:Google FaceNet, Baidu Deep Speaker

    • 概念:直接使用embeddings間的相似度作為Loss Function

    • 建構一個三元組:anchor, positive, negative

    • 用大量標記好的三元組作為DNN輸入以學習參數

      • anchor, positive為同一人的不同聲音

      • anchor, negative為不同人的聲音

      • 目標為最大化ap相似度, 最小化an相似度

    • 相似度:

      • cosine:愈大相似度愈高(Baidu Deep Speaker)

      • 歐幾里德距離:愈小相似度愈高(Google FaceNet)

    • 改進方向:嘗試使用不同神經網路架構

  • 為什麼NN比i-vector好?

    • 對NN來說資料愈多愈能避免overfitting; i-vector使用UBM/T(無監督訓練),當資料愈多就需要一直調整cluster中心

    • NN使用多類別cross-entropy進行分類,因此若遇到失真(distorsions)問題DNN都能學到invariant;資料的失真會對i-vector的斜方差矩陣帶來影響,此時就需要做data cleaning或back-end補償

    • 短語音會對NN有影響,因為訓練時長變少了

    • i-vector的back-end補償NN也可以使用

  • E2E和Representation的差別

    • 不同的模型結構: E2E包含speaker embedding(front-end) 和 scoring(back-end);Representation只有front-end

    • 不同的訓練目標: E2E是直接輸入兩段語音來判斷是否來自同一人;Representation是判斷在訓練集中的說話者。

    • 不同的訓練方法: E2E使用一對對的語音進行訓練,語音選取好壞會很影響訓練結果;Representation是one-hot的訓練方法,較容易。

    • 不同的泛化能力: E2E只能用在聲紋識別任務中;Representation應用較廣。

技術指標

  • 錯誤拒絕率(False Rejection Rate, FRR):同類的兩人被系統判別為不同類。FRR為誤判案例在所有同類匹配案例中的比例

  • 錯誤接受率(False Acceptance Rate, FAR):不同類的兩人被系統判為同類。FAR為接受案例在所有異類匹配案例中的比例

  • 等錯誤率(Equal Error Rate, EER):調整threshold,當FRR=FAR時,FRR和FAR的數值稱為等錯誤率

  • 準確率(Accuracy,ACC):ACC=1-min(FAR+FRR)

速度:

    • Real Time Factor 實時比:衡量提取時間跟音頻時長的關係,ex:1秒可以處理80s的音頻,實時比=1:80

    • 驗證比對速度:平均每秒能進行的聲紋比對次數

    • ROC曲線:描述FAR和FRR間變化的曲線,X軸為FAR,Y軸為FRR。

    • 閥值:當分數超過閥值才做出接受決定。

Multi-Resolution Multi-Head Attention in Deep Speaker Embedding


  • 提出一種pooling方式來計算attentive weight,使得輸入的語音在時間軸上能更好的聚合,進而使end-to-end neural network 在語者識別上獲得更好的效能

  • General Pooling

    • Average pooling: 計算多個frame vectors的平均作為整個音檔的d-vector表示

    • Statistics pooling: 計算多個frame vectors的平均和標準差,再拼接在一起作為整個音檔的d-vector表示

    • Attentive pooling: 將frame vector做attention計算,並將得到的結果作為weight,再乘上sequence作為整個音檔的d-vector表示

    • Multi-head attentive pooling: 基於attentive pooling的計算再加上multi-head的設計,產生多組的weight並將各自結果拼接作為輸出

  • Proposed Pooling:Multi-resolution multi-head attentive pooling: 基於Global multi-head attentive pooling,並增加一個resolution參數T,對不同head的訓練結果做不同程度的稀釋。此參數介於1~無限大,趨近於1表示高度採信訓練結果,趨近於無限大則代表直接使用average pooling,意即完全不採用訓練出的weight

AutoSpeech: Neural Architecture Search for Speaker Recognition

Robust Speaker Recognition Based on Single-Channel and Multi-Channel Speech Enhancement

VAE-based Regularization for Deep Speaker Embedding


  • PLDA 模型的設計是基於 i-vector 的高斯分佈性質情況下能有最佳表現,但 d-vector 或 x-vector 並沒有這項特性,因此 PLDA 未必能有效發揮;此篇論文提供一個事後 Normalize 的方式,使用 VAE 的向量分布轉換特性將原本已生好的 x-vector (d-vector 同理) 轉換至高斯分佈,並套用新 loss (Cohesive loss) 使向量更向中心點靠攏;根據實驗經此方法 Normalize 的向量在EER上會比原始 x-vector 表現更好

  • VAE簡述: Variational Auto Encoder 原始 AutoEncoder (AE) 為將輸入 encode 至隱藏空間中的一個向量點,再經 decoder 做還原,而 VAE 的編碼結果便不再是單一向量,而是一個均值向量與一個標準差向量,簡單可理解為將輸入編碼成隱藏空間中的一個高斯分佈

  • 總結: 以理論而言可能會是一個有效的方法 且因這是一個後置的Normalize 對原始模型不會有太大影響 可做為方向之一

Improving End-to-End Single-Channel Multi-Talker Speech Recognition