那些ASR和TTS可能會踩的坑

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

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

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

Whisper對於中文語音辨識與轉寫中文文字最佳化的實踐 而這篇可以先瞄一下,因為講到了 whisper 雖然可以透過 prompt 來做標點符號 (為什麼?因為跟後面的糾錯可能有關),但是效果仍有待強化,所以得用另外的模型來輔助 ! (2024/08 補充新增:使用🤗 Transformers 為多語種語音辨識任務微調Whisper 模型使用Hugging Face 推理終端機建立強大的「語音辨識+ 說話者分割+ 投機解碼」工作流程使用推測解碼使Whisper 實現2 倍的推理加速)

https://github.com/huggingface/speech-to-speech
ASR 大模型訓練方案來啦!


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

5 faster-whisper-large-v3 則是包含openai/whisper-large-v3到CTranslate2模型格式的轉換;6 peft 是微調的方法;7 whisper_streaming 看名字就知道是主要針對串流的長時間語音到文字的轉錄和翻譯;8-10 insanely-fast-whisper、whisper.cpp、Const-me/Whisper 我就沒特別深入去實驗了 ! 至於11 WhisperSpeech 和12 WhisperLive 算是可以整合成13 WhisperFusion,而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辨識後的修正了,目前看來客服語音應該是不太能這樣直接套用;這部份的實驗就暫時也不介紹了,畢竟這篇是先針對 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

糾錯其實也會需要數據,包括了音似和形似,所以也得再自己寫個工具來製作數據;這個就要看你有沒有逐字稿了 ! 這邊也想給自己做個筆記,在 whisper 問世前,較常聽到的兩個 ASR 訓練調校工具就是 wenet 和 espnet;語料方面強列建議要注意品質,不要以為這是找幾個實習生或者工讀生就能搞定的,特別是深度學習,你的數據花了多少時間下去準備,就能讓你的模型獲得多少時間的效果;通常要針對一個語言模型,那就是至少要先準備100小時,如果是從零開始做到商用,印像中記得 3000 小時是跑不掉的。







中文語音合成 Chinese Speech Synthesis

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

DeepLearning101/GPT-SoVITS_TWMAN

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

2024/08 補充更新:https://chattts.com/zh
ChatTTS是專為對話場景設計的語音產生模型,特別適用於大型語言模型(LLM)助理的對話任務,以及對話式音訊和視訊介紹等應用。它支援中文和英文,透過使用大約100,000小時的中文和英文數據進行訓練,ChatTTS在語音合成中表現出高品質和自然度。








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

PaddleNLP 的 ERNIE for Chinese Spelling Correction 的格式是像這樣:同音句\t正確句
首先是 基於PaddleNLP的智慧文本糾錯 就照著製作數據和微調訓練就對了

Detection:Precision=0.990602, Recall=0.972393, F1=0.981413 
Correction:Precision=0.978406, Recall=0.962840, F1=0.970560 
Sentence Level: Acc:0.936912, Precision:0.998514, Recall:0.936242, F1:0.966376
接著就是試 pycorrector
首先有幾篇文章需要好好參考一下,特別是 PyCorrector 裡的 MacBertMaskedLM For Chinese Spelling Correction,真的要好好研究一下;比較麻煩的是數據的生成,至於 PaddleNLP裡的 ERNIE for Chinese Spelling Correction 也可以,但是效果及處理性能比較不OK就是。至於這次數據則是從所謂的同音異字 (同音詞替換) 出發,特別是想要用來解決客服 ASR 的辨識結果優化;整個的作法就是你先準備好你想處理的領域的文稿,不管是新聞稿或是其它,只要是在你想應用的領域裡的即可。所以也就順手做了繁體中文糾錯文本數據集

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

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 ..
這應該解決了先前的配置錯誤