我用飛槳Parakeet僅六步實現了一個語音合成模型

飛槳PaddlePaddle發表於2020-09-03

【飛槳開發者說】顧茜,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的語音合成系統。

我用飛槳Parakeet僅六步實現了一個語音合成模型

在這篇論文中,作者把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變化趨勢:

我用飛槳Parakeet僅六步實現了一個語音合成模型

2. Valid-Avg-Loss 驗證集上loss變化趨勢:

我用飛槳Parakeet僅六步實現了一個語音合成模型


3. Valid-7th-Flow-Log_s 模型中的第7個流生成的log scale:


我用飛槳Parakeet僅六步實現了一個語音合成模型

第六步:使用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。

如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文件。

·飛槳官網地址·

https://www.paddlepaddle.org.cn/

·飛槳開源框架專案地址·

GitHub: 

https://github.com/PaddlePaddle/Paddle 

Gitee: 

https://gitee.com/paddlepaddle/Paddle


相關文章