Tacotron2語音合成之復刻主播聲音
最近在阿B看到許多語音合成的視頻,效果比小愛的聲音定制略勝一籌,不能說和本人一模一樣,但是也相當近似。
從實現(xiàn)方式講,有阿里云商用閉源方案,有Tacotron2和VIST開源方案,以及更早的MockingBird。目前我用了Tacotron2,自我感覺上手難度較低,但是時間開銷有些大。
在這里總結(jié)一下經(jīng)驗并作一個技術分享。
背景
目前的多數(shù)示例是使用游戲音頻素材做訓練和合成的。游戲音頻素材已經(jīng)是每句一個錄音文件,發(fā)音吐字清晰,沒有不必要的停頓和重讀,錄音音量穩(wěn)定,無噪音和背景音,而主播錄播內(nèi)容恰恰相反,唯一的優(yōu)勢是錄播素材多,可以手動精選。
準備
?一臺電腦
訪問外網(wǎng)的工具
一個谷歌賬戶
預先下載錄播(首選雜談類型的錄播,畢竟游戲、歌回、同步視聽不是話說的少就是干擾因素多;雜談也盡量選擇純音樂做BGM的錄播)

MockingBird
先簡單說一下MockingBird,MockingBird的上手難度短和時間開銷低,但是實際效果很不理想。簡單講,MockingBird需要內(nèi)置一個模型,然后你提供一條10秒左右錄音文件,MockingBird從錄音文件學習,然后合成新的聲音。
當內(nèi)置模型和錄音文件差異很大時,合成的結(jié)果就會翻車。
其次這種學習是無法學到平翹舌、前后鼻音之類的不標準的發(fā)音的。
因此不推薦使用這個工具。
簡介
主要使用了?@梅雨初霽?的工具包進行訓練
https://t.bilibili.com/695241886813650984
也參考了這個視頻對錄播的處理
https://www.bilibili.com/video/BV1dq4y137pH
文件準備
錄播的錄音文件需要做一定的預處理。我在處理過程中均使用wav文件格式,不一定非wav不可,但是理論上這可以減少重復編碼解碼造成的信息損失。
?切割
由于直播間通常有背景音樂,需要使用工具去除背景音;而錄音文件越大,工具對內(nèi)存就有更高的需求,因此錄音文件需要根據(jù)具體情況預先切割。
通常來說10分鐘是不會有問題的

切割錄音文件使用的工具我推薦QuickCut??
https://github.com/HaujetZhao/QuickCut/releases
重命名音頻后綴為wav,拖文件到輸入路徑;選擇一個輸出文件夾,設置片段時長(秒),點擊運行

2.?去除背景音樂
下載并使用Spleeter為核心二次開發(fā)的程序,并處理已經(jīng)切割后的文件。我推薦(個人感覺資源開銷低,其他工具可能真的只能處理切割為10分鐘的片段)? https://github.com/wudicgi/SpleeterMsvcExe/releases/? ,也可以使用https://github.com/otomad/SpleeterGui?或者?https://github.com/Anjok07/ultimatevocalremovergui/releases
處理結(jié)束,文件名包含vodal的就是去除了背景音樂的純?nèi)寺曚浺?,其他文件都可以刪除。
由于主播通常使用單通道麥克風錄音,而背景音樂通常是立體聲,可以使用音頻處理軟件(比如golden?wave的立體聲通道處理功能,選擇“提升人聲”或者“提升中央”,對錄音文件中的噪音再次消除。

3.?修改編碼
在golden?wave中新建文件,選擇單聲道 22050采樣率的文件

復制調(diào)整過音量的內(nèi)容并粘貼到新文件中,保存為wav格式。
4.?音量增益
如果音量較小,需要把錄音文件的音量調(diào)大。我使用golden?wave的自動增益功能,設置目標音量-3db(當然也可以更大)

音量調(diào)節(jié)前后對比

5.?語音識別并生成字幕
我推薦使用剪映,白嫖字節(jié)跳動的服務器資源。
直接拖拽錄音文件到剪映的音頻軌道上,右鍵識別字幕/歌詞

識別結(jié)束,導出。注意導出時不勾選視頻導出,勾選字幕導出,字幕格式選擇srt。

6.?校對字幕
剪映其實也可以校對字幕,但是我推薦aegisub,效率更高??https://github.com/Aegisub/Aegisub/releases
把錄音和字幕拖到aegisub上,就可以預覽波形圖、播放選區(qū)、校對字幕了。
需要注意的是:
????a.?盡量只保留陳述句。如果錄音有笑聲、拍肚皮聲,建議刪掉,字音不清楚建議刪掉
????b.?字幕有同音錯字可以不處理
????c.?有英語的內(nèi)容建議刪除
????d.?相鄰兩句距離太短,建議合并字幕為一句
????e.?如果字幕在音頻的邊緣,需要注意字音是否完整。寧愿多選不要讓字音有破音

7.?切割音頻
按照字幕的時間,切割錄音文件??梢允褂胔ttps://gitee.com/kslizi/Sound_File_Procesing? 或者前邊用過的QuickCut? ?https://github.com/HaujetZhao/QuickCut/releases?
兩者其實都有問題,前者是Python項目,需要安裝環(huán)境、依賴,可以參考這個視頻 https://www.bilibili.com/video/BV1dq4y137pH
后者切割文件后,需要手動生成文件列表,把左圖的文件修改為右圖的格式。熟悉文本編輯器或者excel倒是不難。

8.?上傳文件。
解壓tacotron2壓縮包上傳到谷歌云端硬盤;
把錄音文件拆分訓練集和測試集,放到training和testing兩個不同的文件夾,在谷歌硬盤的tactron2目錄中新建一個文件夾(舉例命名為Miki)放進去。

文件列表同樣需要拆分為訓練集和測試集兩個文件,文件名必須與放置的錄音文件一致(錄音文件為Miki目錄,訓練集文件列表命名Miki.txt,測試集文件列表命名Miki_testing.txt),放到谷歌硬盤的tactron2/filelists目錄中
在線訓練
由于深度學習需要使用高性能電腦,而看這個文檔的你一定這樣的電腦。
我們可以白嫖谷歌的高性能服務器。
在谷歌硬盤中點擊Tacotron2+HifiGAN.ipynb這個文件并打開,修改
修改TTS/tacotron2為你上傳到谷歌硬盤的路徑,修改Miki為你的錄音文件的文件夾名稱
然后順次點擊每個白色的小箭頭即可

其中trainning會耗費數(shù)天的時間。根據(jù)我的經(jīng)驗,每個谷歌賬戶應該一天只能白嫖4小時左右。但是問題不大,你可以多注冊幾個賬戶,通過共享文件的方式接力訓練,或者充值變強。

離線合成
除在colob中在線合成,也可以使用MoeTTS加載Tacotron2模型。https://github.com/luoyily/MoeTTS/releases/tag/v1.0.1
首先從Google?drive中,colab/outdir中下載訓練過的模型。
再從tacotron2壓縮包中獲取hifimodel和config.json兩個文件,
在moetts中選擇模型、路徑,
在文本框內(nèi)輸入拼音,注意句尾添加英文句號,點擊成聲音文件,稍等幾秒即可得到錄音文件。
每次生成錄音具有一定的隨機性,如果不理想可以重試幾次

網(wǎng)盤鏈接
只打包了Tacotron2,考慮到錄音文件和訓練的模型存在風險,不做分享。
鏈接: https://pan.baidu.com/s/1KCHV3YWHVzPdb-62STMKlQ?pwd=3uyx 提取碼: 3uyx?