ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleSpeech 粤语 FastSpeech2 语音合成实战:从数据集预处理到端到端推理

PaddleSpeech 粤语 FastSpeech2 语音合成实战:从数据集预处理到端到端推理 人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本文以 PaddleSpeech 仓库中的 examples/canton/tts3 为骨架完整讲解基于 FastSpeech2 声学模型构建粤语Cantonese语音合成系统的全流程包括 MagicData 粤语数据集下载与合并、MFA 音素时长对齐、特征预处理、模型训练、端到端语音合成以及静态模型 / ONNX 模型的导出与跨平台推理。读完本文你将能够独立复现一个多说话人粤语 TTS 训练管线并理解其底层 G2P字音转换与特征提取实现。1. 示例概览为什么需要专门的粤语 TTS 示例examples/canton/tts3是 PaddleSpeech 中针对粤语Cantonese语言专门适配的 FastSpeech2 训练示例。粤语与普通话在音系上有显著差异粤语使用约 40 个声母/韵母组合见 canton_frontend.py 中的INITIALS列表声调系统也不同于普通话因此需要独立的 G2P 前端与专属的数据预处理流程。该示例的整体链路与其他语言示例如 examples/aishell3/tts3保持一致但在数据读取、前端音素映射、训练配置等多个环节加入了粤语专属处理是理解 PaddleSpeech 多语言 TTS 扩展方式的最佳入门样例之一。FastSpeech2 是本文示例所用的声学模型其核心思想是通过时长、音高pitch与能量energy三个预测器实现非自回归、并行可控的语音合成。2. 数据集准备下载、合并与 MFA 对齐2.1 下载两个粤语语料并合并示例使用 MagicData 发布的两个粤语脚本语音语料Guangzhou_Cantonese_Scripted_Speech_Corpus_Daily_Use_Sentence广州粤语日常用语脚本语音语料Guangzhou_Cantonese_Scripted_Speech_Corpus_in_Vehicle广州粤语车载场景脚本语音语料需要将两个数据集下载并解压到~/datasets/下。为了获得更好的训练效果示例建议将两个数据集合并为单一目录canton_allmkdir -p ~/datasets/canton_all/WAV cp -r ~/datasets/Guangzhou_Cantonese_Scripted_Speech_Corpus_Daily_Use_Sentence/WAV/* ~/datasets/canton_all/WAV cp -r ~/datasets/Guangzhou_Cantonese_Scripted_Speech_Corpus_in_Vehicle/WAV/* ~/datasets/canton_all/WAV合并完成后目录结构应如下~/datasets/canton_all │ └── WAV │ └──G0001 │ └──G0002 │ ... │ └──G0071 │ └──G00722.2 从 MFA 对齐结果生成时长文件FastSpeech2 训练需要逐音素的时长标注示例使用蒙特利尔强制对齐工具MFA获取时长。你可以参照仓库中的 examples/other/mfa 示例自行训练 MFA 模型当前使用 MFA1.x同时示例作者也直接提供了这两个数据集的 MFA 对齐结果canton_alignment.zip官方 CDN 分发文件名见原 README解压后得到目录./canton_alignment。时长文件由预处理脚本根据 MFA 的 TextGrid 结果生成对应脚本为仓库中的 utils/gen_duration_from_textgrid.py在 local/preprocess.sh 的 stage 0 中被调用python3 ${MAIN_ROOT}/utils/gen_duration_from_textgrid.py \ --inputdir./canton_alignment \ --output durations.txt \ --config${config_path}3. 一键启动run.sh 的阶段化训练管线examples/canton/tts3目录下的 run.sh 是整个示例的入口。运行前先执行source path.sh加载环境变量MAIN_ROOT、BIN_DIR等随后按阶段依次执行预处理、训练、合成与模型导出./run.shrun.sh 定义了 7 个阶段stage可通过--stage与--stop-stage参数自由控制执行范围。例如下面命令只执行数据预处理./run.sh --stage 0 --stop-stage 0各阶段的含义汇总如下stage执行脚本功能说明0local/preprocess.sh数据预处理生成时长文件、提取特征、统计并归一化1local/train.sh训练 FastSpeech2 模型checkpoint 保存在exp/default/checkpoints/2local/synthesize.sh从metadata.jsonl合成波形声码器默认 pwganstage 参数为 0设为 1 使用 hifigan3local/synthesize_e2e.sh端到端合成直接从文本文件合成波形4local/inference.sh使用 Paddle Inference 静态模型推理5paddle2onnx 转换将静态模型导出为 ONNX调用 examples/csmsc/tts3/local/paddle2onnx.sh6local/ort_predict.sh使用 ONNX Runtime 在 CPU 上推理run.sh中的默认参数为GPU 使用gpus0,1配置文件conf/default.yaml训练输出目录exp/default默认使用名为snapshot_iter_140000.pdz的 checkpoint。4. 数据预处理dump 目录与特征统计4.1 预处理的三步流程local/preprocess.sh 内部同样以阶段化方式完成三步工作生成时长文件从 MFA 的 TextGrid 结果生成durations.txtstage 0提取特征调用 paddlespeech/t2s/exps/fastspeech2/preprocess.py 提取 log-mel 频谱、pitch基频与 energy能量特征python3 ${BIN_DIR}/preprocess.py \ --datasetcanton \ --rootdir~/datasets/canton_all \ --dumpdirdump \ --dur-filedurations.txt \ --config${config_path} \ --num-cpu20 \ --cut-silTrue统计与归一化先用 utils/compute_statistics.py 基于dump/train/raw/metadata.jsonl分别计算speech、pitch、energy三个字段的均值/方差再用 paddlespeech/t2s/exps/fastspeech2/normalize.py 对 train / dev / test 三部分做归一化并将音素与说话人映射为 ID。4.2 dump 目录结构预处理完成后当前目录下会生成dump文件夹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数据集被划分为train、dev、test三部分每部分下含raw原始特征与norm归一化后特征两个子目录归一化所用的统计量来自训练集存放于dump/train/*_stats.npy每个子目录中还有一份metadata.jsonl它是类似表格的记录文件逐条包含phones音素序列、text_lengths文本长度、speech_lengths语音帧数、durations逐音素时长、speech/pitch/energy 特征路径、speaker说话人以及utt_id话语 ID。4.3 源码中的粤语专属处理从 preprocess.py 的实现可以看到几处粤语专属逻辑立体声处理粤语数据集的部分音频为双声道读取时使用monoFalse并取第一个声道同时要求数据集必须放在~/datasets/canton_all否则路径判断会出问题静音裁剪--cut-silTrue时会裁剪首尾的sil静音音素及其对应波形减少无效帧对训练的影响数据切分规则canton分支下按说话人目录遍历 WAV 文件每个说话人超过 100 条音频时才划分出末尾 5 条作为 dev、再往前 5 条作为 test否则全部划入训练集特征提取参数LogMelFBank、Pitch、Energy三个提取器的参数全部来自配置文件包括f0min/f0max、n_mels、fmin/fmax等。5. 核心配置文件 conf/default.yaml 全参数解析conf/default.yaml 是训练与特征提取的唯一配置入口按功能区分为特征、数据、模型、优化器等模块。下面结合源码逐一解读关键参数。5.1 特征提取设置参数默认值说明fs24000采样率Hzn_fft2048FFT 点数n_shift300帧移Hop size对应 12.5mswin_length1200窗长对应 50ms若为 null 则等于n_fftwindowhann窗函数类型fmin/fmax80 / 7600Mel 滤波器组的最低/最高频率n_mels80Mel 滤波器组数量f0min/f0max110 / 400基频提取的上下限仅用于使用 pitch 特征的模型其中f0min是粤语示例的一个关键调优点。配置注释明确指出粤语数据集与 Databaker、LJSpeech 等其他语料不同将其设为 110 以避免过多的零基频zero-pitch问题参考了 Python-Wrapper-for-World-Vocoder 的相关 issue。这一设置在 preprocess.py 中被传递给Pitch提取器直接影响训练数据的质量。5.2 数据与模型设置batch_size: 32 num_workers: 2 model: adim: 384 # attention 维度 aheads: 2 # attention head 数 elayers: 4 # encoder 层数 eunits: 1536 # encoder 前馈单元数 dlayers: 4 # decoder 层数 dunits: 1536 # decoder 前馈单元数 positionwise_layer_type: conv1d positionwise_conv_kernel_size: 3 duration_predictor_layers: 2 duration_predictor_chans: 256 duration_predictor_kernel_size: 3 postnet_layers: 5 postnet_filts: 5 postnet_chans: 256 use_scaled_pos_enc: True encoder_normalize_before: True decoder_normalize_before: True reduction_factor: 1 init_type: xavier_uniform ... spk_embed_dim: 256 # 说话人嵌入维度 spk_embed_integration_type: concat # 说话人嵌入融合方式其余还有pitch_predictor_*5 层、256 通道、卷积核 5、dropout 0.5、energy_predictor_*2 层、256 通道、卷积核 3、dropout 0.5两组预测器参数以及transformer_enc/dec_*_dropout_rate统一 0.2等正则化参数。spk_embed_dim: 256与spk_embed_integration_type: concat表明这是一个多说话人模型说话人 ID 经嵌入层后以拼接方式注入网络这正是推理时需要指定--spk_id的原因。5.3 训练与优化设置updater: use_masking: True # 损失计算时对 padding 部分做掩码 optimizer: optim: adam learning_rate: 0.001 max_epoch: 1000 num_snapshots: 5 seed: 100866. 模型训练local/train.sh 调用 paddlespeech/t2s/exps/fastspeech2/train.py 启动训练python3 ${BIN_DIR}/train.py \ --train-metadatadump/train/norm/metadata.jsonl \ --dev-metadatadump/dev/norm/metadata.jsonl \ --config${config_path} \ --output-dir${train_output_path} \ --ngpu2 \ --phones-dictdump/phone_id_map.txt \ --speaker-dictdump/speaker_id_map.txt训练使用归一化后的特征norm/metadata.jsonl验证集为dev--ngpu2表示双卡训练若设为 0 则使用 CPU/XPUcheckpoint 统一输出到exp/default/checkpoints/默认命名snapshot_iter_140000.pdz由 run.sh 的ckpt_name指定.pdz同时包含模型参数与优化器状态。7. 语音合成两条路径示例提供两条合成路径分别对应 run.sh 的 stage 2 与 stage 3。7.1 从 metadata.jsonl 合成stage 2local/synthesize.sh 调用 paddlespeech/t2s/exps/synthesize.py从dump/test/norm/metadata.jsonl读取测试集特征并逐句合成适用于评估模型在测试集上的表现。脚本中同时给出了 pwgan默认与 hifigan 两种声码器配置python3 ${BIN_DIR}/../synthesize.py \ --amfastspeech2_aishell3 \ --am_config${config_path} \ --am_ckpt${train_output_path}/checkpoints/${ckpt_name} \ --am_statdump/train/speech_stats.npy \ --vocpwgan_aishell3 \ --voc_configpwg_aishell3_ckpt_0.5/default.yaml \ --voc_ckptpwg_aishell3_ckpt_0.5/snapshot_iter_1000000.pdz \ --voc_statpwg_aishell3_ckpt_0.5/feats_stats.npy \ --test_metadatadump/test/norm/metadata.jsonl \ --output_dir${train_output_path}/test \ --phones_dictdump/phone_id_map.txt \ --speaker_dictdump/speaker_id_map.txt7.2 从文本文件端到端合成stage 3local/synthesize_e2e.sh 调用 paddlespeech/t2s/exps/synthesize_e2e.py直接从文本合成语音输入文本为仓库自带的粤语测试句 paddlespeech/t2s/assets/sentences_canton.txt包含 21 句地道的粤语口语示例如“白云山爬过一次嘅好远啊”、“一蚊一斤鸡一蚊一斤龟究竟係鸡贵定係龟贵”等绕口令与俗语。FLAGS_allocator_strategynaive_best_fit \ FLAGS_fraction_of_gpu_memory_to_use0.01 \ python3 ${BIN_DIR}/../synthesize_e2e.py \ --amfastspeech2_canton \ --am_config${config_path} \ --am_ckpt${train_output_path}/checkpoints/${ckpt_name} \ --am_statdump/train/speech_stats.npy \ --vocpwgan_aishell3 \ --voc_configpwg_aishell3_ckpt_0.5/default.yaml \ --voc_ckptpwg_aishell3_ckpt_0.5/snapshot_iter_1000000.pdz \ --voc_statpwg_aishell3_ckpt_0.5/feats_stats.npy \ --langcanton \ --text${BIN_DIR}/../../assets/sentences_canton.txt \ --output_dir${train_output_path}/test_e2e \ --phones_dictdump/phone_id_map.txt \ --speaker_dictdump/speaker_id_map.txt \ --spk_id10 \ --inference_dir${train_output_path}/inference关键参数说明以 synthesize_e2e.py 的 argparse 定义为准--am声学模型可选fastspeech2_aishell3/fastspeech2_canton等--voc声码器支持pwgan_aishell3、hifigan_aishell3、mb_melgan_csmsc、wavernn_csmsc等十余种--stage为 0 时用 pwgan为 1 时用 hifigan--lang语言合法取值为[zh, en, mix, canton, sing]粤语必须传canton前端将据此选择对应的 G2P 处理--spk_id多说话人模型下的说话人 ID示例统一使用10--inference_dir指定后会在合成的同时导出可供 Paddle Inference 使用的静态模型目录供 stage 4 使用。8. 预训练模型与快速推理8.1 预训练模型清单示例提供训练好的 FastSpeech2 粤语模型去除了音频边缘静音fastspeech2_canton_ckpt_1.4.0.zip动态图 checkpointfastspeech2_canton_static_1.4.0.zip静态图模型fastspeech2_canton_onnx_1.4.0.zipONNX 模型。三者均由官方 CDN 分发paddlespeech.cdn.bcebos.com/Parakeet/released_models/fastspeech2/目录下载文件名与路径以 README.md 为准。checkpoint 解压后的目录结构如下fastspeech2_canton_ckpt_1.4.0 ├── default.yaml # 训练 fastspeech2 所用的默认配置 ├── energy_stats.npy # 训练时归一化 energy 的统计量 ├── phone_id_map.txt # 训练时的音素词表 ├── pitch_stats.npy # 训练时归一化 pitch 的统计量 ├── snapshot_iter_140000.pdz # 模型参数与优化器状态 ├── speaker_id_map.txt # 多说话人模型的说话人 ID 映射 └── speech_stats.npy # 训练时归一化频谱的统计量8.2 神经声码器示例使用 Parallel WaveGAN并行 WaveGAN作为神经声码器。下载官方预训练模型pwg_aishell3_ckpt_0.5.zip并解压unzip pwg_aishell3_ckpt_0.5.zip8.3 使用预训练模型直接合成结合预训练的 fastspeech2 与 parallel wavegan可用以下命令对 sentences_canton.txt 直接合成source path.sh FLAGS_allocator_strategynaive_best_fit \ FLAGS_fraction_of_gpu_memory_to_use0.01 \ python3 ${BIN_DIR}/../synthesize_e2e.py \ --amfastspeech2_aishell3 \ --am_configfastspeech2_canton_ckpt_1.4.0/default.yaml \ --am_ckptfastspeech2_canton_ckpt_1.4.0/snapshot_iter_140000.pdz \ --am_statfastspeech2_canton_ckpt_1.4.0/speech_stats.npy \ --vocpwgan_aishell3 \ --voc_configpwg_aishell3_ckpt_0.5/default.yaml \ --voc_ckptpwg_aishell3_ckpt_0.5/snapshot_iter_1000000.pdz \ --voc_statpwg_aishell3_ckpt_0.5/feats_stats.npy \ --langcanton \ --text${BIN_DIR}/../../assets/sentences_canton.txt \ --output_direxp/default/test_e2e \ --phones_dictfastspeech2_canton_ckpt_1.4.0/phone_id_map.txt \ --speaker_dictfastspeech2_canton_ckpt_1.4.0/speaker_id_map.txt \ --spk_id10 \ --inference_direxp/default/inference注意--phones_dict与--speaker_dict必须指向预训练 checkpoint 自带的词表文件--am_stat使用speech_stats.npy三者共同保证输入音素 ID 与模型训练时的统计口径一致。9. 源码纵深粤语文本前端 CantonFrontend粤语合成的核心差异在于文本前端。仓库中的 paddlespeech/t2s/frontend/canton_frontend.py 实现了CantonFrontend类其 G2P 流程为文本正则化TN调用TextNormalizer对输入文本做规范化与分句粤拼转换Jyutping使用ToJyutping库将中文文本转为粤语拼音Jyutping例如gam3 ngaam1 lou5 sai3 jiu1 kau4 ...音素切分jyuping_to_phonemes依据INITIALS列表包含aa、aai、aak等 40 个粤语韵母/声母组合以及sp、spl、spn、sil四个特殊标记将粤拼拆分为声母韵母的音素序列音素到 ID_p2id将音素映射为词表 ID未登录音素OOV统一替换为sp避免推理崩溃。该前端通过--langcanton被 synthesize_e2e.py 与 inference.py 选用是整条粤语合成链路中“语言适配”的核心枢纽。10. 模型导出与跨平台部署10.1 导出静态模型与 ONNXrun.sh 的 stage 4~5 在完成合成后自动导出推理模型stage 4 通过 local/inference.sh 使用 Paddle Inference 验证静态模型同样支持pwgan_aishell3、mb_melgan_csmsc、hifigan_csmsc、wavernn_csmsc等声码器stage 5 则安装paddle2onnx并把静态模型转为 ONNXpip install paddle2onnx --upgrade ../../csmsc/tts3/local/paddle2onnx.sh ${train_output_path} inference inference_onnx fastspeech2_canton ../../csmsc/tts3/local/paddle2onnx.sh ${train_output_path} inference inference_onnx pwgan_aishell3底层 examples/csmsc/tts3/local/paddle2onnx.sh 会调用paddle2onnx将*.pdmodel/*.pdiparams导出为*.onnx--opset_version 11。10.2 ONNX Runtime CPU 推理stage 6 通过 local/ort_predict.sh 调用 paddlespeech/t2s/exps/ort_predict_e2e.py使用 ONNX Runtime 在 CPU 上完成端到端合成python3 ${BIN_DIR}/../ort_predict_e2e.py \ --inference_dir${train_output_path}/inference_onnx \ --amfastspeech2_canton \ --vocpwgan_aishell3 \ --spk_id10 \ --output_dir${train_output_path}/onnx_infer_out_e2e \ --text${BIN_DIR}/../../assets/sentences_canton.txt \ --phones_dictdump/phone_id_map.txt \ --speaker_dictdump/speaker_id_map.txt \ --langcanton \ --devicecpu \ --cpu_threads2该阶段同样支持mb_melgan_csmsc、hifigan_csmsc等声码器组合--devicecpu与--cpu_threads2用于控制 CPU 推理线程数方便在无 GPU 的服务器或边缘设备上部署。11. 训练细节与扩展参考本文示例的训练细节与 examples/aishell3/tts3 保持一致多说话人 FastSpeech2 的通用流程。若需将本示例迁移到其他语料建议关注以下扩展点新增语言前端参考 paddlespeech/t2s/frontend/canton_frontend.py 实现对应的 G2P 类并在 synthesize_e2e.py 的--lang选项中注册数据读取适配参考 preprocess.py 中canton分支按数据集的目录结构补充切分与声道处理逻辑声码器替换只需更换--voc、--voc_config、--voc_ckpt、--voc_stat四个参数即可在 pwgan / hifigan / mb_melgan 等声码器之间切换无需改动声学模型部分。综上所述examples/canton/tts3覆盖了从多说话人粤语数据预处理、FastSpeech2 训练到端到端合成与 ONNX 部署的完整闭环是研究 PaddleSpeech 多语言 TTS 扩展机制与实际落地的直接参考。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐OpenScreen macOS 原生光标捕获测试管线Helper 构建、冒烟测试与 Sidecar 验证实战OpenScreen macOS 原生光标捕获测试管线Helper 构建、冒烟测试与 Sidecar 验证实战 OpenScreen 在 macOS 上通过一人工智能语音音频ZLUDA 故障排查指南用 zluda_trace 追踪 CUDA 调用、解读日志并定位 PTX 编译错误ZLUDA 故障排查指南用 zluda_trace 追踪 CUDA 调用、解读日志并定位 PTX 编译错误 ZLUDA 的目标是在非 NVIDIA GPU 上人工智能语音音频PaddleSpeech VITS 实验模块全解析从数据预处理到端到端语音合成与音色克隆PaddleSpeech VITS 实验模块全解析从数据预处理到端到端语音合成与音色克隆 本篇文章以 PaddleSpeech 仓库中的 API 文档入口 d人工智能语音音频上一篇Uvicorn性能监控指标关键指标定义与阈值设置下一篇如何永久保存微信聊天记录WeChatMsg让你的数字记忆永不丢失创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表