那些ASR和TTS可能會踩的坑

https://github.com/Deep-Learning-101/Speech-Processing-Paper

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

中文語音識別 (Chinese Speech Recognition)

好一陣子之前,針對當初曾在語音處理上做過的事,寫了篇踩了什麼坑,這次來更新一下,針對又一些比較實際的可能商業場景,在 ASR 和 TTS 陸續又碰到那些問題,以及新嘗試了什麼;首先當然是目前 ASR 的王者  whisper 了(當初的 Nemo 完全沒參賽權了 XD) ! 當然還有很多開源的,但為了實際快速落地產品做些像是客服的場景,所以就先衝刺 whisper,其它的當然會持續關注。

 https://github.com/openai/whisper

Robust Speech Recognition via Large-Scale Weak Supervision (Whisper / OpenAI)

當然啦,在開源的世界裡不可能只有一個,完全不意外的馬上就有很多相關的開源繼續冒出

Whisper對於中文語音辨識與轉寫中文文字最佳化的實踐 而這篇可以先瞄一下,因為講到了 whisper 雖然可以透過 prompt 來做標點符號 (為什麼?因為跟後面的糾錯可能有關),但是效果仍有待強化,所以得用另外的模型來輔助 !

  1. https://github.com/guillaumekln/faster-whisper
  2. https://github.com/m-bain/whisperX
  3. https://huggingface.co/BELLE-2
  4. https://github.com/shuaijiang/Whisper-Finetune
  5. https://Systran/faster-whisper-large-v3
  6. https://github.com/huggingface/peft
  7. https://github.com/ufal/whisper_streaming
  8. https://github.com/Vaibhavs10/insanely-fast-whisper
  9. https://github.com/ggerganov/whisper.cpp
  10. https://github.com/Const-me/Whisper
  11. https://github.com/collabora/WhisperSpeech
  12. https://github.com/collabora/WhisperLive
  13. https://github.com/collabora/WhisperFusion

首先是 2,主要是曾經有過需要幫ASR產生的文稿加上時間戳記,所以就這樣找到了它,看資料 2 是由 1 所優化而來的;3則應該是以LLM為主,但他也開源了幾個微調過的 whisper,目前所測效果是相對好的;接著針對 4 裡提到的加速預測,會因為少了這兩個 preprocessor_config.json 和 tokenizer.json 而導致 large-v3 無法轉換,解法就是如下面兩個 issue 所列,你可以去找到有這兩個檔案的 v3 模型,然後放進去就可以轉換了 ! 

5 則是包含openai/whisper-large-v3到CTranslate2模型格式的轉換;6 是微調的方法;7 看名字就知道是主要針對串流的長時間語音到文字的轉錄和翻譯;8-10 我就沒特別深入去實驗了 ! 至於11和12算是可以整合成13,而13看起來就是用 ASR 去問 LLM,你這時要不要做 RAG 我想都沒差,然後再用 TTS 回答這樣

接著參考一下 4 所提到的 cer 評比效果,以及我實際做了一些實驗的結果;
算 wer 可以參考這個 https://github.com/nuaalixu/pyResults

Belle-whisper-large-v3-zh_vad
Belle-whisper-large-v3-zh_novad
Belle-whisper-large-v2-zh_vad
Belle-whisper-large-v2-zh_novad

就這樣測完一波,目前得到的結果也確實是 Belle-whisper-large-v2-zh_vad 會比較好,那麼接著就是該怎樣繼續優化了;首先是基於找到4提到的優化方法還有 huggingface 上所提的


因此,就會需要再用到這兩個工具了,對,除了前面的 vad 後,再嘗試看看能否使用分離來把人聲更乾淨的切出來 ... 接著就是要製作相關的語料了;像下面這個就是 whisper 微調用的語料格式


https://github.com/flutydeer/audio-slicer

Ultimate Vocal Remover 5 (UVR5) 是一款基於深度神經網路的樂器分離軟體。 它透過訓練模型,能夠準確地將鼓、貝斯、人聲等其他聲部分開。
https://github.com/Anjok07/ultimatevocalremovergui
https://ultimatevocalremover.com/

結果,後來發現 UVR5 這些跑起來實在是有點太慢了 ... 最後我還是用了 denoised 就是

當然,也有相關文件顯示,用阿里巴巴達摩院的 FunASR在中文的效果會更好?因為 whisper 雖然是68萬小時的全世界語言,但是中文其實不知道佔了多少,而達摩院則是做了6萬小時的中文標註語料;只是。。。實際在我碰到的場景,效果實在有點囧囧的就是

到這邊差不多確定要怎樣做,就是要開始製做數據了,印像中記得要做你自己的ASR場景微調,至少要 100 小時,所以特地寫了個小工具,可以用來改ASR的錯字

最後就是針對ASR辨識後的修正了,目前看來客服語音應該是不太能這樣直接套用;這部份的實驗就暫時也不介紹了,畢竟這篇是先針對 ASR 在實際可能的商業場景落地會踩到的坑 ?

https://github.com/microsoft/NeuralSpeech/tree/master/FastCorrect
https://github.com/microsoft/NeuralSpeech/tree/master/FastCorrect2
https://github.com/microsoft/NeuralSpeech/tree/master/AdapterASR
https://github.com/shibing624/pycorrector/blob/master/README.md

糾錯其實也會需要數據,包括了音似和形似,所以也得再自己寫個工具來製作數據;這個就要看你有沒有逐字稿了 !


中文語音合成 Chinese Speech Synthesis

目前看過效果最好的中文語音合成工具
GPT-SoVits: 上線兩天獲得了1.4k star的開源聲音克隆項目,1分鐘語音訓練TTS模型

https://github.com/RVC-Boss/GPT-SoVITS/blob/main/docs/cn/README.md

先說結論,基本上也確實實測過不少 TTS 相關的,但就這個真的需求的語音量少,訓練又快,然後效果是真的讓人驚到的 " 有像 " 啊 ! 所以,就像前面的 whisper 一樣,當然還有很多開源的 ASR 跟 TTS,但為了實際落地產品做些應用,所以就只能持續觀注了。

https://github.com/myshell-ai/MeloTTS

https://github.com/fishaudio/Bert-VITS2
https://github.com/RVC-Boss/GPT-SoVITS

GPT-SoVITS是由GitHub暱稱為RVC-Boss的RVC變聲器的創始人與AI音色轉換技術專家Rcell合作開發的一個開源專案。它是一個跨語言音色克隆工具,專注於聲音的轉換和克隆;Bert-VITS2是由fishaudio發起基於VITS (Variational Inference for Text-to-Speech)開源項目模型進行開發,提供高品質的文字轉語音 (TTS)。實現了文字轉語音的語音合成,還無法實現SVC (歌聲轉換)、SVS (歌聲合成) 等唱歌功能。目前測過,GPT-SoVITS產出的效果是較好的 (僅需約1-2分鐘便有讓人滿意的效果),所以就先針對它做介紹吧;官方有自帶 colab 給你玩就是。

https://github.com/RVC-Boss/GPT-SoVITS/blob/main/colab_webui.ipynb

網路上也找到一篇蠻詳細的介紹:GPT-SoVITS帶你體驗AI聲音克隆的魔力

第一步就是它的 UI 介面可以幫你做切割;左邊 0b-Audio Slicer,先填入你的語音位置在那,以及你要輸出切割後的位置,再來是Noise gate threshold (低於此值的響度將被視為噪音),另外就是 Minimum length、Minumum interval for audio cutting、Maximum length for silence to be kept 這些我是選擇都先使用它自帶的預設值。
接著,它提供了幫你做降噪,還有看你要用那個 ASR 模型;這邊都是在幫你做數據;位置路徑搞清楚就可以;然後要注意你切割完以及ASR輸出在那,因為你需要去檢查一下文稿是否正確。
到這邊,就是要開始做 data 的格式化
而這裡就是在做一些處理
最後就是要做 Fine-tuned training
接著就是最讓人驚豔的實際效果了 ! 真的很像 ! XD



最後再補上一個很可能會踩到的坑,那就是
中文文本糾錯 (Chinese Spelling Correction) !
而這個開源套件一定是不能錯過的,支持中文音似、形似、語法錯誤等等,復現了Kenlm (效果一般)、ConvSeq2Seq (效果一般)、BERT、MacBERT (效果好)、ELECTRA、ERNIE (效果好)、Transformer等多種模型;很久之前也有針對這個去做了相關的微調;不過,現在場景不太一樣,所以快速的做了一些事: 1. 先針對應用場景內的相關新聞稿來製作領域詞語,做為kenlm模型(统计模型)訓練用;2. 再針對經過校正的場景ASR逐字稿,做了同音字替換的ERNIE_CSC模型訓練,這邊使用的包含常見的SIGHAN數據集;而在做這些事之前當然還要做斷詞斷據跟加標點符號了,需要提醒的是,因為加標點符號模型的通常是簡體字,所以得先做一次轉換,然後再把符號加回去就是 ....

首先是 基於PaddleNLP的智慧文本糾錯 就照著製作數據和微調訓練就對了




結果編譯過程就出錯 ... 然後仔細看了一下可以這樣解

1. 解決 Eigen3 缺失問題
Eigen 是一個高階 C++ 函式庫,用於處理線性代數、矩陣和向量運算。 若你的系統中未安裝 Eigen,你需要安裝它。 在 Ubuntu 或類似 Debian 的系統中,你可以透過以下命令安裝:

sudo apt-get update sudo apt-get install libeigen3-dev

這會安裝 Eigen 並通常將其頭檔放在 /usr/include/eigen3 目錄下。

2. 解決 Boost 函式庫問題
Boost 是一個廣泛使用的 C++ 函式庫,你的專案可能依賴其多個模組(如 program_options、system、thread、unit_test_framework)。 若這些模組未找到,你需要確保已安裝對應的 Boost 函式庫。在 Ubuntu 或類似 Debian 的系統中,安裝 Boost 程式庫及其開發檔案通常如下:

sudo apt-get update sudo apt-get install libboost-all-dev

如果你需要特定版本的 Boost 或特定元件,你可以透過套件管理器搜尋對應的套件名稱,例如:

apt-cache search libboost

然後安裝需要的組件。

3. 配置 CMake
確保你的 CMakeLists.txt 檔案中配置了正確的路徑來尋找這些依賴。 對於 Eigen3,你可能需要在 CMake 設定中設定 Eigen3_DIR,例如:set(Eigen3_DIR "/usr/include/eigen3")

或更準確地使用 find_package 方法指定所需的元件和版本號。重新運行 CMake

解決了依賴問題後,回到你的專案目錄並重新執行 cmake 指令:
cd /opt/data/twm-correct/kenlm/build cmake ..

這應該解決了先前的配置錯誤