BLOG + NEWS

HOME BLOG
誰在說話?淺談 Speaker Diarization 「語者自動分段標記」
BLOG・Algorithm 演算法
SHARE
誰在說話?淺談 Speaker Diarization 「語者自動分段標記」
誰在說話?淺談 Speaker Diarization 「語者自動分段標記」
08
DEC
2020
1749
Yvette Yun-Shao Lin

目錄

  • 語音活性檢測(Speech/Voice Activity Detection, SAD/VAD)
  • 分割(Segmentation)
  • 聚類(Clustering)
  • 再分割(resegmentation)

 

有沒有想過人類如何能從一段語音中聽出有幾個説話者,他們又分別説了什麽?人的大腦可以輕而易舉地做到,但是要教會電腦做這件事就需要費一番波折。

 

説話者分辨(speaker diarization)就是用來解決這個問題的,它可以從一段語音中辨識説話者以及他們説話的片段。

 

其實speaker diarization早已有之,過去主要是作爲ASR的前處理部分(更多關於ASR的介紹請看自動語音辨識 ASR 的前世今生)。而後,speaker diarization在語音導航、檢索和更高階人機互動應用中,逐漸成爲關鍵技術。

 

現今,不同的應用場景所面臨到的不同問題,促進了speaker diarization的不同發展。例如在上世紀90年代末至本世紀初期,新聞廣播業界用speaker diarization自動注釋每天在全世界範圍内傳播的電視和廣播節目;2002年起,隨著歐盟M4、AMI等一些相關的項目成立,會議方面的speaker diarization需求猛烈增加,關於多峰態(在會議情境中就是有多個説話者)的語音資料的識別的研究也相應增多了。

 

簡單來説,speaker diarization可以從一段語音中,識別出是誰在説話,他/她又説了些什麽。

 

那麽speaker diarization是如何實現的呢?

 
圖一 speaker diarization的流程[1]

 

試想現在有記錄某次會議的一段音頻材料,材料裏有幾個與會人的聲音交替出現,中間可能夾雜著背景音、噪音,但是我們只想關注當中有人説話的片段而已。所以首先,我們要從該材料中提取有人説話的語音信號,而去除背景噪聲信號和靜音信號,以利後續處理。這個前處理步驟,我們稱之爲語音活性檢測(Speech/Voice Activity Detection, SAD/VAD)

 

VAD包含以下兩個主要步驟[2]:
 

  1. 對語音幀做特徵提取 常用的特徵像是全頻帶和子頻帶的能量(full-band and subband energies)[3]、語音和背景噪音的頻譜分散度量(spectrum divergence measures)[4]、基音預測(pitch estimation)[5]、過零率(zero crossing rate)[6]、高階統計量(higher-order statistics)[7][8][9]和語境信息(contextual information)[8]等。
  2. 判斷該幀是話音還是噪音 對於一個特徵向量 x" role="presentation" style="font-size: 113%; position: relative;">x ,默認話音和噪音可以叠加,那麽有兩個假設

     

    H_0:x=nH_1:x=n+s

     

    上述的判斷問題即可轉化爲比較後驗概率 P(H|x)" role="presentation" style="font-size: 113%; position: relative;">P(H|x) 大小的問題:

     

    Pleft(H_{1} mid mathbf{x}right)_{<}^{>} Pleft(H_{0} mid mathbf{x}right)Pleft(H_{1} mid mathbf{x}right)_{<}^{>} Pleft(H_{0} mid mathbf{x}right)

     

進行VAD以後,該音頻材料只留下有人説話的語音片段了。下一步是將它根據説話者轉化點進行切割,使得每一小語音段落從聲學信息上看是同一個説話者説的,這個步驟叫分割(Segmentation)。

 

分割的實現主要是通過滑窗的方式,取相鄰的兩個segment計算差異度,再與閾值比較,如果相鄰的兩segment差異度大於閾值,那就判斷前後兩段的説話者不同。

 


圖二 d-vector(左)和x-vector(右)[1:1]

 

計算之前需要先提取segment的説話人特徵,常見的表徵方法有[11]:

 

  • i-vector(identity vector)   i-vector是基於GMM-UBM所訓練的説話人的聲學特徵。   高斯混合模型(Gaussian mixture models, GMM)是利用多個高斯分佈來加權擬合一個分佈,可以平滑地表達任意形狀的密度分佈,但同時也表示參數會隨著高斯分佈的增加而增加,實作上需要更多的數據才能有效訓練一個GMM模型。   而通用背景模型(universal background model, UBM)是用很多不同説話者的聲音資料預先訓練好的GMM模型,可以減少訓練目標説話人的GMM所需的語音資料,所以GMM-UBM算是對GMM的一種改進。   每一個高斯分佈c都有參數:
     

    lambda=left{pi_{c}, mu_{c}, sigma_{c}right}_{c=1}^{C}
     

    經驗發現,取GMM中的平均矢量拼接而成的超矢量(或稱均值超矢量)對一位説話者的表徵效果最佳,超矢量表達式如下:
     

    m=left[mu_{1}^{T}, mu_{2}^{T}, ldots, mu_{c}^{T}right]^{T}
     

    一個GMM-UBM的超矢量參數就表達爲:

    M(s)=m_0+T w(s)


    其中,m_0為UBM的超矢量,T是表徵不同説話人和説話環境的變化矩陣,w是隱變量,也就是i-vector。

  • d-vector[12]   比起GMM這樣常規的因素分析模型(Factor Analysis model),Ehsan Variani等人想到用深度學習網絡(deep neural network, DNN)訓練一個分類器,如圖二(a)所示,以每一幀語音資料作爲輸入,輸出為該語音幀説話者的概率向量,維度就是説話者的數量。d-vector是取DNN模型的最後一個隱藏層來作説話人向量。

  • x-vector[13]   Snyder等人提出了利用TDNN提取説話人特徵,網絡拓撲如圖二(b)所示,將frame level的隱藏層通過statistic pool映射到segment level。取statistic pool之後的隱藏層作表徵向量x-vector,即圖中的embedding a和b。不考慮最後一層,因爲最後一層與説話者數量相關,汎化性不高。

 

上述提取説話者的特徵也稱爲speaker embedding,它是説話者識別(speaker identification)的基礎,後者是在前者的基礎上再聚類識別的。

 

根據所提取的説話人特徵向量,我們就能計算差異度(也稱兩個segment的距離)了。主要的度量方式有以下幾種[14][15]:
 

  • the Bayesian Information Criterion(BIC)[16]

    假設一段語音可以被表示為Nd維的向量
     

    x={x_i in R^d, i=1,.....,N}
     

    x符合高斯分佈x_i sim N(mu_i, sigma_i),其中mu_i是平均值向量,sigma_i是共變異數向量。
    用假説檢定,我們可以推論得出這段語音中是否有説話者的轉換。
    設虛無假設H_0為該語音段内無説話者轉換,則N個向量應該都符合同一個分佈;而對立假設H_1則認爲該語音段有説話者轉換,所以到i爲止的向量符合一個分佈,第i至第N個向量符合另一個分佈。
    表示如下:
     

    begin{aligned}H_0&:x_1...x_N sim N(mu, sigma)H_1&:x_1...x_i sim N(mu_1, sigma_2);x_{i+1}...x_N sim N(mu_2, sigma_2)end{aligned}
     


    兩個假設的BIC值表示為
     

    BIC(i)=R(i)-lambda P


    其中,R(i)為最大似然比,表示為R(i)=N log |sigma|-N_{1} log left|sigma_{1}right|-N_{2} log left|sigma_{2}right|,懲罰係數lambda = 1P為懲罰項
     

    P=frac{1}{2}left(d+frac{1}{2} d(d+1)right) log N


    若在該段語音中有一幀i的BIC值大於0,表示該處有説話者的轉換。   由於懲罰項的設置會大大影響模型,也不一定適合每一種情景,所以後續有一些改進的算法,像是懲罰項自適應的modified BIC criterion[16:1]或將模型整體的懲罰項一同考慮的其他變式[17]。但總體上,基於BIC的差異度度量計算量還是比較大的。
     

  • Generalized Likelihood Ratio(GLR)[14:1]

    GLR和BIC類似,是基於假説檢定的算法,不過BIC是移動時間點i,而GLR是以兩個固定長度的語音段做説話者轉換偵測。GLR測量距離的式子如下

     

    R=frac{L(x, N(mu, sigma))}{Lleft(x_{1}, Nleft(mu_{1}, sigma_{1}right)right) Lleft(x_{2}, Nleft(mu_{2}, sigma_{2}right)right)}
     

    x_1x_2分別是兩段相鄰的語音的幀向量,當R越小,兩段語音越可能是不同的説話者説的。
    這個方法的缺點是閾值比較難定義。
     

  • Kullback-Leibler divergence(KL)[18]

    也稱相對交叉熵,數值上等於以分佈A的編碼方式對分佈B進行編碼所產生的額外的編碼率,是基於信息理論的一種量度,用來衡量兩個概率分佈的差異情況[19]。
    要描述一個系統A所含的資訊量,我們通常用夏農熵(Shannon entropy),它計算A中各個事件的資訊量(self-information)的期望值,定義為
     

    begin{aligned}mathrm{H}(A)&=E_{A}leftlangleln P_{A}rightrangle=-sum_{i} mathrm{P}_{A_{i}} log _{b} mathrm{P}_{A_{i}}end{aligned}


    其中,E_{A}langlerangle表示求以A為目標分佈的期望值,P_{A_{i}}為事件A_i的概率;-log_b mathrm{P}_{A_{i}}是要表示事件A_i所需的編碼個數,當b=2時,單位為bit;當b=e時,單位為nat;當b=10時,單位為Hart[20]。
    兩個分佈的KL散度定義爲
     

    begin{aligned}KL(A ; B)&=E_{A}leftlangleln P_{A}-ln P_{B} rightrangle&=E_{A}leftlangle-ln P_{B}rightrangle-E_{A}leftlangle-ln P_{A} rightrangleend{aligned}
     



    其中,E_{A}leftlangle-ln P_{B}rightrangleAB兩個概率分佈的交叉熵E_{A}leftlangle-ln P_{B}rightrangle=-sum_i P_{A_i} ln P_{B_i}

    KL值越大表示分佈A和分佈B的差異越大。在speaker diarization中,我們就可以用兩個segment分別在特徵向量中的分佈的KL散度來衡量兩個segment的差異。

    然而,KL散度不具有對稱性:KL(A;B)和KL(B;A)不一樣,我們希望A、B之間的差異不管是從A算還是從B算都要是一樣的。所以有改進版KL2表示爲
     

    K L 2(A ; B)=K L(A ; B)+K L(B ; A)

     

  • Information Change Rate(ICR)[21]

    顧名思義,ICR度量的是若將兩段合爲一段所需改變的信息量,以各語音段的特徵的平均對數似然度來表徵,表示如下
     

    mathrm{ICR} triangleq frac{1}{M+N} ln frac{Pleft(X cup Y mid H_{0}right)}{Pleft(X cup Y mid H_{1}right)}
     

    其中MN是兩段語音的幀數或是兩個類的特徵數,X cup Y是兩個段語音合成以後的特徵表達。顯然,合併不同說話者的語音比合併同一說話者的語音增加更多的熵,實作中也是根據ICR值是否超過閾值來判斷説話者轉換的。

    ICR的計算量小,且ICR受特徵量的影響較小,因而更加能適應不同語音來源(更robust)。

 

得到很多的語音小片段之後,我們需要知道那些片段是同一個人講的,哪些是另一位與會者講的。由於不同的人聲學特徵不一樣,根據聲學信息,我們就能將分散的語音片段聚類,一名説話者對應一類,從而標注出每個片段的説話者,這個處理過程就是聚類(Clustering)。

 


圖三 聚類方法和流程[14:2]

 

一般是通過計算語音小片段的相似度,進而迭代做層次聚類(Hierarchical clustering)的[15:1]。主要分爲自頂向下、自底向上兩種,前者步驟如下:
 

  1. 將所有語音段看成一個群集,訓練出説話者模型
  2. 計算當前各群集的群内散度
  3. 將散度大於閾值的群集再分割
  4. 重複2至4,直至所有語音段都被分好了類

 

自頂向下的做法容易有overfit的情況,在Johnson, S.和Woodland, P的論文中有實現[22],但是比較少用到。

 

自底向上(agglomerative hierarchical clustering, AHC)的步驟則是:

  1. 初始化將每個語音段都看作是不同説話者
  2. 兩兩類計算相似度
  3. 將距離最小的類歸爲一類,更新説話者模型
  4. 重複2至4,直至類別兩兩距離都大於閾值

 

自底向上的做法容易有underfit的情況,常見的演算法有CURE[23]、ROCK[24]和CHAMELEON[25]。

 

最後會有再分割(resegmentation)[26]步驟進行修正。分割之後,可能結果會有一些錯誤,例如,在VAD階段拿掉的non-speech語音段可能包含説話者的轉換,導致分割的時候沒有辨識出該轉換點,而將實際上有兩個説話者的語音片段看成只有一個説話者。一般,再分割是引入一個HMM模型來擬合説話者的過渡[26:1],然後重複整個流程。

 

至此,speaker diarization的流程就依次包含VAD、segmentation、clustering、resegmetation,如圖一所示。下一篇將介紹 speaker diarization的近期發展。

REFERENCE
SHARE
Article Tags
Privacy 隱私 Federated Learning 聯合式學習 ASR 語音辨識 Emotion Recognition 情緒辨識 Psychology 心理學 Healthcare 醫療 Algorithm 演算法 Edge Computing 終端運算 Human Behavior 人類行為 Multimedia 多媒體 NLP 自然語言處理 Signal Processing 訊號處理