尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PaddleSpeech 语音克隆系列:深入解析 FastSpeech2 vc2_infer 说话人嵌入(Speaker Embedding)提取模块

PaddleSpeech 语音克隆系列:深入解析 FastSpeech2 vc2_infer 说话人嵌入(Speaker Embedding)提取模块 人工智能语音音频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.t2s.exps.fastspeech2.vc2_infer模块承担着关键的第一步为每条音频计算 utterance 级别的说话人嵌入speaker embedding作为 FastSpeech2 声学模型的额外条件输入。本文以该模块为核心结合 examples/aishell3/vc2 的完整语音克隆示例讲解其命令行用法、内部实现原理以及它如何与 ECAPA-TDNN 说话人编码器、FastSpeech2 合成器和 Parallel WaveGAN 声码器协同工作。读完本文你将掌握为任意语音数据集批量提取说话人嵌入的完整方法并能独立跑通 AISHELL-3 的 VC2 语音克隆全流程。一、模块定位VC2 语音克隆流水线的第一步VC2Voice Cloning 2示例在 examples/aishell3/vc2/README.md 中阐述了其技术路线借鉴《Transfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis》的思想将说话人验证Speaker Verification中训练出的说话人编码器迁移到多说话人 TTS 任务中。整体分为三步Speaker Encoder使用说话人验证任务训练一个说话人编码器采用 ECAPA-TDNN参考 examples/voxceleb/sv0该阶段不需要文本标注可以使用更多数据集Synthesizer用训练好的说话人编码器为 AISHELL-3 中每个句子生成说话人嵌入该嵌入作为 FastSpeech2 的额外输入与编码器输出拼接concatVocoder使用 Parallel WaveGAN 作为神经声码器将声学特征合成为最终波形。而vc2_infer模块正是第二步中为每个句子生成说话人嵌入的批量推理入口。其 API 文档见 docs/source/api/paddlespeech.t2s.exps.fastspeech2.vc2_infer.rst核心实现位于 paddlespeech/t2s/exps/fastspeech2/vc2_infer.py。二、命令行参数详解一个批量嵌入提取工具vc2_infer.py通过argparse定义了四个参数整体定位是一个输入音频目录 → 输出嵌入目录的批处理工具参数类型默认值说明--inputstr必填存放音频文件的文件夹路径--patternstr*.wav用于过滤音频文件的通配模式--outputstr必填说话人嵌入结果的保存目录--num-cpuint1并行处理的进程线程数示例用法来自 examples/aishell3/vc2/local/preprocess.sh 的 stage 0python3 ${BIN_DIR}/vc2_infer.py \ --input~/datasets/data_aishell3/train/wav/ \ --outputdump/embed \ --num-cpu20几点值得注意的细节--pattern默认只匹配*.wav如果需要处理其他格式如.flac、.mp3需要显式指定例如--pattern*.flac--num-cpu虽然名字含 cpu但从源码看实际使用ThreadPoolExecutor实现多线程并行详见下文适合在单机多核环境提升吞吐--output目录不存在时会自动递归创建无需手动mkdir。三、内部实现原理从源码看处理流程阅读 vc2_infer.py 的main()与_process_utterance()可以梳理出完整的处理链路3.1 目录递归扫描与目录结构保持input_dir Path(args.input).expanduser() ifpaths list(input_dir.rglob(args.pattern)) print(f{len(ifpaths)} utterances in total)输入目录使用rglob递归扫描支持子目录嵌套。输出时通过relative_to保留相对路径关系rel_path ifpath.relative_to(input_dir) ofpath (output_dir / rel_path).with_suffix(.npy) ofpath.parent.mkdir(parentsTrue, exist_okTrue)这意味着dump/embed会镜像wav目录的目录结构每条音频对应一个同名.npy文件。这一点在 examples/aishell3/vc2/README.md 中也有明确说明embed 目录与 wav 文件保持相同的文件结构格式为.npy。3.2 核心推理复用 VectorExecutor每条音频的嵌入提取并非在模块内重复实现而是复用了说话人验证Speaker Verification的 CLI 执行器from paddlespeech.cli.vector import VectorExecutor vec_executor VectorExecutor() embed vec_executor(audio_fileifpath, force_yesTrue) np.save(ofpath, embed)从 paddlespeech/cli/vector/infer.py 可以看到VectorExecutor的默认模型为ecapatdnn_voxceleb12即基于 VoxCeleb1/2 训练的ECAPA-TDNN说话人编码器。这正是 VC2 方案与早期 GE2E 方案的关键区别VC2本模块使用 ECAPA-TDNN 说话人编码器输出192 维说话人嵌入VC1旧方案使用 GE2E 的LSTMSpeakerEncoder输出 256 维嵌入。维度差异在配置层面对应 examples/aishell3/vc2/conf/default.yaml 中的spk_embed_dim: 192。3.3 Warm-up 与多线程并行# warm up vec_executor(audio_fileifpaths[0], force_yesTrue) if nprocs 1: # 串行 tqdm 进度条 else: with ThreadPoolExecutor(nprocs) as pool: # 提交任务回调更新进度条源码中先对第一条音频执行一次推理作为warm-up目的是提前完成模型加载、参数下载首次运行时force_yesTrue会自动确认下载预训练权重等一次性开销随后nprocs 1时串行处理配合tqdm显示进度nprocs 1时通过ThreadPoolExecutor提交全部任务并用add_done_callback更新进度条。从源码结构看这里的并行粒度是线程级非多进程适合 IO 与推理混合负载的场景。四、在完整语音克隆流水线中的位置vc2_infer是 examples/aishell3/vc2/local/preprocess.sh 数据预处理的第一步stage 0后续各阶段依次为stage 0运行vc2_infer.py生成说话人嵌入到dump/embedstage 1调用 utils/gen_duration_from_textgrid.py 从 MFAMontreal Forced Aligner对齐结果生成durations.txtstage 2调用preprocess.py提取声学特征并通过--spk_emb_dirdump/embed将上一步的嵌入接入特征管线stage 3调用 utils/compute_statistics.py 计算 speech、pitch、energy 的均值方差统计量stage 4调用normalize.py对 train/dev/test 分别做特征归一化并生成 phone/speaker 的 id 映射表。整个预处理完成后dump目录结构如下节选自 examples/aishell3/vc2/README.mddump ├── dev │ ├── norm │ └── raw ├── embed │ ├── SSB0005 │ ├── SSB0009 │ └── ... ├── phone_id_map.txt ├── speaker_id_map.txt ├── test │ ├── norm │ └── raw └── train ├── energy_stats.npy ├── norm ├── pitch_stats.npy ├── raw └── speech_stats.npy其中embed目录即vc2_infer.py的输出产物。值得注意的是VC2 预处理与 tts3 示例非常相似唯一的差异就是多出 ECAPA-TDNN 推理这一步README 原文there is one more ECAPA-TDNN/inference step here。五、训练与推理说话人嵌入如何接入 FastSpeech25.1 训练阶段训练入口为./local/train.sh与 tts3 训练几乎一致但需要在调用train.py时显式设置--voice-cloningTrue。此时 FastSpeech2 将把spk_embed_dim192的说话人嵌入与编码器输出做拼接spk_embed_integration_type: concat从而在解码时保留目标说话人的音色特征。5.2 语音克隆推理阶段examples/aishell3/vc2/local/voice_cloning.sh 展示了零样本zero-shot克隆的完整命令python3 ${BIN_DIR}/../voice_cloning.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 \ --text凯莫瑞安联合体的经济崩溃迫在眉睫。 \ --input-dir${ref_audio_dir} \ --output-dir${train_output_path}/vc_syn \ --phones-dictdump/phone_id_map.txt \ --use_ecapaTrue在 paddlespeech/t2s/exps/voice_cloning.py 中可以看到与 vc2_infer 完全同源的嵌入提取逻辑--use_ecapaTrue时创建VectorExecutor()并逐条对参考音频执行vec_executor(audio_fileref_audio_path, force_yesTrue)得到 192 维嵌入--use_ecapaFalse时回退到 GE2E 方案SpeakerVerificationPreprocessor预处理 LSTMSpeakerEncoder输出 256 维嵌入推理链路为voc_inference(am_inference(phone_ids, spk_embspk_emb))即前端文本转音素 id → FastSpeech2 条件合成 → PWG 声码器出波形。换句话说vc2_infer.py 与 voice_cloning.py 共享同一套说话人嵌入计算方式前者面向训练集批量离线提取后者面向推理时对任意参考音频在线提取。两者的输出在数学上是一致的都来自 ECAPA-TDNN 的 192 维嵌入这正是训练与推理嵌入口径一致的保证。六、运行完整示例从零到语音克隆参考 examples/aishell3/vc2/run.sh完整流程由四个 stage 组成stage脚本功能0./local/preprocess.sh说话人嵌入提取 时长/特征提取 统计量 归一化1./local/train.sh训练 FastSpeech2--voice-cloningTrue2./local/synthesize.sh从metadata.jsonl合成验证波形3./local/voice_cloning.sh基于参考音频的零样本语音克隆推理前置条件数据集解压至~/datasets/data_aishell3MFA 对齐结果放在./aishell3_alignment_tone下载 PWG 预训练权重pwg_aishell3_ckpt_0.5.zip并解压到当前目录。执行# 一键跑完全流程 ./run.sh # 或只跑数据预处理即包含 vc2_infer 的阶段 0 ./run.sh --stage 0 --stop-stage 0其中--stage 0 --stop-stage 0即触发 preprocess.sh 中调用vc2_infer.py的第一步输出位于dump/embed。若需单独微调嵌入提取参数如音频过滤模式、并行度直接修改该处命令即可。七、关键配置文件解读examples/aishell3/vc2/conf/default.yaml 是与 VC2 配套的 FastSpeech2 配置与说话人嵌入直接相关的核心项model: spk_embed_dim: 192 # speaker embedding dimension spk_embed_integration_type: concat # speaker embedding integration typespk_embed_dim: 192必须与 ECAPA-TDNN 编码器输出的维度一致这也是 VC2 与 GE2E 方案256 维的根本差异spk_embed_integration_type: concat说话人嵌入以拼接方式融入编码器输出。其余声学特征相关配置fs: 24000、n_fft: 2048、n_shift: 300、n_mels: 80、f0min/f0max等与 tts3 保持一致说明 VC2 仅改变了说话人信息的注入方式不改动特征提取管线。八、预训练模型与快速验证VC2 提供官方预训练模型fastspeech2_aishell3_ckpt_vc2_1.2.0.zip包含default.yaml、energy_stats.npy、phone_id_map.txt、pitch_stats.npy、speech_stats.npy与snapshot_iter_96400.pdz。注意其 checkpoint不包含speaker_id_map.txt——这正是 VC2 与普通多说话人 TTS 的差异VC2 不需要预定义的说话人 id说话人身份完全由参考音频的嵌入动态决定从而支持对任意新说话人的零样本克隆。官方模型报告的训练指标2 GPU × 96400 stepeval/loss 0.991855、eval/l1_loss 0.599517、eval/duration_loss 0.052142、eval/pitch_loss 0.094877、eval/energy_loss 0.245318。九、小结vc2_infer模块虽然代码量不大却是 VC2 语音克隆方案承上启下的关键一环承上将说话人验证任务SV中训练的 ECAPA-TDNN 编码器复用到 TTS 任务实现验证模型 → 合成模型的迁移学习启下为 FastSpeech2 提供 192 维说话人嵌入条件使声学模型在保持文本内容的条件下还原目标说话人音色工程上目录镜像输出、warm-up、线程池并行等设计使其可直接嵌入大规模数据集预处理脚本。对于希望深入源码的读者推荐按此顺序阅读vc2_infer.py嵌入批量提取→ cli/vector/infer.pyECAPA-TDNN 执行器→ exps/voice_cloning.py零样本克隆推理→ examples/aishell3/vc2/local/preprocess.sh流水线串联。赞分享人工智能语音音频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 模块与多说话人 TTS 调用链PaddleSpeech 语音克隆推理实战深入解析 voice_cloning 模块与多说话人 TTS 调用链 导读 本文围绕 PaddleSpeech 仓库人工智能语音音频多说话人语音合成Retrieval-based-Voice-Conversion-WebUI说话人嵌入技术解析多说话人语音合成Retrieval based Voice Conversion WebUI说话人嵌入技术解析 引言语音合成技术的革命性突破 你是否曾经想过人工智能AI 应用语音音频深度学习PaddleSpeech 声纹识别Speaker Verification实战从音频中提取说话人嵌入并进行相似度打分PaddleSpeech 声纹识别Speaker Verification实战从音频中提取说话人嵌入并进行相似度打分 声纹识别Speaker Verif人工智能语音音频上一篇《金融机器学习进阶》开源项目Python实战金融数据科学的完整指南下一篇SmartDNS配置完全指南从零开始打造极速家庭网络创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表