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

飛槳開發者說】顧茜,PPDE飛槳開發者技術專家,菸草行業開發工程師,畢業於廈門大學數學科學學院,研究方向爲:人工智能在菸草行業的應用。php

該項目使用WaveFlow(Github地址:html

https://github.com/PaddlePaddle/Parakeet/blob/develop/examples/waveflow/train.py)做爲語音合成模型示例任務,並結合Transformer TTS驗證語音合成效果。python

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

Parakeet是飛槳近期上新的語音合成套件,用於實現端到端的語音合成。若是您使用過各種讀書app或者某些瀏覽器、插件的朗讀功能,這些都是典型的TTS(Text To Speech)場景。本項目將使用WaveFlow語音合成模型完成相關任務,並結合Transformer TTS驗證語音合成效果,好比輸入「Hello World」,文字轉語音效果以下。git

WaveFlow模型介紹

WaveFlow來自百度研究院的論文WaveFlow: A Compact Flow-based Model for Raw Audio飛槳復現了該語音合成模型。根據官網介紹,模型只有5.9M參數量,比經典的WaveGlow語音合成模型小了15倍,同時語音合成效果也很是好。WaveFlow和WaveGlow都是基於流的生成模型,它們和GAN都屬於生成模型家族。github

須要注意的是,WaveFlow是個vocoder(聲碼器,一種將聲學參數轉換成語音波形的工具),不能直接實現文字轉語音,須要與Parakeet庫中的TTS模型DeepVoice 三、Transformer TTS或FastSpeech模型結合,實現文字轉語音的語音合成。web

關於模型的詳細介紹請參考:算法

  • WaveFlow論文地址:shell

    https://arxiv.org/abs/1912.01219centos

  • 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 三、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')
下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
相關文章
相關標籤/搜索