ARTICLE DETAIL

资讯详情

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

PaddleSpeech 实战:基于 LJSpeech 训练 WaveFlow 流式神经声码器与波形合成指南

PaddleSpeech 实战:基于 LJSpeech 训练 WaveFlow 流式神经声码器与波形合成指南 人工智能语音音频【免费下载链接】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/gh_mirrors/pa/PaddleSpeech点击查看免费下载WaveFlow 是一种基于归一化流Normalizing Flow的自回归式神经声码器能够把梅尔频谱mel spectrogram转换为高保真原始波形。本指南以 PaddleSpeech 仓库中examples/ljspeech/voc0示例为核心完整讲解数据准备、特征预处理、模型训练含单卡与多卡分布式训练、从梅尔频谱合成波形以及预训练模型使用的全流程。读完本文你将掌握在 PaddleSpeech 中训练 WaveFlow 声码器并将其接入 Tacotron2 等声学模型输出进行端到端语音合成的完整实战方案。WaveFlow 示例在 PaddleSpeech 中的定位在文本转语音TTS流水线中声学模型如 Tacotron2、FastSpeech2负责把文本映射为梅尔频谱而**声码器vocoder**则负责把梅尔频谱还原为可听的波形。examples/ljspeech/voc0就是 PaddleSpeech 提供的 WaveFlow 声码器示例它以 LJSpeech-1.1 英文单说话人数据集为训练语料。该示例与examples/ljspeech/tts0Tacotron2 示例天然衔接Tacotron2 生成的梅尔频谱默认位于../tts0/output/test即examples/ljspeech/tts0/output/test可以直接作为 WaveFlow 合成阶段的输入。示例的目录结构如下examples/ljspeech/voc0/ ├── README.md ├── path.sh # 设置环境变量与 BIN_DIR ├── run.sh # 一键流水线stage 0/1/2 └── local/ ├── preprocess.sh # 数据预处理 ├── train.sh # 模型训练 └── synthesize.sh # 从梅尔频谱合成波形path.sh定义了脚本所需的环境它将仓库根目录设为MAIN_ROOT并声明MODELwaveflow、BIN_DIR${MAIN_ROOT}/paddlespeech/t2s/exps/${MODEL}即所有local/*.sh脚本最终都会调用 paddlespeech/t2s/exps/waveflow 目录下的 Python 入口preprocess.py、train.py、synthesize.py。数据集准备下载与解压 LJSpeech-1.1WaveFlow 训练使用 LJSpeech-1.1 数据集约 13,100 条英文语音片段总时长约 24 小时22050 Hz 采样率。从 LJSpeech 官方网站下载LJSpeech-1.1压缩包后将其解压到~/datasets目录最终数据集目录为~/datasets/LJSpeech-1.1。解压后的数据集内每个语音文件以LJ###-####.wav命名配套一个metadata.csv文件记录每条语音的文本标注。WaveFlow 的训练只需要音频本身文本标注用于其他任务如 Tacotron2本示例的预处理仅提取音频与梅尔频谱。说明在 preprocess.py 中数据集元信息通过LJSpeechMetaData读取预处理阶段会对每条音频执行librosa.load并校验采样率必须为 22050 Hz源码中assert loaded_sr sr若不一致会提示需要重采样。快速开始一键跑通预处理、训练与合成进入示例目录后直接运行 run.sh 即可依次完成环境初始化、数据预处理、模型训练和波形合成四个步骤cd examples/ljspeech/voc0 ./run.shrun.sh内部通过source ${MAIN_ROOT}/utils/parse_options.sh解析命令行参数支持用--stage与--stop-stage控制要执行的阶段区间。例如只运行数据预处理阶段./run.sh --stage 0 --stop-stage 0run.sh中各阶段的默认行为如下变量可在脚本头部修改阶段默认操作stage 0调用./local/preprocess.sh ${preprocess_path}其中preprocess_pathpreprocessed_ljspeechstage 1调用CUDA_VISIBLE_DEVICES${gpus} ./local/train.sh ${preprocess_path} ${train_output_path}其中gpus0,1、train_output_pathoutputstage 2从preprocessed_ljspeech/mel中复制LJ050-001*.npy到preprocessed_ljspeech/mel_test再调用./local/synthesize.sh ${input_mel_path} ${train_output_path} ${ckpt_name}合成波形其中ckpt_namestep-10000也就是说默认流程会预处理原始数据集 → 用 2 张 GPU 训练 → 取step-10000检查点对LJ050-001开头的几条测试梅尔频谱合成波形。这也说明run.sh默认假定你已经在step-10000或更早的迭代中得到了检查点若从头训练应先将ckpt_name改为实际存在的检查点名称。数据预处理从 WAV 到梅尔频谱预处理脚本 local/preprocess.sh 只接收一个参数——预处理输出路径./local/preprocess.sh ${preprocess_path}它等价于调用python3 ${BIN_DIR}/preprocess.py \ --input~/datasets/LJSpeech-1.1 \ --output${preprocess_path}特征计算细节preprocess.py 中的Transform类实现了完整的特征流水线默认参数来自配置详见后文配置参数详解加载音频librosa.load(wav_path, srNone)保持原始采样率随后断言采样率等于配置值 22050 Hz反射填充reflect padding为使帧数与hop_length对齐计算frames ceil(wav.size / hop_length)并将音频两端以reflect模式填充到目标长度幅度归一化wav wav / np.abs(wav).max() * 0.999将峰值幅度归一化到 0.999避免削波STFTlibrosa.core.stft参数为n_fft1024、win_length1024、hop_length256、centerFalse关闭内部填充梅尔滤波用librosa.filters.mel(sr, n_fft, n_mels80, fmin0, fmax8000)构造滤波组与 STFT 幅度谱做矩阵乘法得到 80 维梅尔频谱对数幅度通过LogMagnitude(min1e-5)对梅尔频谱取对数得到对数幅度梅尔频谱log magnitude mel裁剪对齐audio wav[fft_padding:-fft_padding]去除 STFT 填充部分保证mel.shape[1] * hop_length audio.size。预处理输出结构预处理完成后${preprocess_path}目录下会生成三个组成部分preprocessed_ljspeech/ ├── metadata.csv # 每行文件名、梅尔帧数、音频采样数Tab 分隔 ├── wav/ # 每条语音的原始波形 .npyfloat 数组 └── mel/ # 每条语音的对数梅尔频谱 .npy80 维其中metadata.csv由pd.DataFrame.to_csv(..., sep\t, headerNone)写出是后续训练阶段定位mel/*.npy与wav/*.npy的索引。模型训练单卡与分布式训练脚本 local/train.sh 接收预处理路径与输出路径两个参数CUDA_VISIBLE_DEVICES${gpus} ./local/train.sh ${preprocess_path} ${train_output_path}它等价于调用python3 ${BIN_DIR}/train.py \ --data${preprocess_path} \ --output${train_output_path} \ --ngpu1train.py 命令行参数train.py 基于 PaddleSpeech 的ExperimentBase训练框架支持以下参数参数含义说明--data训练数据集路径即预处理生成的preprocessed_ljspeech目录--output输出目录训练日志、可视化与检查点保存在该目录下--ngpu使用的 GPU 数量ngpu 0时使用 CPUngpu 1时启用分布式训练--config额外配置文件可选用于覆盖默认配置yaml 格式--opts键值对覆盖项可选以KEY VALUE对的形式覆盖配置分布式训练说明将--ngpu设为大于 1 的值如 4即可启用多卡训练。源码中if args.ngpu 1: dist.spawn(main_sp, args(config, args), nprocsargs.ngpu)即通过 Paddle 的dist.spawn启动多个进程训练脚本中同时使用DistributedBatchSampler按world_size与rank切分数据。需要特别注意的是分布式训练目前不支持 CPUngpu 1时走单进程路径。训练循环与数据组织训练阶段的数据流在 train.py 的setup_dataloader中定义使用 ljspeech.py 中的LJSpeech数据集类读取metadata.csv按记录加载mel/*.npy与wav/*.npy前config.data.valid_size默认 16条样本被dataset.split保留为验证集其余为训练集训练集使用LJSpeechClipCollector(config.data.clip_frames, config.data.hop_length)做随机裁剪从每条样本的梅尔频谱中随机截取clip_frames65帧对应65 × 256 16640个波形采样点保证每个 batch 内数据长度一致且充分利用长音频验证集使用LJSpeechCollector对整段音频做 padding 后组成 batch。每步训练中模型前向计算得到隐变量z与对数雅可比行列式log_det_jacobian再经WaveFlowLoss计算负对数似然损失并反向传播更新参数优化器为 Adam学习率默认2e-4。训练日志包含每个 step 的耗时与 loss 值并通过 VisualDL 记录train/loss与valid/loss标量曲线。波形合成从梅尔频谱到 WAV合成脚本 local/synthesize.sh 接收三个参数CUDA_VISIBLE_DEVICES${gpus} ./local/synthesize.sh ${input_mel_path} ${train_output_path} ${ckpt_name}它等价于调用python ${BIN_DIR}/synthesize.py \ --input${input_mel_path} \ --output${train_output_path}/wavs/ \ --checkpoint_path${train_output_path}/checkpoints/${ckpt_name} \ --ngpu1synthesize.py 的合成逻辑要点如下输入--input必须是一个目录内含若干.npy格式的对数幅度梅尔频谱80 维脚本遍历目录下所有*.npy文件逐个合成加载模型通过ConditionalWaveFlow.from_pretrained(config, args.checkpoint_path)加载检查点--checkpoint_path指向参数文件.pdparams注意该路径不含.pdparams扩展名例如output/checkpoints/step-10000推理模式加载后调用layer_tools.recursively_remove_weight_norm(model)移除权重归一化weight norm以加速推理随后model.eval()精度与加速合成在paddle.amp.auto_cast()混合精度上下文中执行model.predict(mel)输出每个输入.npy对应生成一个同名.wav文件保存到--output目录采样率为config.data.sample_rate22050 Hz写入使用soundfilesf.write设备选择--ngpu0时使用 CPU--ngpu0时使用 GPU。一个典型的合成示例是先用examples/ljspeech/tts0的 Tacotron2 模型生成测试梅尔频谱到../tts0/output/test再将其作为--input交给本示例合成语音从而串联起完整的文本 → 梅尔频谱 → 波形链路。配置参数详解WaveFlow 的默认配置定义在 paddlespeech/t2s/exps/waveflow/config.py通过 yacsCfgNode管理train.py/synthesize.py/preprocess.py均以它为基准并可用--config或--opts覆盖。数据相关参数config.data参数默认值含义batch_size8每个 batch 的样本数裁剪后的短片段valid_size16数据集前 16 条样本保留作为验证集sample_rate22050音频采样率Hzn_fft1024STFT 帧长win_length1024窗长hop_length256相邻帧的帧移fmin0梅尔滤波最低频率Hzfmax8000梅尔滤波最高频率Hzn_mels80梅尔频带数clip_frames65训练时随机裁剪的梅尔帧数模型结构参数config.model参数默认值含义upsample_factors[16, 16]两层 Conv2DTranspose 的时间上采样因子乘积 256 恰好等于hop_lengthn_flows8WaveFlow 中 flow 的数量n_layers8每个 flow 中卷积块的数量n_group16音频与频谱的折叠fold因子channels128每个 flow 中的残差通道数residual channelkernel_size[3, 3]每个卷积块的卷积核大小sigma1.0随机噪声的标准差用于损失中的噪声项训练参数config.training参数默认值含义lr2e-4Adam 优化器学习率valid_interval1000每 1000 步执行一次验证save_interval10000每 10000 步保存一次检查点max_iteration3000000最大训练迭代步数upsample_factors与预处理参数存在强约束关系模型实现 waveflow.py 中的UpsampleNet注释明确指出np.prod(upsample_factors)必须等于 STFT 的hop_length——16 × 16 256恰好与预处理阶段的hop_length256匹配保证上采样后的梅尔频谱与波形在时间轴上对齐。修改其中任何一组参数时务必保持这一等式成立。WaveFlow 模型结构源码解析WaveFlow 的完整实现位于 paddlespeech/t2s/models/waveflow.py核心组件包括UpsampleNet由多个Conv2DTranspose带 weight norm 初始化组成把梅尔频谱在时间维度上按upsample_factors逐步上采样到与波形相同的时间分辨率每层后接leaky_relu(0.4)激活并可选择trim_conv_artifact裁剪反卷积边界伪影ResidualBlockWaveFlow 的基本卷积单元在高度维度使用因果填充causal padding、宽度维度使用 same padding并带有条件condition投影与输出投影通过receptive_field 1 (k - 1) * d计算感受野以确定填充量fold将音频/频谱的时间维按n_group16折叠为(time_steps // n_group, n_group)的分组形状这是 WaveFlow 并行化的关键操作ConditionalWaveFlow以梅尔频谱为条件的主模型支持from_pretrained加载检查点与predict推理WaveFlowLoss基于归一化流的负对数似然损失以sigma作为噪声标准差。结合 train.py 中setup_model的调用可知模型实例化参数upsample_factors、n_flows、n_layers、n_group、channels、n_mels、kernel_size全部取自上述配置体现了配置驱动模型结构的设计模式。使用预训练模型仓库为 LJSpeech 数据集提供了 WaveFlow 预训练模型residual channel 为 128即对应默认配置channels128压缩包名为waveflow_ljspeech_ckpt_0.3.zip可从 PaddleSpeech 官方模型下载地址paddlespeech.cdn.bcebos.com 的 Parakeet released_models 目录获取并解压。解压后得到检查点文件可直接将其路径作为synthesize.py的--checkpoint_path使用同样不含.pdparams扩展名省去自行训练的耗时。小结examples/ljspeech/voc0给出了一个完整、可复现的 WaveFlow 声码器训练与推理流程从 LJSpeech-1.1 原始音频出发通过 preprocess.py 得到对齐的对数梅尔频谱与波形对用 train.py 以归一化流目标训练ConditionalWaveFlow支持随机裁剪、验证集划分与多卡分布式扩展再用 synthesize.py 从任意.npy梅尔频谱批量合成 22050 Hz 的 WAV 音频。该示例与examples/ljspeech/tts0Tacotron2可以无缝衔接构成 PaddleSpeech 中英文单说话人 TTS 的完整闭环。赞分享人工智能语音音频【免费下载链接】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/gh_mirrors/pa/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech 实战基于 LJSpeech-1.1 训练 HiFiGAN 声码器全流程指南PaddleSpeech 实战基于 LJSpeech 1.1 训练 HiFiGAN 声码器全流程指南 本文是一篇面向语音合成开发者的实战指南围绕 Paddl人工智能语音音频NLP媒体生成MooTool二维码生成与解析自定义尺寸、Logo与高级纠错功能MooTool二维码生成与解析自定义尺寸、Logo与高级纠错功能 在数字化时代二维码已成为我们生活中不可或缺的一部分。无论是支付、分享链接还是身份验证二维人工智能语音音频PaddleSpeech WaveFlow 声码器波形合成指南synthesize.py 全流程解析与实战PaddleSpeech WaveFlow 声码器波形合成指南synthesize.py 全流程解析与实战 WaveFlow 是基于流的生成式声码器voco人工智能语音音频NLP媒体生成上一篇终极指南LimboAI在Godot 4中的AI开发革命下一篇猫抓Cat-Catch现代浏览器资源嗅探的技术架构与实践应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表