國產之光:基於Parakeet的中文語音合成方案
- 方案地址:https://aistudio.baidu.com/aistudio/projectdetail/2792887?contributionType=1
- Parakeet源碼:https://github.com/PaddlePaddle/Parakeet
- 中文語音合成方案:https://aistudio.baidu.com/aistudio/projectdetail/2791125?contributionType=1
- PaddleSpeech源碼:https://github.com/PaddlePaddle/PaddleSpeech
第一步 安裝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句)
【中文標準女聲音庫】採集對象的音色風格知性陽光、親切自然,專業標準普通話女聲,聽感樂觀積極。錄製環境爲專業錄音室和錄音軟件,錄音環境和設備自始至終保持不變,錄音環境的信噪比不低於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