中文語音增強(去噪)
Chinese Speech Enhancement
找到描述特定聲音特徵,並將其去除以提高質量;從含雜訊的語音信號中提取出純淨語音的過程
中文語音識別、中文文本分類、中文文本糾錯、中文機器閱讀理解、中文實體識別、中文文本相似度、中文聲紋識別、中文語者分離
那些自然語言處理踩的坑 | 御守臺灣・科技抗疫:提高聲紋辨識正確率 更添防疫新利器 | 那些語音處理踩的坑
ComfyUI + Multimodal Model + Segment Anything Model 2 + Stable Diffuision + FLUX
大型語言模型要踩的坑 | 那些ASR和TTS可能會踩的坑 | 白話文手把手帶你科普 GenAI
坑都踩完一輪,大型語言模型直接就打完收工?
那些檢索增強生成 (Retrieval-Augmented Generation, RAG) 要踩的坑
Call for Partner or POC (Proof of Concept), Contact: TonTon ( at ) TWMAN.ORG
https://github.com/Deep-Learning-101 | https://huggingface.co/DeepLearning101
Insurance (壽險) FAQ - High Entropy Alloys (材料) FAQ - Cryptocurrency Exchange (交易所) FAQ
語音質檢/噪音去除 (語音增強) - 多模態大型語言模型之單據核銷- 診斷書醫囑擷取分析
ASR 語音語料辨識修正工具 - 客服ASR文本AI糾錯系統 - 逐字稿文本內容比對工具 - 線上語音合成;GPT-SoVITS Speaker:TWMAN
分組投入約150天;說到會做語音增強(去噪音),這一切真的只是因為那有一面之緣的圖靈獎大神在FB發文介紹FAIR的最新成果;而噪音去除你可以跟另外一個聲音分離做聯想,基本概念其實差不多,只是噪音去除是把非人聲給去除 (記得注意一下是不是多通道);而做這個項目時,一樣也是匯整準備了相當多的學術論文和實驗結果 (如下所附) ;做語音感覺上數據也是很重要,但噪音去除相對的數據集就比較好處理,網路上都可以找到,只要進行前後調整合併,就可以產出數量頗大的數據集,唯一需要考量的就是你的 GPU 夠不夠大整個吃下了,還有你這些數據集裡的人聲是不是一樣是英文,或者是你想要中文的效果?順道一提最後我們的模型大小是經過優化的9 MB,而 RTF 是 0.08。
Youtube: https://www.youtube.com/watch?v=77cm_MVtLfk
特點與優勢
CPU Real-time執行速度。
基於 DEMUCS 架構之End-to-end 模型。
DEMUCS
By Facebook
github: https://github.com/facebookresearch/demucs
原用於語音分離,在調研說話者分離時有找到過,但預訓練基於音樂便沒有深入。
基於 U-Net 設計,原架構與本論文稍有不同
TasNet v.s. Conv-TasNet v.s. DEMUCS v.s. This Paper
前三個架構皆源自於語音分離任務,首先檢視TasNet原論文 Fig. 1 架構圖:主要可分為 Encoder、Separator 與 Decoder 三塊,重點在於中間的 Separator 會計算出對應要切出的音源數量(原論文與大部分評測都是兩個聲音的分離)的 Mask 並與編碼後的輸入音源相乘計算出各個分離後的聲音,可想像成是 Ideal Binary Mask(IBM)的進階版。Conv-TasNet 則是基於 TasNet 的再改良,中間的 Separator 放棄使用 LSTM,改成使用 TCN來計算 Mask,TCN 架構改良自 Google 的 WaveNet ,原被用在執行語音合成任務。DEMUCS 則源自2019 Facebook 的論文 “Music Source Separation in the Waveform Domain”,用於音樂的分離。Separator的部分與上圖基本相同,而 Encoder 與 Decoder 對應層數的部分新增了類似於 U-Net 的 Skip-connection 設計。Facebook denoiser 便是基於上圖的 DEMUCS模型。但此模型原本設計是用於語音分離,在中間 Separator (LSTM) 的部分會有兩個輸出,在去噪的使用場景中並不需要。因此,在論文內提到Separator 輸出後會用一層的 Linear layer 將兩個輸出合併為一個,便可維持單一語音輸入,單一語音輸出的模式。
資料需求:(吵雜聲音 - 乾淨聲音)的兩兩一組配對,需為同一聲音的噪音版與乾淨版,可分開提供各種雜訊與乾淨聲音自行做相加。原始論文與我們自己的實驗都證明過自行加噪的聲音訓練出來的模型應用在實際場景仍然有效。
多通道實驗
語音多通道可分為兩種實作方法:
每個通道的訊號作為獨立訊號分開計算,輸出仍為多通道語音。可維持資料格式的一致性。
多通道音訊先合併為單通道音訊再做運算,運算時資訊較豐富,但輸出只能為單通道且無法還原。
除此外需額外注意不同的套件與檔案類型多通道讀出時的問題。
Python 中使用 scipy 套件讀取多通道音檔的格式為 shape = ( length, channels ),但若使用 torchaudio 套件讀取則格式為shape = ( channels, length ),需使用 transpose 統一。
PCM 檔案並不帶通道數資訊,需在讀出後重新 reshape 才可使用。
DCCRN: Deep Complex Convolution Recurrent Network for Phase-Aware Speech Enhancement(2020)
論文:https://arxiv.org/abs/2008.00264
Github:https://github.com/huyanxin/DeepComplexCRN(only examples &model code)
特點與優勢:
基本架構與 Facebook denoiser 相同,只有以下兩個差異:
輸入與輸出為原始聲音經 convolution encoder-decoder (CED) 或 U-Net 架構做STFT 與 iSTFT(STFT 反轉)。(轉換後為複數格式 a+bi)
中間 CNN 與 LSTM 運算皆使用複數計算方法。
複數計算的優勢在 Phase-aware Speech Enhancement with Deep Complex U-Net 段落有紀錄,而此架構的優勢紀錄於 Facebook denoiser 段落。
Interspeech 2020 Deep Noise Suppression Challenge 第一名。
缺點:
主要問題與 Phase-aware Speech Enhancement with Deep Complex U-Net 段落相同,為滿足複數計算條件,原本的一個運算皆會演變為 4 個運算。尤其是此模型中間與Facebook denoiser 一樣用到了 LSTM,預測的時間拉長應該會很明顯。但是,在Interspeech 2020 Deep Noise Suppression Challenge 中有明確的規範,T 毫秒的語音使用 2.4 Ghz 的 Core i5 四核 CPU 處理時間不能超過 T/2 ms。
Phase-aware Speech Enhancement with Deep Complex U-Net(2019)
https://blog.csdn.net/ssqqssqq/article/details/80398802
論文1:https://arxiv.org/abs/1705.09792
論文2:https://openreview.net/pdf?id=SkeRTsAcYm
Github1:https://github.com/AppleHolic/source_separation
Github2:https://github.com/sweetcocoa/DeepComplexUNetPyTorch
特點與優勢:
基於 U-Net 並使用複數形式的特徵與計算方法,主要參考來自 Deep Complex Networks。
複數的格式並非要取其複數的實際意義,而是將複數的實部與虛部可分別看作兩個獨立的特徵表示。在計算過程中採用複數的計算方式,使得兩個特徵表示又能有效地做交互計算且計算能更多樣化。舉例來說,假設擁有 feature map F 與 kernelk,原始的 CNN 計算可寫作 F * k。在複數計算中即可分成 imaginary feature Fi、real feature map Fr、imaginary kernal ki 與 real kernel kr,複數 CNN 計算結果則可寫作imaginary:(Fr * ki) + (Fi * kr) 與 real:(Fr * kr) - (Fi * ki)。
此篇論文將 Deep Complex Network 的計算方式應用至去噪模型中常見的 U-Net 架構上,並生成 Mask 乘上原始聲音得到乾淨聲音。Mask 的計算方法可參照架構中的圖,但比起生成 Mask,目前還是先以能直接生成乾淨聲音的結構為主,因此此方案暫且擱置,若效果尚無法突破再做考慮。
提供新式 weighted-SDR loss。
在 DEMAND 資料集排行榜上 PESQ 評分排行第一(large)與第三(base)。(Facebook denoiser 排行第四)
使用 STFT 特徵作為輸入。
RHRNET
論文:https://arxiv.org/pdf/1904.07294v1.pdf
Github:https://github.com/Jalal-Abdulbaqi/AudioSamples(only example)
特點與優勢:
此模型基於多層 GRU 與 Residual 設計,但實際上比起 Residual 改模型以GRU 版本的 U-Net 來形容更為直觀。
論文內在還原長度的過程中,沒有採用 U-Net 常見的 upsampling,而是使用單純的reshape 來增加長度,以避免資訊遺失。
在每一層的 GRU 計算,hidden state 都會向後傳遞,在傳遞一定長度後前段的資訊會逐步消失。因此,模型添加上 Residual(U-Net)設計,以避免後面計算時前段資訊的遺失。
在七層的 GRU 中,最後一層為單向 GRU,而其他皆為雙向,輸出為雙向結果的拼接。
在 DEMAND 資料集排行榜上 PESQ 評分排行第二。(Facebook denoiser 排行第四)
缺點:
在之前的實驗中,單層的 LSTM 計算速度已經很慢,更何況此模型用了七層。即使GRU 的速度能比 LSTM 稍微增快,但仍是十分耗時。
程式碼與模型皆無釋出,雖說此模型架構簡單可自行重新建構,但未必能還原論文與github 範例的效果。
Speech-enhancement with Deep learning
https://towardsdatascience.com/speech-enhancement-with-deep-learning-36a1991d3d8d
Github:https://github.com/vbelz/Speech-enhancement
特點與優勢:Training data: clean:LibriSpeech + SiSec, noise: ESC-50 + [https://www.ee.columbia.edu/~dpwe/sounds/]
主要方法為將音檔轉成頻譜圖影像後,使用基於 U-Net 的模型做訓練。
頻譜圖可分為 magnitude spectrograms 與 phase spectrograms 兩種,考量到前者包含的資訊量較完整,因此此模型使用 magnitude spectrograms。
模型輸出為噪聲預測,因此,需再將原始聲音減去預測結果才能得出去噪聲音。
U-Net 在影像領域上的表現優異,將聲音轉為頻譜圖影像作為模型輸入的概念也很直觀合理。
根據展示的範例,效果明顯優於 RNNoise。
預測速度上因少了中間的 LSTM 計算,相較於 Facebook denoiser 在單一次預測的速度上能一定程度的加快。(若為 1 秒內的音檔,預測時間需 0.08 秒)
架構:U-Net
缺點:
模型輸入每次為固定長度,因此長語音需經過切分後多次的預測。當語音長度達 5 秒,預測時間需花 4 秒完成,相對 Facebook denoiser 的速度優勢會消失。
輸入頻譜圖雖直觀,但此模型的輸出為噪聲,相對 Facebook denoiser 則需要更多額外的計算步驟,且輸出噪聲這件事,如同在 Facebook denoiser 段落的 “曾經的改良想法但後來判斷不可行” 第一點所寫,並沒有什麼意義。
模型輸入一次只能最多約 1 秒的窗口大小,對於去噪任務來說,整體的考量相對重要, 因此在某些情況下可能出現不確定性,如:長聲音切段後一段聲音內只含噪音,而噪音 類型又偏向人聲。
A Wavenet For Speech Denoising
https://zh.wikipedia.org/wiki/WaveNet
論文:https://arxiv.org/pdf/1706.07162.pdf
Github:https://github.com/drethage/speech-denoising-wavenet
特點與優勢:
基於 WaveNet 並修改成適應於語音去噪任務。
Conv-TasNet 中間 Separator 的設計與 WavNet 相同,可得證 WavNet 架構設計在於語音分離或語音去噪等任務應也有不錯的表現。
相對於原始 WaveNet 修改如下:
將原本網路架構改為 Non-causality,即原本網路對於每個 Sample 的計算只會考慮時間序列中在該樣本之前的樣本,而此論文另外加上了在時間序列中排在該樣本之後的樣本。因此,在去噪任務這種整體分析格外重要的任務能有更好的表現。改法為將原本kernel size = 2 (t-1, t)的卷積改為 kernel size = 3(t-1, t, t+1)。
最後幾層的原 1*1 卷積改為 3*1 以增強輸出的連續性。
模型的輸出值由 softmax 預測值改為預測實際值。
仍有其他能使模型加速或效果提升等其他修改項,但基於數學計算過於強烈可參照原始論文。
RNNoise
https://jmvalin.ca/demo/rnnoise/
https://zh.wikipedia.org/wiki/%E5%B7%B4%E5%85%8B%E5%88%BB%E5%BA%A6
論文:https://jmvalin.ca/papers/rnnoise_mmsp2018.pdf
Github:https://github.com/xiph/rnnoise/
特點與優勢:
非語音-to-語音的 end-to-end 模型。理由:避免參數過多,只在某些較關鍵的計算改用模型。
模型計算的主要輸入為基於巴克刻度(Bark scale)的 22 個頻段,模型會訓練這 22 個頻段的通過權重(介於 0 ~ 1 之間),並可避免計算後添加原本不存在噪音的情況發生。
包含上一點的 22 個主要特徵及其他輔助特徵,模型輸入共包含共 42 種語音特徵作計算。
模型架構基於 GRU,為 RNN 家族內計算速度較快的,且作者驗證即使改用 LSTM 也沒有較好的結果。(推測為輸入特徵過於簡單無需複雜計算)• 輸入簡單使訓練也同樣簡單化,雖文內沒提到但訓練所需資料與收斂所需時間相較 end-to-end 模型應該都較少。
缺點:
整體去噪流程設計仍為基於傳統方法,通常若非 end-to-end 方法在現有條件下明顯不佳(例如:ASR、對話生成等),則建議使用 end-to-end 方法,因爲通常人為設定的部分愈多效果上的局限性也愈大。
模型輸入的前處理過多並非目前模型設計上的主流做法,且此項前處理並沒有特殊的部分,單純為輸入簡化,相較於 Facebook denoiser 整體設計較為陳舊。
傳統方法
https://blog.csdn.net/wangxunweihua/article/details/90259865
https://jmvalin.ca/demo/rnnoise/
簡述:先檢測出聲音中哪些部分只含噪音哪部分包含語音並得出噪音訊號,並在計算後消除噪聲。
範例:
VAD(Voice Activity Detection)—> 用以偵測哪部分為純噪音不含語音。
OMLSA(Optimally Modified Log-Spectral Amplitude Estimator)
IMCRA(Improved Minima Controlled Recursive Averaging)
缺點:
通常採用整段聲音的前幾 frame 做初始化,若前幾 frame 便是語音則效果極差。
不善於應付複雜的噪聲,如人聲、電視聲、音樂等。
數學公式極度複雜
SEANet: A Multi-modal Speech Enhancement Network(Google, 2020)
論文:https://arxiv.org/pdf/2009.02095v2.pdf
Github:https://github.com/google-research/seanet(only examples)
特點與優勢:
結合 GAN 與 U-Net 的模型設計,且為全卷積設計,計算效率較佳。
google-research 出品,效果保障。
因多加了一個類似 reference 功能的輸入,即使噪聲較清楚明顯仍能成功去除。(github提供的範例可證)
U-Net(Generator)部分層數設的較深,encoder 與 decoder 各自為 30 層的 CNN,因此又額外再加上 Residual 設計以避免資訊流失。(此方案曾經想過,但目前層數較少意義不大)
缺點:
除了普通的帶噪聲語音輸入外,需要額外的 “骨導加速度計” 訊號以作為 reference,基本上已可判定此模型完全不符合使用場景。
雖為全卷積設計,但模型層數較多,且沒有提到使用了像 depthwise separable convolution 等節省記憶體的方法。因此,整個模型雖沒有用到 RNN 而效率佳,但在容量與執行速度上可能也沒辦法到很快。
GAN 架構的模型難以訓練,在資料的量與分佈的要求都相對較高,且容易訓練失敗。