资讯动态

PaddleSpeech 中使用 Montreal-Forced-Aligner 进行音素级强制对齐的完整实战指南

发布时间:2026/9/25 5:44:17 来源:尧图企业网站定制
人工智能语音音频【免费下载链接】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 仓库中的 MFA 示例 为主体系统讲解如何借助 Montreal-Forced-AlignerMFA 1.x为中文CSMSC/BZNSYP Baker 语料与粤语语料生成音素级强制对齐结果从数据重组、拼音/粤拼词表生成、OOV 检测到 MFA 训练与对齐的全流程并延伸到韵律标签生成与对齐结果在 TTS 流水线中的下游应用。读完本文你将能独立复现仓库的run.sh/run_canton.sh脚本并为自己的语料定制对齐流程。一、为什么 TTS 训练需要强制对齐在 PaddleSpeech 的诸多 TTS 示例如 examples/csmsc/tts3、examples/csmsc/tts2、examples/csmsc/tts0中训练前端声学模型如 FastSpeech 系列都需要「音频波形 ↔ 音素序列」在时间轴上的对应关系。这种音素级时间对齐信息通常以 TextGrid 格式保存正是蒙特利尔强制对齐工具Montreal Forced Aligner的产物。PaddleSpeech 官方为 CSMSC 语料直接提供了现成的对齐结果下载baker_alignment_tone.tar.gz同时也明确推荐用户参考本仓库的 MFA 示例 自行训练对齐模型。本文即围绕该示例展开。二、一键运行从零开始的中文对齐流程仓库在 examples/other/mfa/run.sh 中封装了完整的 MFA 1.x 使用流程用户只需一条命令即可启动./run.sh脚本内部按顺序完成四件大事且每步都做了「结果存在即跳过」的幂等保护通过if [ ! -f ... ]/if [ ! -d ... ]判断重复运行不会重复计算生成拼音-音素词表local/generate_lexicon.py产物为exp/simple.lexicon与exp/simple.symbols重组 Baker 语料local/reorganize_baker.py产物为exp/baker_corpus/音频 同名.lab转写OOV 检测local/detect_oov.py对照词表检查语料中转写是否越界下载并解压 MFA 1.0.1 Linux 版调用mfa_train_and_align训练并产出exp/baker_alignment/TextGrid 对齐结果与exp/baker_model/对齐模型。默认参数方面词表名LEXICON_NAMEsimpleMFA 安装目录固定为local/Baker 语料根目录假定在~/datasets/BZNSYP输出目录为exp/与data/。以下各节逐一拆解每个环节。三、数据重组把 Baker 语料整理成 MFA 要求的目录结构MFA 对语料的组织有明确要求参考其官方 data_prep 文档每个语料目录下音频文件与同名扩展名不同的转写文件.lab一一对应。Baker 原始数据集BZNSYP的转写文本位于ProsodyLabeling/000001-010000.txt其格式为「每两句一组第一行是句子 ID第二行是转写文本」。local/reorganize_baker.py 的reorganize_baker()函数完成三项核心工作读取ProsodyLabeling/000001-010000.txt按「隔行取 ID、隔行取转写」的方式解析出{sentence_id: transcription}字典get_transcripts()遍历Wave/目录下的全部.wav默认直接复制若传入--resample-audio则使用 librosa 加载后以 16kHz 采样率重采样并写成 PCM_16 格式resample_and_save()sr16000并使用ThreadPoolExecutor并发处理以加速为每个句子 ID 写出同名.lab文件内容为对应转写文本。注意脚本的assert wave_dir ! output_dir断言严禁把输出目录设置成原始音频所在的Wave/目录否则会破坏源数据。脚本还支持--rhy-with-duration选项用于韵律标签场景见第六节。调用方式python local/reorganize_baker.py --root-dir~/datasets/BZNSYP --output-dir$exp/baker_corpus --resample-audio四、词表生成为中文拼音构建 MFA 音素词典MFA 训练/对齐需要一份「词 → 音素序列」的词典。local/generate_lexicon.py 从零生成这份词典其设计文档字符串中明确了两点关键约定词表以「音节」为单位而非「词」因为reorganize_baker.py产出的转写本身就是音节序列选择音节粒度是为了更好地复用 pypinyin 等中文 G2P 工具这符合中文 G2P 的惯例。脚本定义了 21 个声母INITIALS如b p m f ... zh ch sh r z c s j q x、39 个韵母FINALS含ii/iii区分舌尖元音以及两个特殊符号sil静音与sp短停顿。核心函数rule(C, V, R, T)按汉语拼音正字法逐条过滤并拼写音节规则包括但不限于ii只能与z c s相拼iii只能与zh ch sh r相拼齐齿呼/撮口呼以i/v开头不能与f g k h zh ch sh r z c s相拼撮口呼v系只能与j q x n l等相拼b p m f不能与合口呼除u外及撮口呼相拼er只能单独成音节ueng除weng外均写作ong零声母时按规则补出y/w/yu等拼写j q x与v拼时把v改写为uiou/uei/uen缩略为iu/ui/un儿化--with-r开启时不允许对已以r结尾的音节再次儿化。generate_lexicon()遍历声母×韵母×儿化×声调四重组合把合法音节映射为「声母 韵母 儿化 r声调 1-5」的音素串generate_symbols()则汇总所有出现的音素与sil/sp输出.symbols文件。命令行参数为python local/generate_lexicon.py $exp/simple --with-r --with-tone--with-r表示考虑儿化--with-tone表示考虑声调1-5二者在 run.sh 中默认开启。若开启--rhy-with-duration脚本还会额外写入sp1 sp1、sp2 sp2、sp3 sp3、sp4 sp4四行对应第四级韵律边界停顿见第六节。五、OOV 检测对齐前把「词典外」风险排查干净强制对齐的成功率高度依赖转写是否全部落在词表内。local/detect_oov.py 提供了一次快速的越界扫描python local/detect_oov.py $exp/baker_corpus $exp/simple.lexicon其实现是把.lexicon逐行读入OrderedDict然后遍历语料目录下所有*.lab可用--pattern自定义把每个转写按空格切分为音节并逐一查表凡是不在词表中的音节都会通过logging.warning输出「某文件含 OOV 某音节」的告警。脚本的日志注释也提示如果出现非预期的 OOV建议回头重新生成词表例如补音节、调整声调/儿化选项。六、MFA 训练与对齐核心命令详解run.sh 下载的是 MFA v1.0.1 的 Linux 预编译包存于local/montreal-forced-aligner_linux.tar.gz解压后通过环境变量注入bin/与lib/export PATH$MFA_DOWNLOAD_DIR/montreal-forced-aligner/bin PATH$MFA_DOWNLOAD_DIR/montreal-forced-aligner/bin/:$PATH \ LD_LIBRARY_PATH$MFA_DOWNLOAD_DIR/montreal-forced-aligner/lib/:$LD_LIBRARY_PATH \ ./$MFA_DOWNLOAD_DIR/montreal-forced-aligner/bin/mfa_train_and_align \ $exp/baker_corpus $exp/simple.lexicon $exp/baker_alignment \ -o $exp/baker_model --clean --verbose -j 10 --temp_directory $exp/.mfa_train_and_alignmfa_train_and_align各参数含义如下参数作用位置参数 1语料目录已重组的 Baker 语料音频 .lab转写位置参数 2词典上一节生成的simple.lexicon位置参数 3输出目录baker_alignment存放逐句 TextGrid 对齐结果-o训练好的对齐模型输出路径baker_model后续可直接复用--clean清理该任务的临时/中间产物后重新开始--verbose输出详细日志-j 10并行度设置为 10 个进程--temp_directory指定临时工作目录避免污染默认位置仓库在examples/aishell3/ernie_sat/README.md等文档中给出了完全相同的下载、解压与lib/环境配置方式可交叉印证这一流程的通用性。七、韵律标签让对齐结果携带韵律停顿信息标准对齐只给出音素时间边界而韵律prosody信息对自然度提升至关重要。README 指出如需在 MFA 结果中获得带时长的韵律标签可在 run.sh 前两个命令词表生成与语料重组中追加--rhy-with-duration标志。其背后实现链路如下reorganize_baker.py的--rhy-with-duration分支先调用normalize_rhy()读取 Baker 原始ProsodyLabeling/000001-010000.txt其中转写行内含#1/#2/#3/#4韵律标记insert_rhy()逐词定位#位置、剔除标记号后将停顿位置还原为sp1~sp4插入词序列写出新的000001-010000_rhy.txt重组时读取带韵律的转写版本rhy_durTrue时使用_rhy.txt得到含sp1~sp4的.labgenerate_lexicon.py的--rhy-with-duration分支在.lexicon中补充sp1 sp1、sp2 sp2、sp3 sp3、sp4 sp4四个条目保证韵律标记也在词表内、可被 MFA 正常建模对齐。README 特别声明两点约束目前仅 CSMSCBaker数据集支持该韵律标签模式且由于 MFA 的约定韵律标签中的#被替换为sp即#1→sp1等使用时需注意与其它标注体系的对应关系。八、粤语扩展用 ToJyutping 与 MFA 对齐粤语语料README 的另一大主题是粤语支持先下载两个公开粤语数据集Guangzhou_Cantonese_Scripted_Speech_Corpus_Daily_Use_Sentence与Guangzhou_Cantonese_Scripted_Speech_Corpus_in_Vehicle置于~/datasets/下然后运行./run_canton.shlocal/generate_canton_lexicon_wavlabs.py 一次性完成「重组语料 生成粤拼词表」两件事遍历两个数据集的UTTRANSINFO.txt/UTTERANCEINFO.txt依据目录名自动选择文件名逐行解析出wav_name / spk / text过滤掉含拉丁字母或长度过短的文本len(text) 2且纯汉字把音频复制为按说话人分组的wavlabs/spk/xxx.wav对每句文本调用ToJyutping的get_jyutping_text()生成粤拼转写写入同名.lab汇总全部粤拼音节去重排序后写入词表get_lines()依据脚本内置的粤语音节表INITIALS列表如aa aai aak ... gw g ... j z c把音节切分为「声母 韵母」两列音素无匹配时整音节作为单音素输出。run_canton.sh随后走与中文相同的 MFA 下载、解压、环境配置流程调用mfa_train_and_align产出exp/canton_alignment/对齐结果与exp/canton_model/模型。注意两个差异粤语词表名为canton且训练输入目录是脚本生成的exp/canton_wavlabs而非原始数据集路径。九、更多语料重组模板AISHELL-3、VCTK 与 LJSpeechlocal/目录还提供了三个可复用的重组脚本实现思路一致、细节各异reorganize_aishell3.py从 AISHELL-3 的train/、test/子集读取content.txt每行「音频ID\t汉字 拼音...」按说话人wav_id 前 7 位分组建立软链接os.symlink并可用--script-type选择输出「汉字级word」或「拼音级pinyin」的.labreorganize_vctk.py处理 VCTK-Corpus-0.92从wav48_silence_trimmed/中只取mic2通道注释说明 mic1 含低频噪声重命名为去_mic2后缀的.wav并重采样至 16kHz同时显式跳过p315无转写与p280、p362无 mic2三个说话人reorganize_ljspeech.py解析 LJSpeech-1.1 的metadata.csv|分隔末列为原始文本按wavs/下的说话人目录建立软链接并写出.lab。它们共同说明了一个模式把任意语料「音频 空格分隔词序列的 .lab 转写」组织成 MFA 目录约定是接入对齐流程的第一步。十、对齐结果的下游使用对齐产物baker_alignment或带韵律的baker_alignment_tone在仓库 TTS 示例中被直接消费。以 examples/csmsc/tts3 为例README 说明用户既可直接下载官方提供的baker_alignment_tone.tar.gz也可按本 MFA 示例自行训练训练前的 preprocess.sh 通过--inputdir./baker_alignment_tone把 TextGrid 对齐结果转成训练所需的时长标注。同样的模式出现在 tts0、tts2 以及examples/aishell3/ernie_sat粤语/跨语种 TTS等示例中可见MFA 对齐质量直接决定了前端声学模型FastSpeech 类的时长预测与合成自然度上限。十一、实操注意事项小结目录不可冲突重组脚本的--output-dir严禁指向原始音频目录Wave/词表要全覆盖先跑detect_oov.py发现 OOV 应回头调整--with-r/--with-tone或补词采样率统一推荐--resample-audio统一到 16kHz避免 MFA 在混合采样率语料上出问题韵律模式有限定--rhy-with-duration目前仅 CSMSC 语料可用且#标记会被替换为sp环境变量mfa_train_and_align依赖bin/PATH与lib/LD_LIBRARY_PATH正确注入MFA v1.0.1 为脚本验证过的版本粤语前置粤语流程需要先手动安装 Python 依赖ToJyutping并下载两个广州粤语数据集到~/datasets/。通过本文你可以完整复现 PaddleSpeech 的 MFA 对齐管线并把同样的「重组语料 → 生成词表 → OOV 检查 → 训练对齐」四步法迁移到自己的中文、粤语乃至其它语种语料上为 FastSpeech 等 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点击查看免费下载相关推荐Montreal Forced Aligner 使用教程Montreal Forced Aligner 使用教程 项目介绍 Montreal Forced AlignerMFA是一个使用Kaldi进行语音数据集强语音音频人工智能突破语音对齐瓶颈Montreal-Forced-Aligner发音词典全攻略含避坑指南突破语音对齐瓶颈Montreal Forced Aligner发音词典全攻略含避坑指南 你是否还在为语音对齐时的OOVOut of Vocabulary语音音频人工智能NeMo Forced AlignerNFA实战指南基于 CTC 模型的 Token / 词 / 语句级语音时间戳对齐NeMo Forced AlignerNFA实战指南基于 CTC 模型的 Token / 词 / 语句级语音时间戳对齐 NFANeMo Forced A人工智能语音音频大模型深度学习上一篇EatFit集成实战如何把Google Fit风格动画组件轻松嵌入你的iOS健康App下一篇新手必看DPT-Hybrid-MiDaS单目深度估计环境搭建与推理代码逐行解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑