ARTICLE DETAIL

资讯详情

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

VCTK 多说话人语音合成实战:基于 fairseq S² 工具包的 Transformer TTS 全流程指南

VCTK 多说话人语音合成实战:基于 fairseq S² 工具包的 Transformer TTS 全流程指南 VCTK 多说话人语音合成实战基于 fairseq S² 工具包的 Transformer TTS 全流程指南【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilmVCTK 是 open 的多说话人英语语音语料库本指南基于 fairseq S²Speech Synthesis工具包完整讲解从 VCTK 原始音频到 Transformer TTS 模型训练、推理与自动评估的端到端流程。读完本文你将掌握音频 manifest 生成、基于信号处理的去噪与 VAD 清洗、基于 ASR 的 CER 样本过滤、log-Mel 特征提取与配置生成以及 MCD/CER 等指标驱动的模型开发闭环。本文是 VCTK 示例文档 的深度扩展与之配套的 LJSpeech 单说话人示例 与 Common Voice 示例 分别覆盖了单说话人与其他多说话人场景可相互参照。1. 任务概览在 VCTK 上构建多说话人 TTSVCTKCSTR VCTK Corpus是爱丁堡大学发布的 open 英语语音语料库包含超过 100 位不同口音说话人的朗读语音因此天然适合训练多说话人语音合成模型。fairseq S² 工具包论文 arXiv:2109.06912参见 speech_synthesis 总览提供了完整的语音合成流水线自回归Transformer TTS与非自回归FastSpeech 2模型面向多说话人合成的 speaker embedding 支持面向低质量控制数据如众包语料的去噪、VAD 等音频预处理用于模型迭代的自动评估指标ASR 的 WER/CER、信号级的 MCD/MSD、韵律相关的 F0 指标与 S2T语音到文本一致的轻量数据配置格式config.yaml TSV manifest。VCTK 示例的整体流水线如下本文按此顺序展开VCTK 原始音频 │ get_vctk_audio_manifest ▼ 音频 manifesttrain/dev/test 切分 │ denoise_and_vad_audio可选清洗 ▼ 处理后的音频 manifest含 SNR 列 │ ASR CER 过滤可选eval_asr ▼ 保留的低 CER 样本 │ get_feature_manifest--ipa-vocab --use-g2p ▼ 特征 manifest config.yaml vocab.txt speakers.txt │ fairseq-train --task text_to_speech ▼ Transformer TTS 模型 → 推理波形 → 自动评估MCD / CER / F02. 数据准备2.1 下载数据、切分并生成音频 manifest首先下载 VCTK 数据集创建数据切分并生成音频 manifestpython -m examples.speech_synthesis.preprocessing.get_vctk_audio_manifest \ --output-data-root ${AUDIO_DATA_ROOT} \ --output-manifest-root ${AUDIO_MANIFEST_ROOT}这一步由 get_vctk_audio_manifest.py 实现其内部逻辑可以从源码确认基于torchaudio.datasets.VCTK读取数据集--output-data-root即-d指向数据存放目录--output-manifest-root即-m指向 manifest 输出目录固定切分策略全部样本先以--seed 1234默认打乱然后划出--n-dev 50个 dev 样本与--n-test 100个 test 样本其余全部归入 train三个切分分别输出${split}.audio.tsvSPLITS [train, dev, test]每个样本的 manifest 记录五列id、audiowav 绝对路径按说话人目录组织、n_frames、tgt_text、speaker、src_text文本会经过normalize_text清洗re.sub(r[^a-zA-Z.?!,\- ], , text)即仅保留英文字母、空格与常见标点剔除多余字符。提示若需自定义切分规模可调整--n-dev、--n-test与--seed默认的 50/100 划分与文档中的结果表Test MCD 3.4对应。2.2 使用信号处理去噪与 VAD 清洗音频VCTK 作为多说话人语料部分录音可能存在环境噪声或首尾静音。fairseq S² 提供基于信号处理而非深度学习语音增强的去噪 VAD语音活动检测预处理脚本for SPLIT in dev test train; do python -m examples.speech_synthesis.preprocessing.denoise_and_vad_audio \ --audio-manifest ${AUDIO_MANIFEST_ROOT}/${SPLIT}.audio.tsv \ --output-dir ${PROCESSED_DATA_ROOT} \ --denoise --vad --vad-agg-level 3 done该命令对应 denoise_and_vad_audio.py运行后会在${PROCESSED_DATA_ROOT}下新建after_denoise/与after_vad/两个子目录分别存放两阶段的产物加载预训练语音增强模型master64()来自preprocessing/denoiser即 Demucs 系列模型对音频去噪并通过--dry-wet 0.01默认控制干湿信号线性插值比例即保留 1% 原始信号以防止过度增强使用 WebRTC VAD依赖webrtcvad需要pip install webrtcvad裁剪首尾与长段静音--vad-agg-level取值范围为 0–3数值越大过滤越激进文档示例用 3VAD 后会重新计算n_frames并计算增强前后信号的 SNR 写入 manifest 新增的snr列如果某样本 VAD 后长度小于MIN_T 0.05秒即不足 50ms 有效语音会被直接跳过并打印 WARNING——这类几乎无语音的样本不应进入训练集最终在${PROCESSED_DATA_ROOT}下生成与输入同名的新音频 TSV其audio列指向处理后的文件路径并新增一列 SNR未做 VAD 处理的样本为 -1。需要说明的是--device默认是cpu去噪模型支持cpu | cuda如果样本量较大建议显式传--device cuda加速。2.3 使用 CER 进行样本过滤VCTK 语料中个别样本可能发音与标注文本不一致噪声、口误、字幕错误等会显著拉低 TTS 质量。文档给出的策略是用 ASR 的字符错误率CER做过滤具体做法复用 LJSpeech 示例 的自动评估流程对参考reference音频跑 wav2vec 2.0 ASR需要在get_eval_manifest中加--eval-target使其评估对象是参考音频而非模型合成音频在eval_asr中加--err-unit char把默认的 WER词错误率换成 CER字符错误率——由 eval_asr.py 源码可见--err-unit支持word与char两种单位char模式下逐字符计算编辑距离示例级 CER 会保存为${EVAL_OUTPUT_ROOT}/uer_cer.${SPLIT}.tsv——从源码看该文件含三列id、audio、uer其中uer即 utterance error rate取值保留 4 位小数。# 先按 ljspeech_example.md 生成评估 manifesteval-target 指向参考音频 python -m examples.speech_synthesis.evaluation.get_eval_manifest \ --generation-root ... --audio-manifest ${AUDIO_MANIFEST_ROOT}/${SPLIT}.audio.tsv \ --output-path ${EVAL_OUTPUT_ROOT}/eval_cer_${SPLIT}.tsv \ --eval-target --vocoder griffin_lim --sample-rate 22050 --audio-format flac # 计算字符级错误率 python -m examples.speech_synthesis.evaluation.eval_asr \ --audio-header syn --text-header text --err-unit char --split ${SPLIT} \ --w2v-ckpt ${WAV2VEC2_CHECKPOINT_PATH} --w2v-dict-dir ${WAV2VEC2_DICT_DIR} \ --raw-manifest ${EVAL_OUTPUT_ROOT}/eval_cer_${SPLIT}.tsv \ --asr-dir ${EVAL_OUTPUT_ROOT}/asr_cer注意ASR 模型通常在 16kHz 下工作若原音频采样率不是 16kHz需先在特征/波形阶段重采样参见下文推理与评估章节的 16kHz 说明否则eval_asr会在prepare_w2v_data中断言sr sample_rate。2.4 提取 log-Mel 特征并生成数据配置完成清洗与过滤后提取 log-Mel 频谱特征、生成特征 manifest 与数据配置 YAMLpython -m examples.speech_synthesis.preprocessing.get_feature_manifest \ --audio-manifest-root ${PROCESSED_DATA_ROOT} \ --output-root ${FEATURE_MANIFEST_ROOT} \ --ipa-vocab --use-g2p \ --snr-threshold 15 \ --cer-threshold 0.1 --cer-tsv-path ${EVAL_OUTPUT_ROOT}/uer_cer.${SPLIT}.tsv其中使用了音素输入--ipa-vocab --use-g2p即先把文本转成 IPA 音素序列再进入模型同时按文档设定进行样本过滤SNR 阈值 15、CER 阈值 10%。这条命令对应 get_feature_manifest.py其内部行为可从源码确认特征提取对每个样本做convert_waveform重采样默认--sample-rate 22050可加--normalize-volume做响度归一然后提取 80 维 log-Mel 谱logmelspec80默认--win-length 1024、--hop-length 256、--n-fft 1024、--n-mels 80、--f-min 20、--f-max 8000特征打包为logmelspec80.zip同时计算全局 CMVN 统计量gcmvn_stats.npz用于特征归一化样本过滤--snr-threshold 15表示丢弃snr低于 15 的样本--cer-threshold 0.1结合--cer-tsv-path丢弃 CER 高于 10% 的样本源码会从 CER TSV 读入每个样本的uer并与阈值比较文本归一化在 IPA 模式下normalized_utt ipa_phonemize(normalized_utt, langen-us, use_g2pTrue)即通过 g2p 工具把英文文本转成 IPA 音素串默认--lang en-us产物为每个 split 生成${split}.tsv特征 manifest含id/audio/n_frames/tgt_text/speaker/src_text列、vocab.txt按词频排序的音素词典、speakers.txt说话人列表多说话人时 config 中自动写入speaker_set_filename、以及config.yaml内含sample_rate与features块的完整声学参数如n_mels、n_fft、window_fn: hann、win_len_t/hop_len_t等CMVN 类型为global。说明--cer-threshold仅在--cer-tsv-path存在且文件有效时才生效若无需 CER 过滤可省略这两个参数。另外若样本不足导致过滤后 train split 为空get_feature_manifest会断言失败assert train in args.splits与后续基于 train 生成词典的逻辑因此阈值不宜过严。3. 训练 Transformer TTS 模型VCTK 示例的训练、推理与自动评估步骤与 LJSpeech 示例 完全一致仅数据目录与特征配置不同。以自回归 Transformer TTS 为例fairseq-train ${FEATURE_MANIFEST_ROOT} --save-dir ${SAVE_DIR} \ --config-yaml config.yaml --train-subset train --valid-subset dev \ --num-workers 4 --max-tokens 30000 --max-update 200000 \ --task text_to_speech --criterion tacotron2 --arch tts_transformer \ --clip-norm 5.0 --n-frames-per-step 4 --bce-pos-weight 5.0 \ --dropout 0.1 --attention-dropout 0.1 --activation-dropout 0.1 \ --encoder-normalize-before --decoder-normalize-before \ --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt --warmup-updates 4000 \ --seed 1 --update-freq 8 --eval-inference --best-checkpoint-metric mcd_loss关键点解读--task text_to_speech是 S² 工具包的核心 TTS 任务数据格式与 S2T 保持一致config.yaml TSV manifest训练时读config.yaml获取声学特征参数与说话人列表--criterion tacotron2--arch tts_transformer组合对应 VCTK 结果表中的tts_transformer架构54M 参数--n-frames-per-step 4表示解码器每步预测 4 帧--bce-pos-weight 5.0是停止符位置的 BCE 权重二者是 Tacotron2 风格自回归解码的典型配置--update-freq 8表示以 8 个 mini-batch 累积一次梯度更新用于在单卡上模拟 8 卡训练文档明确提示多卡时需相应调整该值--eval-inference在验证时额外执行解码推理--best-checkpoint-metric mcd_loss指定以验证集 MCD 损失作为选优指标说明从训练一开始就按合成质量而非单纯 loss选 checkpoint。训练收敛后${SAVE_DIR}下会保存一系列checkpoint_*.pt供下一步平均与推理使用。4. 推理平均 checkpoint 并合成波形自回归 TTS 在解码质量上对 checkpoint 选择较敏感官方推荐先平均最后 5 个 epoch 的 checkpoint再用默认的 Griffin-Lim 声码器合成波形SPLITtest CHECKPOINT_NAMEavg_last_5 CHECKPOINT_PATH${SAVE_DIR}/checkpoint_${CHECKPOINT_NAME}.pt python scripts/average_checkpoints.py --inputs ${SAVE_DIR} \ --num-epoch-checkpoints 5 \ --output ${CHECKPOINT_PATH} python -m examples.speech_synthesis.generate_waveform ${FEATURE_MANIFEST_ROOT} \ --config-yaml config.yaml --gen-subset ${SPLIT} --task text_to_speech \ --path ${CHECKPOINT_PATH} --max-tokens 50000 --spec-bwd-max-iter 32 \ --dump-waveforms运行细节对应 generate_waveform.py 与 LJSpeech 文档说明推理入口直接以特征 manifest 根目录为数据目录--gen-subset test指定合成测试集--spec-bwd-max-iter 32控制 Griffin-Lim 相位恢复的最大迭代次数32 是文档示例值可视为合成质量与速度的折中--dump-waveforms会导出波形文件同时输出特征、注意力图attention plot等可视化产物全部落在${SAVE_DIR}/generate-${CHECKPOINT_NAME}-${SPLIT}目录下若需要为自动评估重合成目标音频即把参考音频也过一遍 vocoder消除声码器带来的系统性失真需加--dump-target当后续 WER/CER 评估使用 16kHz 的 ASR 模型时可在generate_waveform.py上增加--output-sample-rate 16000直接输出 16kHz 波形避免评估前再次重采样。5. 自动评估合成完成后通过 S² 的评估子模块得到客观指标。评估的第一步是生成统一格式的评估清单eval spec——由 get_eval_manifest.py 实现其输出的 TSV 包含id/syn/ref/text/speaker五列其中syn指向合成音频ref指向参考音频后续所有指标脚本都消费这一文件python -m examples.speech_synthesis.evaluation.get_eval_manifest \ --generation-root ${SAVE_DIR}/generate-${CHECKPOINT_NAME}-${SPLIT} \ --audio-manifest ${AUDIO_MANIFEST_ROOT}/${SPLIT}.audio.tsv \ --output-path ${EVAL_OUTPUT_ROOT}/eval.tsv \ --vocoder griffin_lim --sample-rate 22050 --audio-format flac \ --use-resynthesized-target参数含义可从源码确认--generation-root指向推理输出目录--audio-manifest提供样本 id 与文本--use-resynthesized-target表示用重合成的参考音频*_tgt目录作为 ref而非原始录音从而隔离声码器影响、纯粹衡量模型本身的声学预测误差--vocoder griffin_lim、--sample-rate 22050、--audio-format flac决定目录命名flac_22050hz_griffin_lim下的文件查找路径。若使用 16kHz 的 ASR 模型做 WER/CER这里应传--sample-rate 16000并对 eval 清单另存如eval_16khz.tsv。5.1 WER/CER 指标ASR 方案以 wav2vec 2.0 ASR 模型为例模型与词典需按 wav2vec 示例自行准备python -m examples.speech_synthesis.evaluation.eval_asr \ --audio-header syn --text-header text --err-unit char --split ${SPLIT} \ --w2v-ckpt ${WAV2VEC2_CHECKPOINT_PATH} --w2v-dict-dir ${WAV2VEC2_DICT_DIR} \ --raw-manifest ${EVAL_OUTPUT_ROOT}/eval_16khz.tsv --asr-dir ${EVAL_OUTPUT_ROOT}/asr该脚本eval_asr.py的工作流程把 eval 清单转成 wav2vec 2.0 微调audio_finetuning CTC所需的 data 目录含dict.ltr.txt、${split}.tsv、${split}.ltr调用examples.speech_recognition.infer做识别最后基于编辑距离计算逐样本错误率并输出uer_${err_unit}.${split}.tsv。文档在 VCTK 流程中使用--err-unit charCER若想按词评估可省略或显式传--err-unit wordWER。需要留意--audio-header syn与--text-header text对应 eval 清单中的合成音频与文本列而 CER 过滤流程中评估的是参考音频--eval-target时syn列被替换为参考音频路径参见 get_eval_manifest 源码。5.2 MCD / MSD 指标信号级python -m examples.speech_synthesis.evaluation.eval_sp \ ${EVAL_OUTPUT_ROOT}/eval.tsv --mcd --msdeval_sp.py 基于波形做动态时间规整DTW对齐后计算 Mel 倒谱失真MCD与 Mel 谱失真MSD并额外报告插入/删除帧比例--show-bin可按参考时长分段0–200/200–400/.../2000–4000 帧输出分桶统计便于定位长句短句的质量差异。VCTK 结果表中的 Test MCD 3.4 即来自该脚本。5.3 F0 韵律指标python -m examples.speech_synthesis.evaluation.eval_f0 \ ${EVAL_OUTPUT_ROOT}/eval.tsv --gpe --vde --ffeeval_f0.py 提供基频F0层面的韵律评估--gpe基频生成错误率、--vde浊音判定错误率、--ffeF0 帧错误率用于衡量合成语音的音高曲线与参考的吻合程度。6. 复现结果与调参建议VCTK 示例文档给出的官方复现结果为--archParamsTest MCDModeltts_transformer54M3.4见原文档结果表下载链接对比 LJSpeech 结果表同架构 54M、Test MCD 3.8VCTK 多说话人设置下 MCD 反而更低3.4说明该 Transformer TTS 对多说话人语料的声学拟合同样有效。若要复现该数字需完整执行本文的流水线按 2.1 生成默认切分50 dev / 100 test的 manifest按 2.2 做去噪 VAD--vad-agg-level 3按 2.3 用 ASR 计算 CER 并保存uer_cer.*.tsv按 2.4 以--ipa-vocab --use-g2p --snr-threshold 15 --cer-threshold 0.1提取特征这组过滤阈值与结果表严格对应按第 3 节训练至 20 万步单卡配--update-freq 8按第 4 节平均最后 5 个 checkpoint 并合成 test 集按第 5 节用--use-resynthesized-target的 eval 清单计算 MCD。实际复现时的常见调参点VAD 激进等级0–3决定清洗强度过高会裁掉短样本触发MIN_T跳过警告过低则残留静音SNR/CER 阈值需结合语料质量权衡阈值过严会显著减少训练样本--update-freq需按 GPU 数量反比调整以保持等效 batch size多说话人场景下确保config.yaml含speaker_set_filename特征提取脚本在说话人数量 1 时自动写入训练与推理阶段均会据此区分说话人。7. 小结围绕 VCTK 多说话人 TTSfairseq S² 提供了一条完整、可复现且指标可追踪的开发链路get_vctk_audio_manifest负责数据切分denoise_and_vad_audio负责粗质量音频清洗eval_asr提供 CER 级样本过滤get_feature_manifest输出音素 log-Mel 特征及配置fairseq-train训练 Transformer TTSgenerate_waveform完成推理eval_asr/eval_sp/eval_f0从 ASR、信号、韵律三个维度量化合成质量。对于想迁移到其他多说话人语料的读者Common Voice 示例 提供了面向更大规模、更低质量众包语料的扩展思路可直接对照本文流水线复用。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表