ARTICLE DETAIL

资讯详情

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

基于 PaddleSpeech 的 FastSpeech2 + AISHELL-3 语音克隆(Voice Cloning)全流程实战指南

基于 PaddleSpeech 的 FastSpeech2 + AISHELL-3 语音克隆(Voice Cloning)全流程实战指南 人工智能语音音频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/aishell3/vc1 的官方示例为主线系统讲解如何基于FastSpeech2 声学模型 AISHELL-3 中文多说话人数据集搭建一套可复现的语音克隆Voice Cloning流水线。读完本文你将掌握 GE2E 说话人编码器、FastSpeech2 合成器、Parallel WaveGAN 声码器三阶段级联的完整技术原理能够独立完成数据集准备、说话人 Embedding 生成、预处理、模型训练、批量合成与零样本zero-shot语音克隆推理的全部命令行操作并深入理解conf/default.yaml中每个关键配置项的物理含义。任务背景从说话人验证迁移到多说话人 TTS语音克隆的目标是仅凭一段参考音频Reference Audio即可让 TTS 系统模仿该说话人的音色生成任意文本的语音。vc1 示例采用了 《Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis》 论文提出的经典方案将任务拆解为三个独立训练、再级联推理的模块Speaker Encoder说话人编码器以说话人验证Speaker Verification为训练任务用 GE2EGeneralized End-to-End Loss损失训练一个编码器把任意一段语音映射为一个固定维度的说话人 Embedding。训练该编码器不需要文本标注因此可以无限制地堆叠大量多说话人数据集例如 examples/other/ge2e 示例中使用的 Librispeech-other-500、VoxCeleb、VoxCeleb2、aidatatang-200zh、magicdata 等。Synthesizer合成器使用训练好的说话人编码器为 AISHELL-3 中的每个句子生成说话人 Embedding并将其作为 FastSpeech2 的额外输入与编码器输出拼接concat后送入解码器从而让声学模型感知是谁在说话。Vocoder声码器使用 Parallel WaveGANPWG将 FastSpeech2 输出的梅尔频谱还原为可听的波形其训练与推理流程见 examples/aishell3/voc1。三阶段中说话人编码器与声码器均使用预训练权重可直接下载本示例真正需要训练的部分只有 FastSpeech2 合成器本身。环境与数据集准备AISHELL-3 数据集下载与解压从 AISHELL-3 官网下载数据集后解压到~/datasets得到目录~/datasets/data_aishell3其中包含train、dev、test三个子集的 wav 音频与对应文本标注。AISHELL-3 是一个约 880 名中文说话人、88000 条话语的多说话人中文语料库是本示例的训练数据来源。MFA 强制对齐结果FastSpeech2 属于时长预测型duration-based非自回归 TTS训练需要每个音素phone的时长标注。vc1 使用 Montreal Forced AlignerMFA完成音素级别的强制对齐两种获取方式任选其一直接下载官方提供的对齐结果aishell3_alignment_tone.tar.gzMFA 2.x 产物含声调信息解压后目录名为aishell3_alignment_tone参考 examples/other/mfa 示例自行训练 MFA 模型当前使用 MFA 1.x生成对齐结果。注意run.sh、preprocess.sh中均硬编码了./aishell3_alignment_tone这一相对路径请将对齐结果解压到 vc1 示例目录下保持与脚本约定一致。预训练 GE2E 说话人编码器下载官方预训练的 GE2E 模型压缩包ge2e_ckpt_0.3.zip并解压。该模型即 examples/other/ge2e 示例的训练产物。在 run.sh 中默认约定# 不含 .pdparams 后缀用于生成 speaker embedding ge2e_ckpt_path./ge2e_ckpt_0.3/step-3000000 # 包含 .pdparams 后缀用于 voice cloning 推理 ge2e_params_path${ge2e_ckpt_path}.pdparams从 ge2e 推理源码 可以看到paddle.load(weights_fpath .pdparams)加载权重后使用LSTMSpeakerEncoder对每个 utterance 输出256 维说话人 Embedding模型配置为n_mels40、num_layers3、hidden_size256、output_size256。预训练 Parallel WaveGAN 声码器下载pwg_aishell3_ckpt_0.5.zip并解压得到以下文件pwg_aishell3_ckpt_0.5 ├── default.yaml # 训练 parallel wavegan 时的默认配置 ├── feats_stats.npy # 训练时用于归一化频谱的统计量 └── snapshot_iter_1000000.pdz # parallel wavegan 生成器参数该声码器用于最终的波形合成阶段全程无需再训练。快速开始一条命令跑通全流程run.sh是 vc1 示例的总入口它通过source ${MAIN_ROOT}/utils/parse_options.sh支持--stage/--stop-stage参数控制执行阶段。四个阶段的划分与默认参数如下见 run.sh阶段内容默认命令stage 0数据预处理生成说话人 Embedding、时长、特征、归一化./local/preprocess.sh ${conf_path} ${ge2e_ckpt_path}stage 1训练 FastSpeech2./local/train.sh ${conf_path} ${train_output_path}stage 2基于metadata.jsonl批量合成测试集波形./local/synthesize.sh ${conf_path} ${train_output_path} ${ckpt_name}stage 3语音克隆推理输入参考音频目录输出克隆语音./local/voice_cloning.sh ${conf_path} ${train_output_path} ${ckpt_name} ${ge2e_params_path} ${ref_audio_dir}整体运行./run.sh只跑数据预处理阶段./run.sh --stage 0 --stop-stage 0脚本默认变量还包括gpus0,1双卡、conf_pathconf/default.yaml、train_output_pathexp/default、ckpt_namesnapshot_iter_482.pdz在 stage 2/3 前请替换为你实际训练得到的 checkpoint 文件名。数据预处理详解五步流水线与 dump 目录./local/preprocess.sh见 preprocess.sh内部实际由 5 个子阶段组成比普通 TTS如 tts3多了一步 GE2E 说话人 Embedding 生成这也是语音克隆任务的核心差异所在① 生成说话人 Embeddingstage 0python3 ${MAIN_ROOT}/paddlespeech/vector/exps/ge2e/inference.py \ --input~/datasets/data_aishell3/train/wav/ \ --outputdump/embed \ --checkpoint_path${ge2e_ckpt_path}该命令遍历输入目录下所有.wav--pattern默认*.wav对每个音频先做 VAD 切分、梅尔频谱提取40 维 mel再经LSTMSpeakerEncoder.embed_utterance输出 256 维向量以.npy格式保存到dump/embed目录层级与 wav 文件完全一致。官方示例中仅对train集生成 embeddingdev/test集在后续训练与合成阶段会实时从前端提取。② 由 MFA 结果生成音素时长stage 1python3 ${MAIN_ROOT}/utils/gen_duration_from_textgrid.py \ --inputdir./aishell3_alignment_tone \ --output durations.txt \ --config${config_path}将 MFA 的 TextGrid 对齐结果转换为durations.txt作为 FastSpeech2 时长预测器的监督信号。③ 特征提取stage 2python3 ${BIN_DIR}/preprocess.py \ --datasetaishell3 \ --rootdir~/datasets/data_aishell3/ \ --dumpdirdump \ --dur-filedurations.txt \ --config${config_path} \ --num-cpu20 \ --cut-silTrue \ --spk_emb_dirdump/embed关键参数--cut-silTrue会切除句首句尾静音--spk_emb_dirdump/embed指定上一步生成的说话人 Embedding 目录使其与频谱、基频pitch、能量energy特征一同进入数据管线。④ 统计量计算stage 3python3 ${MAIN_ROOT}/utils/compute_statistics.py \ --metadatadump/train/raw/metadata.jsonl \ --field-namespeech # 同理对 pitch、energy 字段各执行一次仅基于train集计算三个特征的均值/标准差分别输出dump/train/speech_stats.npy、pitch_stats.npy、energy_stats.npy供后续归一化使用dev/test集也复用 train 的统计量避免信息泄漏。⑤ 归一化与词典构建stage 4对train、dev、test三个子集分别调用${BIN_DIR}/normalize.py使用 train 的统计量完成特征归一化同时生成dump/phone_id_map.txt音素词典与dump/speaker_id_map.txt说话人词典。预处理完成后当前目录下生成完整的dump文件夹结构如下dump ├── dev │ ├── norm # 归一化后的特征 │ └── raw # 原始 speech/pitch/energy 特征 ├── embed # 每个句子的说话人 embedding.npy │ ├── SSB0005 │ ├── SSB0009 │ └── ... ├── phone_id_map.txt # 音素 - id 映射 ├── speaker_id_map.txt# 说话人 - id 映射 ├── test │ ├── norm │ └── raw └── train ├── energy_stats.npy ├── norm ├── pitch_stats.npy ├── raw └── speech_stats.npy每个子目录train/dev/test下都有一份表格式文件metadata.jsonl每一行记录一条话语的phones音素序列、text_lengths、speech_lengths、durations时长、speech 特征路径、pitch 特征路径、energy 特征路径、speaker、id是后续训练与合成的数据索引。FastSpeech2 模型训练训练入口与语音克隆开关./local/train.sh调用${BIN_DIR}/train.py即paddlespeech/t2s/exps/fastspeech2/train.pyCUDA_VISIBLE_DEVICES${gpus} ./local/train.sh ${conf_path} ${train_output_path}脚本内容见 train.sh关键在最后两个参数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 \ --voice-cloningTrue与普通多说话人 TTStts3相比唯一区别是设置--voice-cloningTrue。从 train.py 源码 可以看到开启该开关后collate 函数切换为fastspeech2_multi_spk_batch_fn模型将把说话人 Embedding而非稀疏的 speaker id作为条件输入这正是零样本/任意新说话人能力的来源——推理时任何人的 Embedding 都可以直接送入模型。配置详解conf/default.yaml训练与特征提取共用一份配置见 conf/default.yaml各区块含义如下特征提取设置FEATURE EXTRACTION SETTING参数默认值含义fs24000采样率HzPWG 声码器输出也以此为采样率n_fft2048FFT 大小采样点数n_shift300帧移采样点数约 12.5mswin_length1200窗长采样点数约 50mswindowhann窗函数类型fmin/fmax80 / 7600Mel 滤波器组最小/最大频率Hzn_mels80Mel 滤波器组个数f0min/f0max80 / 400基频pitch提取的上下限Hz数据与模型设置数据batch_size: 64、num_workers: 2。模型model区块核心结构参数adim: 384注意力维度、aheads: 2注意力头数、elayers: 4 / eunits: 1536编码器层数与 FFN 单元数、dlayers: 4 / dunits: 1536解码器层数与 FFN 单元数、positionwise_layer_type: conv1d位置前馈层为卷积及positionwise_conv_kernel_size: 3。预测器参数时长预测器duration_predictor_layers: 2 / chans: 256 / kernel_size: 3基频预测器pitch_predictor_layers: 5 / chans: 256 / kernel_size: 5 / dropout: 0.5能量预测器energy_predictor_layers: 2 / chans: 256 / kernel_size: 3 / dropout: 0.5。FastSpeech2 通过这三个预测器在非自回归解码时对齐文本与频谱长度。PostNetpostnet_layers: 5、postnet_filts: 5、postnet_chans: 256对解码输出做残差精修。语音克隆关键参数spk_embed_dim: 256与 GE2E 输出维度一致、spk_embed_integration_type: concat说话人 Embedding 以拼接方式与编码器输出融合对应源码中voice_cloning.py将 256 维spk_emb直接传入声学模型推理。正则化Transformer 编码器/解码器的 dropout 均为 0.2encoder_normalize_before/decoder_normalize_before为 True层归一化置于子层之前初始化方式init_type: xavier_uniform。优化器与训练设置optimizer: optim: adam, learning_rate: 0.001updater.use_masking: True损失计算对 padding 部分做掩码max_epoch: 200、num_snapshots: 5最多保留 5 个快照seed: 10086随机种子保证可复现。训练完成后checkpoint 保存在${train_output_path}/checkpoints/目录下run.sh中的ckpt_name即指向其中的某个snapshot_iter_*.pdz文件。批量合成从 metadata.jsonl 到波形./local/synthesize.sh调用${BIN_DIR}/../synthesize.py即paddlespeech/t2s/exps/synthesize.py作用是根据测试集的metadata.jsonl批量合成语音CUDA_VISIBLE_DEVICES${gpus} ./local/synthesize.sh ${conf_path} ${train_output_path} ${ckpt_name}脚本内容见 synthesize.shpython3 ${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.txt \ --voice-cloningTrue该步骤同样需要--voice-cloningTrue合成时模型从测试集音频实时提取说话人 Embedding 作为条件输出波形保存到${train_output_path}/test/。--am_ckpt指向训练得到的 FastSpeech2 快照--voc_*指向预训练的 PWG 声码器及其频谱归一化统计量。语音克隆推理用参考音频克隆任意说话人推理入口语音克隆是 vc1 的最终目的给定若干参考音频./ref_audio模型提取其中的音色并合成指定文本。假设参考音频目录结构为ref_audio ├── 001238.wav ├── LJ015-0254.wav └── audio_self_test.mp3执行CUDA_VISIBLE_DEVICES${gpus} ./local/voice_cloning.sh ${conf_path} ${train_output_path} ${ckpt_name} ${ge2e_params_path} ${ref_audio_dir}脚本内容见 voice_cloning.sh默认合成文本为凯莫瑞安联合体的经济崩溃迫在眉睫。输出到${train_output_path}/vc_syn/每个参考音频对应一个${utt_id}.wav。底层实现剖析voice_cloning.sh调用paddlespeech/t2s/exps/voice_cloning.py见 voice_cloning.py其推理链路可拆解为四步说话人 Embedding 提取默认使用 GE2E 编码器——SpeakerVerificationPreprocessor对参考音频做 16kHz 重采样、VAD 预处理与 40 维 mel 部分片段提取再由LSTMSpeakerEncoder.embed_utterance得到 256 维spk_emb对应--ge2e_params_path加载的参数。源码同时预留了--use_ecapa开关可切换为 ECAPA-TDNN 说话人编码器经VectorExecutor调用。文本前端Frontend(phone_vocab_pathargs.phones_dict)将输入文本转为音素 id 序列phone_ids支持中文 g2p。声学模型推理get_am_inference(amfastspeech2_aishell3, ...)加载 FastSpeech2am_inference(phone_ids, spk_embspk_emb)以音素序列 说话人 Embedding为输入输出梅尔频谱。声码器推理voc_inference(...)用 PWG 将频谱还原为波形以am_config.fs24000Hz为采样率写出 wav。推理时声学模型对 Embedding 完全开放——无论参考音频来自哪个说话人甚至训练集之外的说话人模型都能依据该 Embedding 合成对应音色的语音这正是零样本语音克隆的核心机制。预训练模型与效果官方提供了 vc1 任务的预训练 FastSpeech2 模型fastspeech2_nosil_aishell3_vc1_ckpt_0.5.zip解压后包含fastspeech2_nosil_aishell3_ckpt_vc1_0.5 ├── default.yaml # 训练 fastspeech2 的默认配置 ├── phone_id_map.txt # 音素词典训练时生成 ├── snapshot_iter_96400.pdz # 模型参数与优化器状态 └── speech_stats.npy # 频谱归一化统计量注意语音克隆模式下不需要speaker_id_map.txt说话人词典因为说话人信息由 GE2E 的连续 Embedding 承载而非离散 id。官方给出的参考训练结果如下来自 READMEModelStepeval/losseval/l1_losseval/duration_losseval/pitch_losseval/energy_lossdefault2(gpu) x 964000.996990.620130.0530570.119540.20426其中duration_loss、pitch_loss、energy_loss分别对应 FastSpeech2 三个预测器的监督损失l1_loss为频谱重构损失可在训练日志中对照监控训练是否收敛。小结与延伸vc1 示例完整呈现了说话人验证迁移到 TTS的工程化实现GE2E 提供可迁移的说话人表征FastSpeech2 借助spk_embed条件输入实现多说话人乃至零样本合成PWG 负责高质量波形还原。若需继续深入可依次阅读说话人编码器训练examples/other/ge2e标准多说话人 TTS无语音克隆examples/aishell3/tts3声码器训练examples/aishell3/voc1语音克隆推理核心代码voice_cloning.py赞分享人工智能语音音频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 音色克隆Voice Cloning实战指南从说话人编码到语音合成PaddleSpeech 音色克隆Voice Cloning实战指南从说话人编码到语音合成 本文围绕 PaddleSpeech 仓库中 paddlespe人工智能语音音频NLP媒体生成实时语音克隆CorentinJ/Real-Time-Voice-Cloning实时语音克隆CorentinJ/Real Time Voice Cloning 在深入探讨此项目之前先给出它的官方链接。这是一个由CorentinJ开发的人工智能语音深度学习Real-Time Voice Cloning Web界面开发基于Flask的语音克隆应用Real Time Voice Cloning Web界面开发基于Flask的语音克隆应用 引言语音克隆技术的Web化挑战 你是否曾想过将实时语音克隆技术集人工智能语音深度学习上一篇如何用茉莉花插件实现Zotero中文文献管理效率翻倍终极解决方案下一篇GTA5线上小助手终极指南免费开源工具轻松称霸洛圣都创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表