ARTICLE DETAIL

资讯详情

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

ESPnet 音素级 ASR 实战指南:基于 LibriTTS 与 E-Branchformer 的 IPA+标点转写系统

ESPnet 音素级 ASR 实战指南:基于 LibriTTS 与 E-Branchformer 的 IPA+标点转写系统 人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载导读本文围绕 ESPnet 仓库中 egs2/libritts/asr1 这一音素级 ASRAutomatic Speech Recognition实验配方展开讲解如何基于 LibriTTS 语料构建一个输出为 IPA国际音标音素序列并保留标点的识别系统。该系统的核心设计目标是产出可直接作为基于音素的 TTSPhone-based TTS输入端的转写结果从而将文本grapheme到音素phoneme的转换负担从 TTS 前端迁移到 ASR 后端。读完本文你将掌握音素化数据准备流程、espeak_ng_english_us_vits这一 g2pgrapheme-to-phoneme方案的底层实现原理、E-Branchformer 训练配置的完整参数含义以及该系统的 WER/CER/TER 量化表现。一、系统目标为什么需要音素标点的 ASR 输出该配方在 egs2/libritts/asr1/README.md 中开宗明义本系统的目的是产生适合作为基于音素 TTS 直接输入的输出。这与常规的字素级graphemeASR 有本质区别常规 ASR 输出自然语言文本单词、字词供人阅读或作为语音识别评测基准本配方输出音素序列IPA 符号与标点语义上等价于语音 → 音素转写可直接喂给音素级 TTS 前端避免 TTS 端再做一轮 g2p 转换。从数据流角度看这正是把 TTS 流水线中的 g2p 环节前置到 ASR 中联合解决ASR 学习声学特征 → 音素串含标点的映射而音素串本身就是 TTS 可直接消费的中间表示。因此该模型可视为语音转写speech-to-phoneme transcription专用系统其评测指标WER/CER/TER也全部基于音素序列计算。二、实验环境与依赖原文档记录了该配方的实测环境详见 egs2/libritts/asr1/README.md项目版本Python3.10.8GCC 11.3.1ESPnetespnet 202308PyTorch2.0.1cu118训练硬件A600048 GB× 2 GPU需要特别说明由于本配方依赖 eSpeak NG 进行音素化必须安装相应的 g2p 依赖。从源码看espeak_ng_english_us_vits走的是phonemizer库的espeak后端见下文源码解析小节因此复现前需要确保环境中安装了phonemizer及其 espeak-ng 后端。三、数据处理从 LibriTTS 到音素化训练集3.1 数据下载与目录组织数据准备脚本为 local/data.sh它通过 db.sh 读取LIBRITTS环境变量指定的数据根目录并从www.openslr.org/resources/60下载 LibriTTS 的七个子集dev-clean、dev-other、test-clean、test-othertrain-clean-100、train-clean-360、train-other-500下载完成后在$db_root/LibriTTS/.complete打上标记以避免重复下载。随后stage 0对每个子集调用 local/data_prep.sh 生成 Kaldi 风格数据目录wav.scp、text、utt2spk、spk2gender、spk2utt再用utils/fix_data_dir.sh修复最后调用local/phonemize_dir.py做音素化stage 1用utils/combine_data.sh合并数据——dev由dev-cleandev-other合并train-960由三个训练子集合并合计约 960 小时。local/data_prep.sh 沿用了 LibriTTS 的标准做法以reader_chapter作为说话人粒度utt2spk按章节划分便于按章节计算 CMVN转写文本取自每个 wav 对应的.normalized.txt文件。3.2 音素化核心脚本phonemize_dir.py音素化由 local/phonemize_dir.py 完成其逻辑非常简洁清晰from espnet2.text.phoneme_tokenizer import PhonemeTokenizer tokenizer PhonemeTokenizer(espeak_ng_english_us_vits) with ( open(f{idir}/text, encodingutf-8) as itext, open(f{idir}/text.phn, w, encodingutf-8) as otext, ): for line in itext: utt, text line.strip(\n).split( , maxsplit1) tokens tokenizer.text2tokens(text) text_phn .join(tokens).replace(space, ) otext.write(f{utt} {text_phn}\n) os.replace(f{idir}/text, f{idir}/text.orig) os.replace(f{idir}/text.phn, f{idir}/text)要点拆解使用PhonemeTokenizer(espeak_ng_english_us_vits)将每句英文文本转为音素 token 序列token 序列用.join()拼回字符串再统一把space占位符替换为真实空格从而把词边界还原为空格分隔处理完成后原文本备份为text.orig音素文本正式覆盖text因此训练集、验证集、测试集的text文件都是音素序列ASR 模型学到的是声学特征 → 音素标点的映射。3.3 底层 g2pespeak_ng_english_us_vits 的实现PhonemeTokenizer定义于 espnet2/text/phoneme_tokenizer.pyespeak_ng_english_us_vits分支位于该文件约 L598-L610elif g2p_type espeak_ng_english_us_vits: # VITS official implementation-like processing # Reference: https://github.com/jaywalnut310/vits self.g2p Phonemizer( languageen-us, backendespeak, with_stressTrue, preserve_punctuationTrue, stripTrue, word_separator , phone_separator, split_by_single_tokenTrue, )从源码结构看该 g2p 方案的关键参数决定了音素化结果的质量backendespeak调用phonemizer库的 eSpeak NG 后端Phonemizer类是对 bootphon/phonemizer 的封装见 espnet2/text/phoneme_tokenizer.py L384-L437内部通过phonemizer.backend.BACKENDS[backend]实例化languageen-us使用美式英语发音规则with_stressTrue保留重音符号——IPA 音素中的主/次重音如 ˈ 与 ˌ对 TTS 韵律至关重要preserve_punctuationTrue保留标点——这正是IPA 标点系统中标点来源标点会被当作独立 token 输出word_separator 、phone_separator、split_by_single_tokenTrue采用 VITS 官方实现类似的处理方式——词边界用空格分隔、音素间不加分隔符、按单 token 拆分拆分时Phonemizer.__call__会把空格替换为space占位符再由phonemize_dir.py统一还原。此外espnet2/text/phoneme_tokenizer.py 的g2p_choices列表L25-L56 附近还提供了g2p_en、pyopenjtalk日语、pypinyin_g2p中文、g2pk韩语、espeak_ng_*多语种等众多方案本配方选用的espeak_ng_english_us_vits正是为英文音素级 TTS 量身定制的一档。四、训练配置详解4.1 入口脚本 run.sh训练入口为 run.sh通过./asr.sh以参数方式注入全部超参数train_settrain-960 valid_setdev test_setstest-clean test-other dev-clean dev-other asr_configconf/train_asr.yaml inference_configconf/decode_asr.yaml ./asr.sh \ --lang en \ --ngpu 2 \ --nbpe 100 \ --max_wav_duration 30 \ --speed_perturb_factors 0.9 1.0 1.1 \ --audio_format flac.ark \ --feats_type raw \ --use_lm false \ --asr_config ${asr_config} \ --inference_config ${inference_config} \ --train_set ${train_set} \ --valid_set ${valid_set} \ --test_sets ${test_sets} \ --lm_train_text data/${train_set}/text \ --bpe_train_text data/${train_set}/text $参数语义如下参数取值作用--lang enen目标语言为英语--ngpu 22双 GPU 分布式训练--nbpe 100100BPE 词表大小 100——由于输出是音素序列词表天然很小100 个 BPE 单元足够覆盖音素标点组合--max_wav_duration 3030秒过滤超过 30 秒的长音频--speed_perturb_factors0.9 1.0 1.1三倍速扰动0.9×/1.0×/1.1×做数据增强--audio_format flac.arkflac.ark音频以 FLAC 编码的 ark 格式存储--feats_type rawraw不预提取特征直接在训练中计算前端特征--use_lm falsefalse不使用外部语言模型音素序列无需 LM 建模--asr_configconf/train_asr.yaml训练配置--inference_configconf/decode_asr.yaml解码配置--bpe_train_textdata/train-960/text在音素化后的训练文本上训练 BPE 模型值得注意的是run.sh末尾的$允许命令行追加参数覆盖默认值这与 ESPnet 所有配方的习惯一致如覆盖--asr_config指向 conf/tuning/train_asr_e_branchformer.yaml。4.2 模型结构E-Branchformer 编码器 Transformer 解码器训练配置 conf/tuning/train_asr_e_branchformer.yaml与 conf/train_asr.yaml 内容一致定义了完整的模型与训练方案编码器E-Branchformer——约 1.41 亿参数中的主体encoder: e_branchformer encoder_conf: output_size: 512 attention_heads: 8 attention_layer_type: rel_selfattn pos_enc_layer_type: rel_pos rel_pos_type: latest cgmlp_linear_units: 3072 cgmlp_conv_kernel: 31 use_linear_after_conv: false gate_activation: identity num_blocks: 17 dropout_rate: 0.1 positional_dropout_rate: 0.1 attention_dropout_rate: 0.1 input_layer: conv2d layer_drop_rate: 0.1 linear_units: 1024 positionwise_layer_type: linear macaron_ffn: true use_ffn: true merge_conv_kernel: 31关键参数解读num_blocks: 17、output_size: 512、attention_heads: 817 层、512 维、8 头注意力attention_layer_type: rel_selfattnpos_enc_layer_type: rel_posrel_pos_type: latest使用相对位置编码的 self-attentioncgmlp_linear_units: 3072、cgmlp_conv_kernel: 31、merge_conv_kernel: 31E-Branchformer 特有的卷积门控 MLPConvolution-augmented gMLP分支配置macaron_ffn: true、use_ffn: true启用 Macaron 结构与 FFN 分支input_layer: conv2d输入为 Conv2D 下采样配合下方frontend_conf的 512 点 FFTlayer_drop_rate: 0.1层级丢弃正则化。解码器Transformerdecoder: transformer decoder_conf: attention_heads: 8 linear_units: 2048 num_blocks: 6 dropout_rate: 0.1 positional_dropout_rate: 0.1 self_attention_dropout_rate: 0.1 src_attention_dropout_rate: 0.1 layer_drop_rate: 0.2训练损失与优化model_conf: ctc_weight: 0.6 lsm_weight: 0.1 length_normalized_loss: false frontend_conf: n_fft: 512 hop_length: 160ctc_weight: 0.6CTC 与 attention 的混合训练权重CTC 占 0.6lsm_weight: 0.1标签平滑系数 0.1frontend_conf在线提取 512 点 FFT、hop 160 的滤波器组特征对应 16 kHz 采样率下 10 ms 帧移。训练调度batch_type: numel batch_bins: 10000000 accum_grad: 8 max_epoch: 70 patience: none init: none best_model_criterion: - - valid - acc - max keep_nbest_models: 10 use_amp: true unused_parameters: true optim: adam optim_conf: lr: 0.005 weight_decay: 0.000001 scheduler: warmuplr scheduler_conf: warmup_steps: 40000 specaug: specaug specaug_conf: apply_time_warp: true time_warp_window: 5 time_warp_mode: bicubic apply_freq_mask: true freq_mask_width_range: [0, 27] num_freq_mask: 2 apply_time_mask: true time_mask_width_ratio_range: [0.0, 0.05] num_time_mask: 10batch_type: numelbatch_bins: 10000000按元素数numel动态批大小单 batch 不超过 1000 万元素accum_grad: 8梯度累积 8 步等效放大批大小max_epoch: 70最多训练 70 个 epoch原注释显示在 A6000 × 2 上每 epoch 约 90 分钟best_model_criterion按验证集 accuracy 最大化选择最优模型保留 10 个 n-bestuse_amp: true启用自动混合精度优化器 Adamlr 0.005 WarmupLR40000 步预热SpecAugment 时间/频率掩蔽增强频率掩蔽宽度 0-27、共 2 个时间掩蔽宽度比例为 0-0.05、共 10 个。4.3 模型规模该配方训练出的模型参数量为141.39M约 1.41 亿实验目录名为exp/asr_train_asr_raw_en_bpe100_sp其中rawraw 特征在线前端en_bpe100英语、BPE 词表 100spspeed perturbation三倍速扰动。五、解码配置解码配置见 conf/decode_asr.yamlbeam_size: 15 ctc_weight: 0.2 lm_weight: 0.0 maxlenratio: 0.0 minlenratio: 0.0 penalty: 0.0beam_size: 15beam 搜索宽度 15ctc_weight: 0.2解码时 CTC 与 attention 得分的加权比例与训练权重 0.6 不同解码阶段更依赖 attentionlm_weight: 0.0不集成语言模型与--use_lm false对应maxlenratio/minlenratio: 0.0不限制输出长度比例penalty: 0.0无长度惩罚。最终用于评测的模型为decode_asr_asr_model_valid.acc.ave即验证集 accuracy 最优模型的平均权重average checkpoints。六、评测结果WER / CER / TER音素序列的评测标准覆盖三种错误率WER词错率按空格分隔的音素词计、CER字符错误率按音素符号计、TERtoken 错误率按词表 token 计。以下数据均来自原文档 egs2/libritts/asr1/README.md评测模型为decode_asr_asr_model_valid.acc.ave。6.1 WER词错误率datasetSntWrdCorrSubDelInsErrS.Errdev-clean57369587291.78.00.40.89.167.0dev-other46136957788.510.90.61.212.774.2test-clean48378707891.48.20.40.89.470.4test-other51207254187.012.20.81.114.177.16.2 CER字符错误率datasetSntWrdCorrSubDelInsErrS.Errdev-clean573657071098.40.80.90.62.267.1dev-other461341478197.21.61.21.03.874.2test-clean483753064798.50.70.80.62.270.5test-other512042946396.71.71.61.04.377.16.3 TERToken 错误率datasetSntWrdCorrSubDelInsErrS.Errdev-clean573643354897.61.41.00.63.067.1dev-other461331655096.12.51.41.05.074.2test-clean483740403197.71.40.90.72.970.5test-other512032724895.42.81.81.15.777.1结果解读CER2.2%~4.3%远低于 WER9.1%~14.1%说明错误主要集中于个别音素符号的替换整体音素序列质量很高*-clean与*-other的差距clean vs 噪声/重口音符合 LibriTTS 的难度梯度设定S.Err句子错误率约 67%~77%意味着约三分之一的句子中存在至少一个音素错误——对音素级 TTS 前端而言剩余的错误可通过 TTS 的容错性音素序列已包含重音和标点信息部分消化。该模型对应预训练权重发布在 Hugging Face 的espnet/akreal_libritts_asr_phn模型仓库中可直接加载用于推理或微调可通过 ESPnet 标准模型下载机制espnet_model_zoo/pretrained拉取。七、从源码看该配方的可复用性7.1 g2p 方案可替换espnet2/text/phoneme_tokenizer.py 的g2p_choices列出全部可用 g2p 类型。若想迁移到其他语言只需把 local/phonemize_dir.py 中的PhonemeTokenizer(espeak_ng_english_us_vits)替换为espeak_ng_german、espeak_ng_french、espeak_ng_spanish等多语言 eSpeak NG 后端或替换为g2pk韩语、pyopenjtalk日语、pypinyin_g2p中文等专用方案即可构造任意语言 → 音素级 ASR的配方。7.2 与 TTS 配方的衔接该配方的输出格式空格分隔的 IPA 音素串、含标点与重音与 ESPnet 的 TTS 音素输入约定一致。TTS 侧可通过PhonemeTokenizer完成同样的文本→音素转换见 espnet2/text/build_tokenizer.py L76-L77 对PhonemeTokenizer的构建逻辑实现ASR 输出的音素串 → TTS 输入的无缝对接。这正是 egs2/libritts 同时提供 asr1音素 ASR与 tts1 等配方的深层关联所在。八、复现步骤速览准备数据在 db.sh 中填写LIBRITTS数据根目录运行./run.sh --stage -1 --stop_stage 1完成下载、Kaldi 数据目录生成与音素化训练./run.sh --stage 2 --stop_stage 4按asr.sh默认阶段划分依次为特征/BPE 准备、训练或直接./run.sh走完全流程训练默认使用 conf/train_asr.yaml如需复现文档中的 E-Branchformer 配置可追加--asr_config conf/tuning/train_asr_e_branchformer.yaml解码与评分解码阶段生成decode_asr_*目录使用 ESPnet 标准show_asr_result.sh汇总 WER/CER/TER 结果脚本见 egs2/libritts/asr1/scripts/utils/show_asr_result.sh加载预训练模型通过模型名espnet/akreal_libritts_asr_phn从模型库拉取权重直接对任意英文音频做 IPA标点转写。小结本配方是音素级语音处理思路的完整落地数据侧用 eSpeak NGespeak_ng_english_us_vits保留重音与标点、VITS 兼容格式把 LibriTTS 文本音素化模型侧用 17 层 E-Branchformer 6 层 TransformerCTC 0.6 标签平滑 0.1 SpecAugment在 960 小时音素监督下训练 1.41 亿参数模型评测侧以 WER/CER/TER 三重视角确认了音素序列的高保真度CER 最低 2.2%。该输出可作为音素级 TTS 的直接前端输入也可推广到任意语言的音素转写任务。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐ESPnet ASR2 实战基于自监督离散 token 与 E-Branchformer 的高效端到端 ASRLibriSpeech960ESPnet ASR2 实战基于自监督离散 token 与 E Branchformer 的高效端到端 ASRLibriSpeech960 本技术指南以人工智能语音音频深度学习NLPESPnet 离散 Token ASR2 实战Libriheavy small 上基于 WavLM K-Means E-Branchformer 的带大小写与标点识别ESPnet 离散 Token ASR2 实战Libriheavy small 上基于 WavLM K Means E Branchformer 的带人工智能语音音频深度学习NLPESPnet CHiME4 ASR2 Recipe 实战基于 WavLM 离散 Token 与 E-Branchformer 的端到端语音识别ESPnet CHiME4 ASR2 Recipe 实战基于 WavLM 离散 Token 与 E Branchformer 的端到端语音识别 本篇技术指南聚人工智能语音音频深度学习NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表