iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1
AI & Data

AI Voice Conversion系列 第 9

【Day9】 Speaker Identification 介紹與 D_VECTOR 實做

舊時代的 Speaker Identification

同一人講不同話,再轉成 Mel 之後還是不同的東西,那我們又該如何判斷出一句話是哪個人講的呢 ?

  • 這樣的任務在深度學習大紅大紫之前就有人做過了,那時候用的是名叫高斯混合模型 (GMM) 的方法,他是由很多個高斯分佈的線性組合而成的,這個方法在理論上是可以擬合所有的類型分布。

  • 有了 GMM 之後,接著又延伸出了 i-vector 的演算法,相對於 GMM 這種生成模型是類別確定的 (類別之外的無法被 GMM 處理,實際上也不可能訓練一個全人類的聲音分類器),i-vector 它轉而去尋找一個 hidden variable space,讓每個人都是這個空間里的一員。

  • 到這裡傳統的做法就告一段落了(自己也沒有深入去研究怎麼算的 XD),但如果你對 GMM 有興趣的化可以參考這篇論文

新時代的 Speaker Identification

  • 在 D_VECTOR 出現以前 i-vector 框架可以說是毫無對手,整整佔據了 Speaker Identification 這個項目長達 14 ~ 15 年之久,而接下來要介紹的這個 D_VECTOR 就純粹的只有 DNN 架構,沒有任何複雜又勸退的機率模型,大大降低了這項任務的門檻,是劃時代的變革,儘管我們用 DNN 去學到的東西跟 i-vector 是相同的,都是在尋找 hidden variable space,然而 D_VECTOR 的模型架構卻十分的簡單。

把它訓練模型寫出來就長這個樣子

  # class 看你用幾種
  def build_model(input_size,hidden_size = 256,n_class = 5):
      model = Sequential(
            [  
               Dense(hidden_size,input_shape=(input_size,)),
               Activation('relu'),
               ########################
               Dense(hidden_size),
               Activation('relu'),
               Dropout(0.5),
               Dense(hidden_size),
               Activation('relu'),
               Dropout(0.5),
               ###################################
               # D_VECTOR 的源頭就在下面這一層提出來  #
               ###################################
               Dense(dim_emb,name="class_dense"), 
               Activation('softmax')   
            ]
        )
     return model
  • 在訓練的時候輸入 x 就是語音的特徵 (梅爾倒頻係數或是你可以參考 paper 的作法),目標 y 則是類別標籤,loss 採用 categorical_crossentropy

  • 在評估的時候輸入 x 只通過最後一層 Dense 再把結果做 L2 norm 然後累加出來做平均(或是 PCA)就煉成了 D-VECTOR,也就是 Speaker Embedding。

  • 當然 D_VECTOR 的模型也有許多變體,像是你可以把 Dense 改 LSTM,或是用 Convlution 去達成,我們上面做的是最古老的版本。

評估我的 D-VECTOR 有沒有起做用

比方說現在有 N 個不同的人,模型也照這五人訓練了,那要怎麼評估模型有用呢?

  1. 從這 N 人的測試資料集算出平均的 D-VECTOR

  2. 從這 N 人再取不在資料集的語音算 D-VECTOR

  3. 計算兩 D-VECTOR 的 Cosin 距離,各自對應的都該是最短距離

     from sklearn.metrics.pairwise import cosine_similarity
     result = []
     #  ave_dv 有 5 人的平均 D-VECTOR
     for test_dv in ave_dv:
         tmp = []
         # valid_dvs 有 5 人不在資料集的 D-VECTOR
         for valid_dv in valid_dvs:
             res = cosine_similarity([test_dv], [valid_dv])
             tmp.append(res)
         result.append(tmp)
    

小結 & 碎念

今天我們簡單介紹也實做了 D_VECTOR ,明天開始我們終於要正式進入聲音轉換的部分了!

颱風要來了,大家記得做個防颱準備吧!

參考資料

D_Vector Implement
D_Vector Paper

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


上一篇
【Day8】 用 MelGan 把 Mel 轉成 Waveform
下一篇
【Day10】 聲音轉換概述 - 再次出發!
系列文
AI Voice Conversion30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言