BLOG + NEWS

HOME BLOG
誰在說話?淺談 Speaker Diarization 「語者自動分段標記」
BLOG・Speech 語音
SHARE
誰在說話?淺談 Speaker Diarization 「語者自動分段標記」
誰在說話?淺談 Speaker Diarization 「語者自動分段標記」
08
DEC
2020
9143
Yvette

目錄

  • 語音活性檢測(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