新网杯topline:手把手教你构建中文语音合成模型

简介: 新网杯topline:手把手教你构建中文语音合成模型

国产之光:基于Parakeet的中文语音合成方案



第一步 安装Parakeet


Parakeet 旨在为开源社区提供灵活、高效和最先进的文本转语音工具包。它建立在 PaddlePaddle 动态图上,包括许多有影响力的 TTS 模型。


53.png


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

相关文章
|
算法 语音技术
基于MFCC特征提取和HMM模型的语音合成算法matlab仿真
基于MFCC特征提取和HMM模型的语音合成算法matlab仿真
|
3月前
|
自然语言处理 语音技术 开发者
ChatTTS超真实自然的语音合成模型
ChatTTS超真实自然的语音合成模型
123 3
|
4月前
|
机器学习/深度学习 TensorFlow 语音技术
使用Python实现深度学习模型:语音合成与语音转换
【7月更文挑战第19天】 使用Python实现深度学习模型:语音合成与语音转换
92 1
|
5月前
|
语音技术 人工智能 机器学习/深度学习
构建基于AI的语音合成系统:技术探索与实践
【6月更文挑战第3天】本文探讨了构建基于AI的语音合成系统,包括文本预处理、声学模型、语音生成和后期处理四个步骤。关键技术和挑战涉及分词、词性标注、语调预测、HMM、DNN、RNN模型、波形合成及后期音质优化。实践中,获取高质量语音数据、训练计算资源和系统实时性是主要挑战。随着技术进步,未来语音合成将在多语种、个性化领域有更多应用。
|
5月前
|
语音技术
【手把手教学】最新ChatTTS语音合成项目使用指南【附所有源码与模型】
【手把手教学】最新ChatTTS语音合成项目使用指南【附所有源码与模型】
|
6月前
|
自然语言处理 文字识别 Linux
ModelScope运行语音合成模型的官网代码示例报错如何解决
ModelScope模型报错是指在使用ModelScope平台进行模型训练或部署时遇到的错误和问题;本合集将收集ModelScope模型报错的常见情况和排查方法,帮助用户快速定位问题并采取有效措施。
182 0
|
6月前
|
自然语言处理 搜索推荐 PyTorch
ModelScope问题之NoteBook训练个性化语音合成模型报错如何解决
ModelScope训练是指在ModelScope平台上对机器学习模型进行训练的活动;本合集将介绍ModelScope训练流程、模型优化技巧和训练过程中的常见问题解决方法。
103 0
|
6月前
|
监控 语音技术 异构计算
使用开源的模型(像speech_sambert-hifigan_tts_zhida_zh-cn_16k)进行语音合成任务的推理时,推理速度太慢了,500字大约需要1分钟,为什么会这么慢
使用开源的模型(像speech_sambert-hifigan_tts_zhida_zh-cn_16k)进行语音合成任务的推理时,推理速度太慢了,500字大约需要1分钟,为什么会这么慢
564 2
|
API 语音技术 开发者
构建智能语音助手应用:语音识别和语音合成的实践
智能语音助手应用正在成为现代应用程序的热门趋势。语音识别技术使应用能够理解和解释用户的语音输入,而语音合成技术则将计算机生成的语音转化为可听的声音。本文将介绍构建智能语音助手应用的实践方法,并展示如何使用开源工具和API进行语音识别和语音合成。
511 0
|
机器学习/深度学习 人工智能 自然语言处理
Tacotron2、GST、Glow-TTS、Flow-TTS…你都掌握了吗?一文总结语音合成必备经典模型(四)
Tacotron2、GST、Glow-TTS、Flow-TTS…你都掌握了吗?一文总结语音合成必备经典模型
1157 0