国产之光:基于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 管道进行了抽象,并将数据预处理、通用模块共享、模型配置以及训练和合成过程标准化。此处支持的模型包括文本前端、端到端声学模型和声码器:
- 文本前端
- 基于规则的中文前端。
- 声学模型
- 【FastSpeech2】FastSpeech 2:快速、高质量的端到端文本到语音
- 【SpeedySpeech】SpeedySpeech:高效的神经语音合成
- 【Transformer TTS】基于Transformer网络的神经语音合成
- 【Tacotron2】在梅尔谱图预测上通过调节WaveNet进行自然TTS合成
- 声码器
- 【Parallel WaveGAN】Parallel WaveGAN:一种基于多分辨率频谱图的生成对抗网络的快速波形生成模型
- 【WaveFlow】WaveFlow:一种用于原始音频的紧凑型基于流的模型
- 语音克隆
安装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