新網杯topline:手把手教你構建中文語音合成模型

國產之光:基於Parakeet的中文語音合成方案

第一步 安裝Parakeet

Parakeet 旨在爲開源社區提供靈活、高效和最先進的文本轉語音工具包。它建立在 PaddlePaddle 動態圖上,包括許多有影響力的 TTS 模型。

Parakeet 概述

爲了便於直接利用現有的 TTS 模型並開發新的模型,Parakeet 選擇了典型模型並在 PaddlePaddle 中提供了它們的參考實現。此外,Parakeet 對 TTS 管道進行了抽象,並將數據預處理、通用模塊共享、模型配置以及訓練和合成過程標準化。此處支持的模型包括文本前端、端到端聲學模型和聲碼器:

安裝Parakeet

源碼安裝Parakeet

git clone https://github.com/PaddlePaddle/Parakeet
 cd Parakeet 
pip install -e 。

第二步 安裝依賴

  • 運行依賴:linux,PaddlePaddle 2.1.2

  • 確保庫libsndfile1已安裝,例如在 Ubuntu 上。

sudo apt-get installlibsndfile1
  • nltk依賴下載
import nltk
nltk.download("punkt")
nltk.download("cmudict")
[nltk_data] Downloading package punkt to /home/aistudio/nltk_data...
[nltk_data]   Package punkt is already up-to-date!
[nltk_data] Downloading package cmudict to /home/aistudio/nltk_data...
[nltk_data]   Package cmudict is already up-to-date!

第三步 數據準備和預處理

中文標準女聲音庫(10000句)

下載鏈接:https://test.data-baker.com/data/index/source/

【中文標準女聲音庫】採集對象的音色風格知性陽光、親切自然,專業標準普通話女聲,聽感樂觀積極。錄製環境爲專業錄音室和錄音軟件,錄音環境和設備自始至終保持不變,錄音環境的信噪比不低於35dB;單聲道錄音,用48KHz 16比特採樣頻率、pcm wav格式。錄音語料涵蓋各類新聞、小說、科技、娛樂、對話等領域,語料設計綜合語料樣本量,力求在有限的語料數據量內,對音節音子、類型、音調、音連以及韻律等儘可能全面的覆蓋。根據合成語音標註標準對音庫進行文本音字校對、韻律層級標註、語音文件邊界切分標註。

技術參數

  • 數據內容:中文標準女聲語音庫數據
  • 錄音語料:綜合語料樣本量;音節音子的數量、類型、音調、音連以及韻律等進行覆蓋。
  • 有效時長:約12小時
  • 平均字數:16字
  • 語言類型:標準普通話
  • 發 音 人:女;20-30歲;聲音積極知性
  • 錄音環境:聲音採集環境爲專業錄音棚環境:1)錄音棚符合專業音庫錄製標準;2)錄音環境和設備自始至終保持不變;3)錄音環境的信噪比不低於35dB。
  • 錄製工具:專業錄音設備及錄音軟件
  • 採樣格式:無壓縮pcm wav格式,採樣率爲48KHz、16bit
  • 標註內容:音字校對、韻律標註、中文聲韻母邊界切分
  • 標註格式:文本標註爲.txt格式文檔;音節音素邊界切分文件爲.interval格式
  • 質量標準:1. 語音文件爲48k 16bit wav格式,音色、音量、語速一致,無漂零無截幅;2.標註文件字準率不低於99.8%;3.音素邊界錯誤大於10ms的比例小於1%;音節邊界準確率大於98%.
  • 存儲方式:FTP存儲
  • 文件格式:音頻文件:wav 文本標註文件:TXT 邊界標註文件:INTERVAL
  • 版權所屬者:標貝(北京)科技有限公司

數據預處理

解壓數據:

!unzip data/data117129/BZNSYP.zip > /dev/null 2>&1

特徵提取

#!/bin/bash

stage=0
stop_stage=100

# export MAIN_ROOT=`realpath ${PWD}/../../../`
export MAIN_ROOT=./

echo $MAIN_ROOT
if [ ${stage} -le 0 ] && [ ${stop_stage} -ge 0 ]; then
    # get durations from MFA's result
    echo "Generate durations.txt from MFA results ..."
    python3 ${MAIN_ROOT}/utils/gen_duration_from_textgrid.py \
        --inputdir=./baker_alignment_tone \
        --output=durations.txt \
        --config=conf/default.yaml
fi

if [ ${stage} -le 1 ] && [ ${stop_stage} -ge 1 ]; then
    # extract features
    echo "Extract features ..."
    python3 ./preprocess.py \
        --dataset=baker \
        --rootdir=~/BZNSYP/ \
        --dumpdir=dump \
        --dur-file=durations.txt \
        --config=conf/default.yaml \
        --num-cpu=20 \
        --cut-sil=True
fi

if [ ${stage} -le 2 ] && [ ${stop_stage} -ge 2 ]; then
    # get features' stats(mean and std)
    echo "Get features' stats ..."
    python3 ${MAIN_ROOT}/utils/compute_statistics.py \
        --metadata=dump/train/raw/metadata.jsonl \
        --field-name="speech"

fi

if [ ${stage} -le 3 ] && [ ${stop_stage} -ge 3 ]; then
    # normalize and covert phone/speaker to id, dev and test should use train's stats
    echo "Normalize ..."
    python3 ./normalize.py \
        --metadata=dump/train/raw/metadata.jsonl \
        --dumpdir=dump/train/norm \
        --speech-stats=dump/train/speech_stats.npy \
        --pitch-stats=dump/train/pitch_stats.npy \
        --energy-stats=dump/train/energy_stats.npy \
        --phones-dict=dump/phone_id_map.txt \
        --speaker-dict=dump/speaker_id_map.txt
fi

生成預處理的數據集如下:

dump
├── dev
│   ├── norm
│   └── raw
├── phone_id_map.txt
├── speaker_id_map.txt
├── test
│   ├── norm
│   └── raw
└── train
    ├── energy_stats.npy
    ├── norm
    ├── pitch_stats.npy
    ├── raw
    └── speech_stats.npy

第四步 模型訓練

使用 ./run.sh來完成訓練任務,具體參數如下

usage: train.py [-h] [--config CONFIG] [--train-metadata TRAIN_METADATA]
                [--dev-metadata DEV_METADATA] [--output-dir OUTPUT_DIR]
                [--device DEVICE] [--nprocs NPROCS] [--verbose VERBOSE]
                [--phones-dict PHONES_DICT] [--speaker-dict SPEAKER_DICT]

Train a FastSpeech2 model.

optional arguments:
  -h, --help            show this help message and exit
  --config CONFIG       fastspeech2 config file.
  --train-metadata TRAIN_METADATA
                        training data.
  --dev-metadata DEV_METADATA
                        dev data.
  --output-dir OUTPUT_DIR
                        output dir.
  --device DEVICE       device type to use.
  --nprocs NPROCS       number of processes.
  --verbose VERBOSE     verbose.
  --phones-dict PHONES_DICT
                        phone vocabulary file.
  --speaker-dict SPEAKER_DICT
                        speaker id map file for multiple speaker model.

第五步 模型預測:“語音合成”

加載模型進行預測

usage: synthesize.py [-h] [--fastspeech2-config FASTSPEECH2_CONFIG]
                     [--fastspeech2-checkpoint FASTSPEECH2_CHECKPOINT]
                     [--fastspeech2-stat FASTSPEECH2_STAT]
                     [--pwg-config PWG_CONFIG]
                     [--pwg-checkpoint PWG_CHECKPOINT] [--pwg-stat PWG_STAT]
                     [--phones-dict PHONES_DICT] [--speaker-dict SPEAKER_DICT]
                     [--test-metadata TEST_METADATA] [--output-dir OUTPUT_DIR]
                     [--device DEVICE] [--verbose VERBOSE]

以上是利用公開數據集進行訓練和預測的步驟,關於模型訓練提升的思路,比較直接的方式大家可以嘗試合併aishell3 和baker兩個數據集進行預測

第六步新網杯比賽數據集預測

  • 使用exp目錄下的訓練模型來預測結果(時間問題,暫未訓練完成)
  • 直接使用官方提供預訓練模型來預測
    我們下面直接使用Parakeet提供的中文預訓練模型
FLAGS_allocator_strategy=naive_best_fit
FLAGS_fraction_of_gpu_memory_to_use=0.01
python3 synthesize_e2e.py
--fastspeech2-config=fastspeech2_nosil_baker_ckpt_0.4/default.yaml
--fastspeech2-checkpoint=fastspeech2_nosil_baker_ckpt_0.4/snapshot_iter_76000.pdz
--fastspeech2-stat=fastspeech2_nosil_baker_ckpt_0.4/speech_stats.npy
--pwg-config=pwg_baker_ckpt_0.4/pwg_default.yaml
--pwg-checkpoint=pwg_baker_ckpt_0.4/pwg_snapshot_iter_400000.pdz
--pwg-stat=pwg_baker_ckpt_0.4/pwg_stats.npy
--text=../sentences.txt
--output-dir=exp/default/test_e2e
--device="gpu"
--phones-dict=fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt

如果使用數據集訓練的模型,可以將fastspeech2相關參數改成exp目錄的權重路徑即可。

大賽要求上傳音頻採樣率爲16k,本案例生成音頻採樣率爲24k,通過下面的命令進行採樣率轉換:

# #!/bin/bash
# %cd exp/default/
# !for x in ./test_e2e/*.wav
# !do 
# !  b=${x##*/}
# !  sox ./test_e2e/$b -r 16000 ./致Great/$b
# !done

!sed -i 's/\r$//' ./xw_predict.sh
!chmod +x ./xw_predict.sh
!./xw_predict.sh

線上 64.45

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章