【飛槳開發者說】顧茜,PPDE飛槳開發者技術專家,菸草行業開發工程師,畢業於廈門大學數學科學學院,研究方向為:人工智慧在菸草行業的應用。
該專案使用WaveFlow(Github地址:https://github.com/PaddlePaddle/Parakeet/blob/develop/examples/waveflow/train.py)作為語音合成模型示例任務,並結合Transformer TTS驗證語音合成效果。
Parakeet是飛槳近期上新的語音合成套件,用於實現端到端的語音合成。如果您使用過各類讀書app或者某些瀏覽器、外掛的朗讀功能,這些都是典型的TTS(Text To Speech)場景。本專案將使用WaveFlow語音合成模型完成相關任務,並結合Transformer TTS驗證語音合成效果。
WaveFlow模型介紹
WaveFlow來自百度研究院的論文WaveFlow: A Compact Flow-based Model for Raw Audio,飛槳復現了該語音合成模型。根據官網介紹,模型只有5.9M引數量,比經典的WaveGlow語音合成模型小了15倍,同時語音合成效果也非常好。WaveFlow和WaveGlow都是基於流的生成模型,它們和GAN都屬於生成模型家族。
需要注意的是,WaveFlow是個vocoder(聲碼器,一種將聲學引數轉換成語音波形的工具),不能直接實現文字轉語音,需要與Parakeet庫中的TTS模型DeepVoice 3、Transformer TTS或FastSpeech模型結合,實現文字轉語音的語音合成。
關於模型的詳細介紹請參考:
- WaveFlow論文地址:
https://arxiv.org/abs/1912.01219 - WaveFlow: A Compact Flow-Based Model for Raw Audio:
http://research.baidu.com/Blog/index-view?id=139 - 參考資料:理解基於流的生成模型
- WaveGlow: a Flow-based Generative Network for Speech Synthesis:
https://github.com/NVIDIA/waveglow
Transformer TTS
文字轉語音模型
Parakeet使用飛槳核心框架的動態圖方式復現了Transformer TTS文字轉語音模型,根據論文Neural Speech Synthesis with Transformer Network實現了基於Transformer的語音合成系統。
在這篇論文中,作者把Transformer和Tacotron2融合,形成了TransformerTTS。
"模型的主體還是Original Transformer,只是在輸入階段和輸出階段為了配合語音資料的特性做了改變。首先是Encoder的Input階段,先將text逐字元轉化為編號,方便Embedding,然後進入Encoder PreNet,這層網路由一個Embedding layer和三層卷積層構成,轉化為512維的向量後,進入Transformer Encoder。
其次是Transformer的Decoder部分,分為Input和Output。Input透過一個PreNet,將80維的梅爾聲譜圖轉化為512維向量,這裡的PreNet是一個三層的全連線網路(個人認為論文中應當解釋一下為什麼Encoder的PreNet是用卷積設計的,而Decoder的PreNet由全連線網路就可以解決問題);Output部分與Tacotron2的設計完全一致。"
——摘自:基於Transformer的語音合成系統
Parakeet庫中Transformer TTS支援兩種vocoder,分別是Griffin-Lim algorithm和WaveFlow。WaveFlow屬於基於深度神經網路的聲碼器,而Griffin-Lim是在僅知幅度譜、不知道相位譜的條件下重建語音的演算法,屬於經典聲碼器,演算法簡單,高效,但是合成的聲音比較顫抖,機器感較強。
關於模型和聲碼器的詳細介紹請參考:
- Transformer TTS論文地址:
https://arxiv.org/abs/1809.08895
- 基於Transformer的語音合成系統:
https://zhuanlan.zhihu.com/p/66931179
- Griffin-lim演算法:
https://blog.csdn.net/CSDN_71560364126/article/details/103968034
資料集介紹
本文實驗中將會使用LJ Speech語音資料集。這個資料集由13100句短語音組成,時長共計24小時。所有語音由同一名說話人錄製,錄製裝置是Macbook Pro的內建麥克風,取樣率為22050Hz。LJSpeech資料集的地址:
https://keithito.com/LJ-Speech-Dataset/。
開發基於Parakeet的
語音合成模型方法
下面我們們開始基於AI Studio開發基於Parakeet的語音合成模型。由於AI Studio上是Notebook的環境,所以在執行cd命令的時候前面需要加上百分號,而執行其它shell命令的時候,前面需要加上歎號。
第一步:下載Parakeet模型庫
和PaddleDetection不同,目前Parakeet模型庫目前檔案還是比較少的,因此儘管在Gitee上沒有映象,直接去Github上拉取不需要花太長時間(一般也不會中斷)。
!git clone https://github.com/PaddlePaddle/Parakeet
第二步:安裝依賴庫
安裝 libsndfile1:
在Ubuntu上安裝libsndfile1庫。以Ubuntu作業系統為例,一定要裝有libsndfile1這個開源聲音檔案格式處理庫。libsndfile1庫在其他平臺上包名可能不同,比如在 centos 上包名為 libsndfile,可以用“sudo yum install libsndfile”安裝。目前AI Studio已經內建了該處理庫,無需額外安裝。
!sudo apt-get install libsndfile1
安裝 PaddlePaddle:
在AI Studio上,使用者在建立專案過程中可以選擇PaddlePaddle1.8.0環境,在該環境上WaveFlow可以正常訓練。
安裝 Parakeet:
!git clone https://github.com/PaddlePaddle/Parakeet %cd Parakeet !pip install -e .
安裝 nltk中的美國英語CMU發音詞典
import nltk nltk.download("punkt") nltk.download("cmudict")
在Notebook環境都比較簡單,照做就行。如果執行nltk.download()時出現網路不通的報錯,可以參考如下連結解決:
https://www.cnblogs.com/webRobot/p/6065831.html
第三步:準備資料集和預訓練模型
Parakeet專案提供了WaveFlow模型在64, 96和128隱藏層大小(比如 128 則意味著每個隱藏層的大小是 128)下的預訓練模型。本文將使用隱藏層大小為128的模型。
!mkdir examples/waveflow/data !tar xjvf /home/aistudio/data/data35036/LJSpeech.tar.bz2 -C examples/waveflow/data/ !unzip /home/aistudio/data/data45064/waveflow_128.zip -d examples/waveflow/
第四步:環境配置和YAML檔案準備
1. 執行“export CUDA_VISIBLE_DEVICES=0”指定GPU
2.根據個人的任務需要修改配置檔案。配置檔案的位置在
Parakeet/examples/waveflow/configs/waveflow_ljspeech.yaml。讀者可以根據需要改動一些超引數,例如使用預訓練模型、調整learning_rate、batch_size等。
第五步:開始訓練
執行如下命令呼叫train.py指令碼啟動訓練。
!cd examples/waveflow /home/aistudio/Parakeet/examples/waveflow !python train.py \ --config=./waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml \ --root=./data/LJSpeech-1.1 \ --name=finetune \ --checkpoint=./waveflow_res128_ljspeech_ckpt_1.0/step-2000000 \ --batch_size=8 \ --use_gpu=true
檢視評估指標:
1. Train-Loss 訓練集上loss變化趨勢:
2. Valid-Avg-Loss 驗證集上loss變化趨勢:
3. Valid-7th-Flow-Log_s 模型中的第7個流生成的log scale:
第六步:使用Transformer TTS + WaveFlow實現文字轉語音(TTS)
在Parakeet模型庫中,Deep Voice 3、Transformer TTS或FastSpeech是TTS模型,下面演示如何使用訓練好的WaveFlow模型權重作為聲碼器,透過Transformer TTS實現文字轉語音。
Transformer TTS的訓練過程與WaveFlow非常類似,本文直接使用Parakeet專案中提供的預訓練模型演示效果,使用時需要同時配置Transformer TTS和WaveFlow的預訓練模型權重。
在Transformer TTS的示例中,最終會將下面這段文字轉為語音:
“Life was like a box of chocolates, you never know what you're gonna get.”
也可以修改
Parakeet/examples/transformer_tts/synthesis.py檔案中synthesis()方法的輸入,合成我們想要的其它英文,比如Hello world!
if __name__ == '__main__': parser = argparse.ArgumentParser(description="Synthesis model") add_config_options_to_parser(parser) args = parser.parse_args() # Print the whole config setting. pprint(vars(args)) synthesis( "Hello world!", args)
切換目錄到TransformerTTS示例
!cd /home/aistudio/Parakeet/examples/transformer_tts
下載並解壓Transformer TTS預訓練模型
!wget https://paddlespeech.bj.bcebos.com/Parakeet/transformer_tts_ljspeech_ckpt_1.0.zip !unzip transformer_tts_ljspeech_ckpt_1.0.zip -d transformer_tts_ljspeech_ckpt_1.0/ !python synthesis.py \ --use_gpu=1 \ --output='./synthesis' \ --config='transformer_tts_ljspeech_ckpt_1.0/ljspeech.yaml' \ --checkpoint_transformer='./transformer_tts_ljspeech_ckpt_1.0/step-120000' \ --vocoder='waveflow' \ --config_vocoder='../waveflow/waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml' \ --checkpoint_vocoder='../waveflow/runs/waveflow/finetune/checkpoint/step-2010000'
{'checkpoint_transformer': './transformer_tts_ljspeech_ckpt_1.0/step-120000', 'checkpoint_vocoder': '../waveflow/runs/waveflow/finetune/checkpoint/step-2010000', 'config': 'transformer_tts_ljspeech_ckpt_1.0/ljspeech.yaml', 'config_vocoder': '../waveflow/waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml', 'max_len': 1000, 'output': './synthesis', 'stop_threshold': 0.5, 'use_gpu': 1, 'vocoder': 'waveflow'} [checkpoint] Rank 0: loaded model from ./transformer_tts_ljspeech_ckpt_1.0/step-120000.pdparams [checkpoint] Rank 0: loaded model from ../waveflow/runs/waveflow/finetune/checkpoint/step-2010000.pdparams Synthesis completed !!!
使用如下程式碼即可在Notebook中試聽音訊效果:
import IPython IPython.display.Audio('./synthesis/samples/waveflow.wav')
後續將會給大家帶來手把手教你用飛槳與Parakeet實現自動“讀”論文,敬請期待。
完整專案包括專案程式碼、文字檔案等均公開在AIStudio上,歡迎Fork:
https://aistudio.baidu.com/aistudio/projectdetail/639029
如在使用過程中有問題,可加入飛槳官方QQ群進行交流:1108045677。
如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文件。
·飛槳官網地址·
·飛槳開源框架專案地址·
GitHub:
Gitee: