SummerTTS 用於紀念2023年即將到來和終將逝去的夏天
說明
- SummerTTS 是一個獨立編譯的語音合成程序(TTS)。可以本地運行不需要網絡,而且沒有額外的依賴,一鍵編譯完成即可用於中文和英文的語音合成。
- SummerTTS 的底層計算庫使用Eigen,Eigen是一套模板定義的函數,大部分情況下,只需要包含頭文件即可,所以本項目沒有其他依賴,在C++環境下可以獨立編譯和運行。
- 本項目使用Eigen提供的矩陣庫實現了神經網絡的算子,不需要依賴例如pytorch,tensorflow, ncnn 等其他NN運行環境。
- 本項目在Ubuntu 上編譯運行通過,其他類Linux平台,如Android,樹莓派等,也應該沒啥大問題,在Window上沒有測試過,可能需要少許改動。
- 本項目的模型基於語音合成算法vits, 在其基礎上進行了基於C++的工程化
- 本項目適用MIT License,基於本項目的開發,使用人員或機構,請遵循MIT License: https://mit-license.org
更新日誌
- 2024-12-14: 添加License 信息為MIT License: https://mit-license.org
- 2023-06-16: 更新添加一個更快的英文語音合成模型:single_speaker_english_fast.bin, 還是在如下網盤中,速度要快一些,合成的音質下降不明顯:
鏈接: https://pan.baidu.com/s/1rYhtznOYQH7m8g-xZ_2VVQ?pwd=2d5h 提取碼: 2d5h - 2023-06-15: 支持純英文的語音合成,需要同步最新的代碼,使用下列網盤中的模型文件: single_speaker_english.bin, 以下面的方式合成英文語音:
./tts_test ../test_eng.txt ../models/single_speaker_english.bin out_eng.wav
網盤路徑如下,之前的中文語音合成和用法不受影響,需要說明的是本次更新只支持純英文的語音合成,中文混合英文的暫時不支持。
鏈接: https://pan.baidu.com/s/1rYhtznOYQH7m8g-xZ_2VVQ?pwd=2d5h 提取碼: 2d5h - 2023-06-09: 新增了一個中等大小的單說話人模型: single_speaker_mid.bin ,速度比之前的模型稍慢,但合成的音質似乎要好點(本人耳朵不算敏感,感覺要好點,也許是心理作用:P ),代碼不需要更新,只需要在之前的網盤中下載single_speaker_mid.bin 並使用即可.
- 2023-06-08: 修改test/main.cpp, 支持換行和整篇文本的合成
- 2023-06-03: Fix 了昨天的版本中的一個錯誤,感謝熱心網友Telen提供測試和線索,只有代碼更新,模型不需要更新。
- 2023-06-02: 大幅度提升了多音字發音合成的準確性,需要在百度網盤中獲取新的模型,才能使用改善後的多音字發音和文本正則化(Text Normalization),今天更新的代碼不能使用之前的模型,否則可能導致crash
- 2023-05-30: 集成WeTextProcessing 作為前端文本正則化(Text Normalization)模塊,極大的改善了對數字,貨幣,溫度,日期等的正確發音合成。需要在下面的百度網盤中獲取新的模型
- 2023-5-23: 使用新的算法大幅度提升了單說話人的語音合成速度。
- 2023-4-21: 初始創建
使用說明
將本項目的代碼克隆到本地,最好是Ubuntu Linux 環境
從以下的百度網盤地址下載模型,放入本項目的model目錄中: 鏈接: https://pan.baidu.com/s/1rYhtznOYQH7m8g-xZ_2VVQ?pwd=2d5h 提取碼: 2d5h
模型文件放入後,models目錄結構如下:
models/
├── multi_speakers.bin
├── single_speaker_mid.bin
├── single_speaker_english.bin
├── single_speaker_english_fast.bin
└── single_speaker_fast.bin
進入Build 目錄,執行以下命令:
cmake ..
make
編譯完成後,會在Build 目錄中生成tts_test 執行程序
運行下列命令,測試中文語音合成(TTS):
./tts_test ../test.txt ../models/single_speaker_fast.bin out.wav
運行下列命令,測試英文語音合成(TTS):
./tts_test ../test_eng.txt ../models/single_speaker_english.bin out_eng.wav
該命令行中:
第一個參數為是文本文件的路徑,該文件包含需要被合成語音的文本。
第二個參數是前面提到的模型的路徑,文件名開頭的single 和multi 表示模型包含了單個說話人還是多個說話人。推薦單說話人模型:single_speaker_fast.bin, 合成的速度較快,合成的音質也還行。 第三個參數是合成的音頻文件,程序運行完之後生成該文件,可以用播放器打開。
以上的測試程序實現在test/main.cpp 中,具體合成的接口定義在include/SynthesizerTrn.h, 如下:
int16_t * infer(const string & line, int32_t sid, float lengthScale, int32_t & dataLen)
該接口的:
第一個參數是待合成的語音的字符串。
第二個參數指定說話人的id 用於合成語音,該參數對多說話人模型有效,對單說話人模型,固定為0。說話人的個數可由接口int32_t getSpeakerNum() 返回,有效id 為0 到該接口返回的說話人數量減1。
第三個參數lengthScale 表示合成語音的語速,其值越大表示語速越慢。
待合成的文本中可以包含阿拉伯數字和標點,但因為本項目的文本正則化(TN) 模塊還很粗糙,對於英文字符,會直接忽略。也因為文本正則化(TN) 模塊還很粗糙,對不同語境下的多音字發音有時候會不准確。
後續開發
- 後續將開放模型訓練和轉化腳本
- 後續將嘗試訓練和提供音質更好的模型
聯繫作者
License
- 本項目適用MIT License,基於本項目的開發,使用人員或機構,請遵循MIT License: https://mit-license.org
感謝
本項目在源代碼和算法方面使用了下列方案,在此表示感謝, 若可能引發任何法律問題,請及時聯繫我協調解決
- Eigen
- vits (https://github.com/jaywalnut310/vits)
- vits_chinese (https://github.com/UEhQZXI/vits_chinese)
- MB-iSTFT-VITS (https://github.com/MasayaKawamura/MB-iSTFT-VITS)
- WeTextProcessing (https://github.com/wenet-e2e/WeTextProcessing)
- glog (https://github.com/google/glog)
- gflags (https://github.com/gflags/gflags)
- openfst (https://github.com/kkm000/openfst)
- 漢字轉拼音(https://github.com/yangyangwithgnu/hanz2piny)
- cppjieba (https://github.com/yanyiwu/cppjieba)
- g2p_en(https://github.com/Kyubyong/g2p)
- English-to-IPA(https://github.com/mphilli/English-to-IPA)
- 本項目的中文單說話人模型基於開源標貝數據集訓練,多說話人模型基於開源數據集aishell3 訓練,英文單說話人模型基於LJ Speech 數據集。