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

本文是繼那些自然語言處理 (Natural Language Processing, NLP)踩的坑後,純屬個人與小夥伴們近年研究語音處理的心得匯整回憶,歡迎討論交流 ! 若人設是大神的各位想嘴砲或幹話?

Deep Learning 101 Meetup (The top private AI Meetup in Taiwan launched on 2016)

看到 Google " nlp asr " 時的第一頁 結果,當然繼前篇踩坑心得迴響還不差後,依不嘴砲的慣例,就先說說搞完自然語言處理,後來與小夥伴們又踩了那些語音坑吧?首先是聲紋(語者)識別,接著自己皮癢搞了語音識別和kaldi,然後某天還看到了那意外有一起用餐之緣的深度學習大神 Yann LeCun 發文介紹 語音去噪(加強),也就心血來潮的讓小夥伴投入實驗,另外就是語音分離 (就是所謂的雞尾酒問題),也花了點時間投入;現在想想,小夥伴們真是給力啊 ! 補充一下,語音的坑在數據問題會小很多,但是真的要上線且要做成串流需要不少實驗,還有最後因加速推論而深入接觸量化(模型壓縮)的研究與實驗 ! 

2023/08 公司添購 RTX 6000 Ada 48 GB * 2 和 A 100 80GB * 4
2024/05 公司添購RTX 6000 Ada 48 GB * 8 * 2


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

這邊先分享一下2020年初時,通常我們是怎樣開始項目的研究與開發;首先我們會先盡可能的把3年內的學術論文或比賽都查出來,然後分功去做閱讀跟找到相關的數據集和論文以及相關的實作程式碼;同時也會找到目前已有相關產品的公司(含新創)以及他們所提交的相關專利,這部份通常會花上約30天的時間;找得方法通常就是透過 Google patens、paper with codes、arxiv等等。聲紋識別這塊在對岸查到非常多的新創公司,例如: 國音智能 這家在我們研究開發過程一直被當做目標的新創公司。


再來是我們這個項目真的多虧參加了我第一份工作,國家高速網路與計算中心 twcc 的科技抗疫專案提高聲紋辨識正確率,更添防疫新利器

另外找到的學術界論文和數據集如下 (相信你知道某些字特別打底線的原因?):
  1. Speech and Speaker Recognition from Raw Waveform with SincNet
  2. VoiceFilter: Targeted Voice Separation by Speaker-Conditioned Spectrogram Masking
  3. Deep Speaker: an End-to-End Neural Speaker Embedding System
  4. VoxCeleb2: Deep Speaker Recognition (數據集)
  5. AutoSpeech: Neural Architecture Search for Speaker Recognition
  6. NPLDA: A Deep Neural PLDA Model for Speaker Verification
  7. CN-CELEB: a challenging Chinese speaker recognition dataset (數據集)
  8. AISHELL-ASR0009-OS1 开源中文语音数据库 (數據集)
  9. AISHELL-2: Transforming Mandarin ASR Research Into Industrial Scale (數據集)
  10. http://www.aishelltech.com/aishell_3 (數據集)

接著可以先看一下上方的DEMO影片,看看效果;然後介紹一下相關實驗結果前,避免之後有人還陸續踩到我們踩過的坑;需注意的是上述很多數據集都是放在對岸像是百度雲盤等,百度是直接封鎖台灣的IP,所以你打不開是很正常的;另外像是voxcelab是切成7份,下載完再合起來也要花上不少時間,aishell 1 比起來相對好處理就是。當然最快的還是直接使用我們投入不少心力完成的臺灣深度大師。簡單總結為:1. 幾種 vector 的抽取 (i-vector, d-vector, x-vector) 跟 2. 模型架構 (CNN, ResNet) 和調參,再來就是 3. 評分方式 (LDA, PLDA) 等等幾種組合;意思是我們也使用了 kaldi 其中內附的功能,光是 kaldi 就又投入了不少時間和精力 ! 最後,這裡是2020年的一次比賽的相關結果,認真想要投入聲紋識別的可以試試 !
後來,在我們已經把相關實驗結果弄上產品落地場景時,剛好看到上面這則新聞,其實比起自然語言處理做聲紋識別,最小的坑莫過於雖然數據集不是很容易獲取,但是聲音是可以自行用程式加工做切割合併,然後因為場景限制,錄聲紋時的時長頗短,還得處理非註冊聲紋的處理,所以前前後後花了很多時間在將相關的數據搭配評分模式調整,真的是個大工程。
找到特定聲音特徵,並將其去除以提高質量;從含雜訊的語音信號提取純淨語音的過程


這個項目純屬意外發現,然後效果讓人很滿意,可以看看我們最後實驗影片還有 DEMO


噪音去除你可以跟另外一個聲音分離做聯想,基本概念差不多,只是噪音去除是把非人聲給去除 (記得注意一下是不是多通道);而做這個項目時,一樣也是匯整準備了相當多的學術論文和實驗結果,例如:
  1. Real Time Speech Enhancement in the Waveform Domain
  2. DCCRN: Deep Complex Convolution Recurrent Network for Phase-Aware Speech Enhancement(2020)
  3. Phase-aware Speech Enhancement with Deep Complex U-Net(2019)
  4. Speech-enhancement with Deep learning
  5. A Wavenet For Speech Denoising
如前述,噪音去除相對的數據集就比較好處理,網路上都可以找到,只要進行前後調整合併,就可以產出數量頗大的數據集,唯一需要考量的就是你的 GPU 夠不夠大整個吃下了,還有你這些數據集裡的人聲是不是一樣是英文,想要有更好的中文效果,看到這邊你應該知道我想要說什麼了。。。直接使用我們投入不少心力完成臺灣深度大師 啦 ! 我們的模型大小是經過優化的9 MB,而 RTF 是 0.08。 
從多個聲音信號提取目標信號;多個說話人的語音辨識問題,比如雞尾酒會上很多人講話

首先就如同這整篇語音踩的坑來說,比較常碰到因為網路架構在做參數調整時導致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發文介紹 完去噪後,又發文介紹了語音分離,整個語音分離這個項目,大致上就是都圍繞在 Dual-path RNN 或者 Dual-path transformer 這樣。


最後要深入這項目,務必看完臺大電機李宏毅老師的 影片還有一篇最新的論文;我們最後也是多虧李老師及第一作者黃同學的解惑,然後小夥伴們才又更深入的確認並且解決問題。



最後,可以抽空看一下上方的 DEMO 影片,然後看到這邊,覺得對你之後要做的研究有興趣的,歡迎 " 按贊、訂閱、分享、交流 " ? XD ~ 如果實在沒辦法深入太多,你知道的,不管是自然語言處理踩的坑還是這篇語音辨識踩的坑,我最希望你知道的那6個字:臺灣深度大師
通過語音信號處理和模式識別讓機器自動識別和理解人類的口述

NeMo: a toolkit for conversational AI 這是 nvidia 開源的一個套件,如果你剛好也有關注 GTC 2021,那你應該也會注意到 Jarvis ,然後你就會發現,想要應用在中文的場景,那你就還是乖乖的。。。嗯 ! 你懂的 !

至於語音識別這一塊,我想大家直覺的會先想到 Google (每月 Speech-to-Text 成功處理的前 60 分鐘音訊免費,之後以 15 秒為單位計費。) 跟 微軟 Azure (每月免費 5 音訊小時) 吧,然後都會覺得為什麼還需要自己搞一個語音識別模型呢?大神們都已經做的那麼好了?如果你有真的使用過,你會發現萬一你的場景講話比較快或略不清楚,Google 跟 Azure 都會選擇性的把你的聲音略過不做識別,那這樣用自己的真的會比較準嗎 ? 我只能說你的數據集如果貼近你的應用場景,那麼效果會比較好一點的,另外就是你可以自己新增一些關鍵領域內的語音,識別後還可以自己加上糾錯,那你就會有更低的錯誤率了,而且時代在進步,現在的語音識別已經可以做到約3-5000小時的語音,然後標註時不用切字,直接end2end的訓練,再加上語言模型,效果都有一定的水準的 ! 最後就是近期頗值得注意的Speech Brain:A PyTorch Powered Speech Toolkit;剩下的就是看你到底有多需要自己硬幹語音識別啦,比如說最近很常聽到大家都想做 " 台語語音識別 " 在這裡就有些資源可以自己嘗試 ! 關於語音處理和自然語言處理踩過的坑已經盡量的用兩篇文章來介紹,當然一定還會有更多坑在等著你去踩,因為時代在進步,真的不知道會不會那天又被做出什麼大研究啊 ! 後面時間許可的話,再來寫寫這兩篇文章內提到的一些算法細節或者我們的應用吧 !