中文語者分離(分割)

Chinese Speech Separation (Speaker Separation)

從多個聲音信號中提取出目標信號;多個說話人情況的語音辨識問題,比如雞尾酒會上很多人講話

本文由 Gui-Ru Li & Hsiang Hsu、Ian Wang 撰寫初稿後再進行編修,且會努力持續更新

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

Meeting & Minutes Master | TW Deep Master
Call for Partner or POC (Proof of Concept) Contact: TonTon ( at ) TWMAN.ORG

中文語音識別中文語音增強(去噪)中文語者識別

投入約150天如同語音踩的坑來說,比較常碰到因為網路架構在做參數調整時導致loss壞掉等等,而因數據集造成的問題少很多,網路上也比較容易找到更多的數據集,然後也有非常多的比賽有各種模型架構的結果可以參考,但是一樣是英文數據,而語音坑最好的就是只要有了像是 aishell 等的數據集,你想要切割或合併成一個語音,都不是太大的問題;例如我們就是把數據集打散混合,再從中隨機挑選兩個人,然後再從中分別挑出語音做混合;如是長度不同,選擇短者為參考,將長者切到與短者相同;最後產出約 train: 5萬多筆,約 32小時、val:1萬多筆語音,約10小時、test:9,千多筆語音,月 6小時,而這個數據集是兩兩完全重疊,後來為了處理兩兩互不完全重疊,再次另外產出了這樣的數據集:train:9萬多筆語音,計112小時、val:2萬多筆語音,計 26.3 小時、test:2萬多筆語音,計 29.4 小時。

中間也意外發現了Google brain 的 wavesplit,在有噪音及兩個人同時講話情形下,感覺效果還不差,但沒找到相關的code,未能進一步驗證或是嘗試更改數據集。還有又是那位有一起用餐之緣的深度學習大神 Yann LeCun繼發文介紹 完去噪後,又發文介紹了語音分離;後來還有像是最早應用在NLP的Transformer等Dual-path RNN (DP-RNN) 或 DPT-NET (Dual-path transformer) 等應用在語音增強/分割,另外VoiceFilter、TasNet 跟 Conv-TasNet還有sudo-rm等等也是語音分割相關,當然更不能錯過臺大電機李宏毅老師一篇SSL-pretraining-separation的論文 (務必看完臺大電機李宏毅老師的影片),最後也是多虧李老師及第一作者黃同學的解惑,然後小夥伴們才又更深入的確認並且解決問題。

這裡做數據時相對簡單一點,直接打散混合,再從中隨機挑選兩個人,然後分別挑出語音做混合,若長度不同,選擇短者為參考,將長者切到與短者相同,兩兩完全重疊或者兩兩互不完全重疊等都對效果有不小的影響;同時也研究了Data Parallel 跟 Distributed Data Parallel 的差異,但是如何才能在 CPU 上跑得又快又準才是落地的關鍵

Dual-Path Transformer Network: Direct Context-Aware Modeling for End-to-End Monaural Speech Separation

  • 過去的語音分離模型使用複雜的RNN/CNN進行建模,這種需要透過中間狀態傳遞資訊的方式使得模型分離的效果不好

  • 本文提出一種end-to-end模型, dual-path transformer network (DPT- Net), 並在wsj0-2mix資料集上取得SDR=20.6的成果

  • Proposed Methods

    • 加入修改的transformer:原本的 transformer block 中的 Feed-Forward Network 是由 linear+activation function+linear 組成,現在改成使用 **RNN**+activation function+linear,用來獲取有順序性的資訊,並省去原本的 positional encodings

    • 由於transformer只處理數百個長度的序列,而語音分離的輸入通常很長,因此作者整合了 dual-path network 使模型能處理長語音序列

  • Architecture

    • Encoder: 由L個濾波器(1-D Conv)組成,目的是將聲音轉成特徵

    • Separation Layer

      • 分割: 將聲音分割成重疊的chunk後組成3-D向量

      • dual-path transformer processing: 將向量傳遞給transformer進行局部建模與全局建模,由於transformer不用透過intermedia state傳送訊息,因此資訊可直接交流。另外,原始transformer使用positional encoding來整合順序訊息,本文則使用RNN來整合順序訊息

      • overlap-add: 重建原始聲音

    • Decoder:轉換特徵並將聲音輸出

不考慮重疊情況下的語音切割

Unbounded Interleaved-State Recurrent Neural Network (UIS-RNN):https://github.com/google/uis-rnn

58 同城

  • 聲音輸入 -> 基於空白音做切段 -> 使用 K-mean 等 Cluster 方法分群

優點:

  • 語音切割後能得到說話人之間的斷點,可明確知道在何時切換。

  • 說話人總數無須事先設定,且無論人數多少模型皆可通用。

缺點:

  • 無法處理聲音重疊的問題。

  • 若是使用空白音切割,在語者之間說話沒有間隔的情況下必報錯。

  • 若是使用固定時長切割,依據時長的設定可能切出空白佔多數或是一段內同時包含兩個人的情況。

  • K-means 等 Cluster 演算法經實驗後發現效果不佳。

VoiceFilter

  • 透過GE2E模型生成目標說話人的Speaker embedding(d-vector)作為分離的參考依據

  • 模型輸入raw signal的混合人聲,經過CNN後會和d-vector進行拼接,再經過LSTM與fully-connected層後生成mask

  • 將mask乘上原始輸入,並透過inverse short-time Fourier transform重建增強的聲音

  • 原始論文

VoiceFilter-Lite

  • VoiceFilter-Lite 專注在提高ASR性能,所以不需要使用逆STFT重建聲音波形,

  • 模型輸入是將聲學特徵作為輸入,並輸出增強的聲學特徵,也就是使用聲音特徵而非頻譜圖作為輸入,因此也不需要重建波形

  • 由於ASR模型中若加上聲音過濾的話會使效能降低,造成wer很高(大部分是誤刪造成的),所以作者提出asymmetric loss,新增penalty以控制抑制噪音的錯誤,並在過度抑制時進行補償

  • 原始論文

使用 Mask 訓練的方式將一段聲音轉換為二個(或多個)聲音。

TasNet & Conv-TasNet

  • 聲音輸入 -> Encode -> Separation -> Decode -> 分離後的多個聲音,兩者差異只在 Separation的設計。

VoiceFilter: Targeted Voice Separation by Speaker-Conditioned Spectrogram Masking

  • 此模型設計較特殊,用於抓出一段聲音中用戶指定的聲音。因此在模型的設計上相較 TasNet 多了一段引入指定聲音 d-vector 的部分,且輸出只有一段聲音,其他大致上維持不變。

優點:

  • 即使多個人聲音重疊仍能有成功分離的機會。

  • 同模型可使用在去噪功能。

缺點:

  • 此類模型大多建立在兩個說話人的場景,雖說多人場景能在修改模型後實現但未經驗證。

  • 模型即使修改成多人,但一個模型只能適用在一個固定人數的場景。

  • 分離後的聲音不會有明確切分點,在分成 A、B 兩人後仍可能在 A 的聲音某幾個小點被判斷成 B。