)
基于 fairseq 的 MuST-C 英德语音翻译联合语音-文本训练实战指南Joint Speech Text Training【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文基于 kosmos-2/fairseq/examples/speech_text_joint_to_text/docs/ende-mustc.md 展开讲解如何在 fairseq 的speech_text_joint_to_text任务框架下为 MuST-C 英德En-De语音翻译任务进行「语音-文本联合训练」既可从零训练基线模型也可通过预训练初始化、跨注意力正则化Cross Attentive Regularization, CAR与在线知识蒸馏Online Knowledge Distillation, KD训练增强模型。读完本文你将掌握数据MuST-C 语音 WMT 平行文本的完整准备流程、两个可直接复用的训练脚本、推理评测命令以及底层任务、模型、损失函数三个关键模块的实现原理。方法背景从 Joint Training Baseline 到 Enhanced Joint Training该文档描述的语音-文本联合训练框架建立在两篇论文之上Joint Training Baseline基于论文A General Multi-Task Learning Framework to Leverage Text Data for Speech to Text TasksTang et al., ICASSP 2021。核心思想是通过多任务学习框架让语音到文本speech-to-text任务与文本到文本text-to-text任务共享编码器与解码器参数从而利用海量纯文本翻译数据弥补语音翻译数据稀缺的问题。Enhanced Joint Training在基线之上进一步引入三项增强手段论文Improving Speech Translation by Understanding and Learning from the Auxiliary Text Translation Task, Tang et al., ACL 2021预训练模型初始化加载预训练 ASR 编码器与 NMT 模型、跨注意力正则化cross attentive regularization让语音编码器与文本编码器的中间表示互相接近以及在线知识蒸馏用文本分支的预测分布引导语音分支。在仓库中这两篇论文对应 speech_text_joint_to_text/README.md 中列出的引用条目该 README 还说明了该目录是对 fairseq S2T 项目的扩展更多 S2T 细节见 speech_to_text/README.md并链接了本文与 iwslt2021.md 两个实战示例。数据准备Prepare Data下载必需文件首先下载三个 MuST-C En-De 任务所需的文件由文档提供下载地址模型训练与评测均依赖它们请放置到$MANIFEST_ROOT目录Sentence piece modelspm.model目标端分词模型Dictionarydict.txt目标端德语词典configconfig.yaml任务与数据配置会被训练/评测命令通过--config-yaml引用。准备 MuST-C 语音数据集按 fairseq 的 S2T 示例文档 完成 MuST-C 数据集的常规准备生成含src_text等列的 tsv 清单与音频特征。将 tsv 文件中src_text列的源文本转换为音素表示使用仓库自带的g2p_encode.py脚本python examples/speech_text_joint_to_text/scripts/g2p_encode.py \ --lower-case --do-filter --use-word-start --no-punc \ --reserve-word examples/speech_text_joint_to_text/configs/mustc_noise.list \ --data-path ${must_c_en_de_src_text} \ --out-path ${must_c_en_de_src_text_pho}路径说明上述命令中的examples/...以 fairseq 仓库根目录为基准。由于本仓库中 fairseq 位于 kosmos-2/fairseq 下实际运行时请将脚本路径替换为kosmos-2/fairseq/examples/speech_text_joint_to_text/scripts/g2p_encode.py、保留词表路径替换为kosmos-2/fairseq/examples/speech_text_joint_to_text/configs/mustc_noise.list。关于该脚本的实现细节见 g2p_encode.py它基于g2p_en库完成英文到 CMU 音素的转换逐行处理输入文本--reserve-word指定一个「词 → 标签」映射文件命中的词如(Applause)、(Laughter)不经过 G2P直接替换为NOISE/VOICE等标签。仓库中的 mustc_noise.list 正是这样的映射表覆盖了 49 种常见背景音/非语音事件描述--lower-case统一转小写、--do-filter将-与—替换为空格、--use-word-start为每个词首加上▁符号与 SentencePiece 风格对齐、--no-punc去除标点还支持--dup-vowel/--dup-consonant复制音素、--parallel-process-num1 时通过 submitit 并行处理需要pip install submitit等扩展参数转换失败的句子会被标记为FAILED_SENTENCE。用上一步生成的音素表示替换 tsv 中src_text列的原始文本。准备音素词典保存到$MANIFEST_ROOT下文件名为src_dict.txt源端英文音素词典。准备 WMT 平行文本数据为了给联合训练提供纯文本翻译监督还需要准备 WMT 的英德平行语料下载 WMT 数据官方提供了 WMT14 En-De 的 prepare 脚本作为参考用与上面完全相同的方式将源端英文文本转换为音素表示参照翻译任务的做法为训练生成二进制的平行语料文件保存到$parallel_text_data目录。从源码看tasks/speech_text_joint.py$parallel_text_data中的平行数据由 fairseq 标准的load_langpair_dataset加载支持--langpairs如en-de指定语言对且可跨多个语言对拼接多语言对时支持按sampling_alpha重采样。训练Training文档说明模型使用8 块 V100 GPU训练。训练前需下载两个预训练模型可选仅增强版需要pretrain_encoder多语言 ASR Transformer 预训练编码器mustc_multilingual_asr_transformer_m.ptpretrain_nmt预训练 NMT 模型 checkpointcheckpoint_mt.pt。脚本一从零联合训练基线模型python train.py ${MANIFEST_ROOT} \ --save-dir ${save_dir} \ --num-workers 8 \ --task speech_text_joint_to_text \ --arch dualinputs2ttransformer_s \ --user-dir examples/speech_text_joint_to_text \ --max-epoch 100 --update-mix-data \ --optimizer adam --lr-scheduler inverse_sqrt \ --lr 0.001 --update-freq 4 --clip-norm 10.0 \ --criterion guided_label_smoothed_cross_entropy_with_accuracy \ --label-smoothing 0.1 --max-tokens 10000 --max-tokens-text 10000 \ --max-positions-text 400 --seed 2 --speech-encoder-layers 12 \ --text-encoder-layers 6 --encoder-shared-layers 6 --decoder-layers 6 \ --dropout 0.1 --warmup-updates 20000 \ --text-sample-ratio 0.25 --parallel-text-data ${parallel_text_data} \ --text-input-cost-ratio 0.5 --enc-grad-mult 2.0 --add-speech-eos \ --log-format json --langpairs en-de --noise-token ▁NOISE \ --mask-text-ratio 0.0 --max-tokens-valid 20000 --ddp-backend no_c10d \ --log-interval 100 --data-buffer-size 50 --config-yaml config.yaml \ --keep-last-epochs 10脚本二增强联合训练好初始化 跨注意力正则化 在线知识蒸馏python train.py ${MANIFEST_ROOT} \ --save-dir ${save_dir} \ --num-workers 8 \ --task speech_text_joint_to_text \ --arch dualinputs2ttransformer_m \ --user-dir examples/speech_text_joint_to_text \ --max-epoch 100 --update-mix-data \ --optimizer adam --lr-scheduler inverse_sqrt \ --lr 0.002 --update-freq 4 --clip-norm 10.0 \ --criterion guided_label_smoothed_cross_entropy_with_accuracy \ --guide-alpha 0.8 --disable-text-guide-update-num 5000 \ --label-smoothing 0.1 --max-tokens 10000 --max-tokens-text 10000 \ --max-positions-text 400 --seed 2 --speech-encoder-layers 12 \ --text-encoder-layers 6 --encoder-shared-layers 6 --decoder-layers 6 \ --dropout 0.1 --warmup-updates 20000 --attentive-cost-regularization 0.02 \ --text-sample-ratio 0.25 --parallel-text-data ${parallel_text_data} \ --text-input-cost-ratio 0.5 --enc-grad-mult 2.0 --add-speech-eos \ --log-format json --langpairs en-de --noise-token ▁NOISE \ --mask-text-ratio 0.0 --max-tokens-valid 20000 --ddp-backend no_c10d \ --log-interval 100 --data-buffer-size 50 --config-yaml config.yaml \ --load-pretrain-speech-encoder ${pretrain_encoder} \ --load-pretrain-decoder ${pretrain_nmt} \ --load-pretrain-text-encoder-last ${pretrain_nmt} \ --keep-last-epochs 10同样地examples/speech_text_joint_to_text在本仓库中对应实际路径kosmos-2/fairseq/examples/speech_text_joint_to_texttrain.py对应kosmos-2/fairseq/train.py。关键参数解析结合源码任务层tasks/speech_text_joint.py--task speech_text_joint_to_text注册于 speech_text_joint.py#L40-L41继承 fairseq 的SpeechToTextTask同时加载语音数据SpeechToTextJointDatasetCreator与平行文本数据load_langpair_dataset并封装成MultiModalityDataset以sup_speech与text两个 modality 混合迭代load_dataset。--parallel-text-data平行文本数据目录--langpairs训练语言对逗号分隔如en-de二者必须同时指定否则报错。--max-tokens-text文本输入的 batch 最大 token 数--max-positions-text默认 400单条文本输入的最大位置数。--text-sample-ratio默认 1/--speech-sample-ratio默认 1文本/语音两种 modality 的采样倍率用于平衡两种数据量训练脚本中文本取 0.25即文本数据相对语音数据做降采样。--update-mix-data当--update-freq 1时将多种模态数据混入同一次参数更新get_batch_iterator 中mult_rate的取值逻辑。--mask-text-ratio默认 0.0与--noise-token对文本源端做「掩码噪声」的比率与噪声 token如▁NOISEmask-text-ratio 0时通过LangPairMaskDataset实现本示例取 0.0 即关闭。--load-speech-only仅加载语音数据推理专用见评测一节。模型层models/s2t_dualinputtransformer.py--arch dualinputs2ttransformer_s/dualinputs2ttransformer_m均注册于dual_input_s2t_transformerL556-L557。结构为双输入编码器 多输入解码器语音分支S2TTransformerEncoder含 Conv1d 子采样文本分支为标准TransformerEncoder两者后若干层可按--encoder-shared-layers共享参数通过set_shared_layer支持 0/1/2 三种共享级别全部共享 / 共享权重与 LN 但模型独立 / 仅共享权重不共享 bias 与 LayerNorm。解码器为TransformerMultiInputDecoder包含spch_decoder与text_decoder两套默认共享参数训练时同时解码两份 encoder 输出并沿 batch 拼接L511-L543。s与m架构规模差异ssmall为 embed_dim 256、4 头注意力、7/7/7 层mmedium为 embed_dim 512、8 头注意力、dropout 0.15、10/6/6 层L1044-L1067。基线脚本用s较小模型增强脚本用m。--speech-encoder-layers 12/--text-encoder-layers 6/--encoder-shared-layers 6/--decoder-layers 6覆盖架构默认值指定语音/文本编码器层数、共享层数及解码器层数。--enc-grad-mult 2.0对双编码器输出的梯度乘以该系数放大编码器学习信号mult_rst_grad。--add-speech-eos在语音特征末尾追加eos_num个可学习的 EOS 嵌入SpeechEoSEncoder帮助编码器显式感知句子边界eos_num 2 * len(conv_kernel_sizes)。--text-input-cost-ratio 0.5纯文本输入样本的损失缩放系数。预训练加载--load-pretrain-speech-encoderASR 编码器、--load-pretrain-decoderNMT 解码器、--load-pretrain-text-encoder-lastNMT 文本编码器覆盖共享层。加载逻辑见 build_encoder 与 build_decoder。损失层criterions/text_guide_cross_entropy_acc.py--criterion guided_label_smoothed_cross_entropy_with_accuracy注册为GuidedCrossEntAccCriterionL14-L15是带引导guide的标签平滑交叉熵并额外统计 token 级准确率。--label-smoothing 0.1标签平滑系数。--guide-alpha 0.8在线 KD 的插值系数。guide_loss_and_acc中以loss alpha * guide_loss (1 - alpha) * nll_loss融合文本分支预测分布教师与语音分支学生的交叉熵L116-L137教师分布被detach即只回传学生分支梯度。--disable-text-guide-update-num 5000前 5000 次更新只用普通 NLL 损失model.num_updates disable_update_num时跳过 guide帮助模型先稳定收敛。--attentive-cost-regularization 0.02跨注意力正则化CAR的权重。实现于解码器cross_attentive_loss先对语音/文本两个编码器的中间状态做 L2 归一化用点积 softmax 计算相互重建teacher→student 重建 vs teacher 自重建再对重建误差求和作为正则项models/s2t_dualinputtransformer.py#L439-L482该系数 0 时才会开启跨注意力损失计算与中间状态保存。训练超参--max-epoch 100 --update-freq 4 --warmup-updates 20000 --lr 0.001/0.002inverse_sqrt 调度基线 lr 0.001增强版 0.002--clip-norm 10.0--dropout 0.1--max-tokens 10000语音侧与--max-tokens-text 10000文本侧--seed 2--log-interval 100--data-buffer-size 50--keep-last-epochs 10。评测Evaluation训练完成后用 fairseq 的generate.py在 MuST-C 测试集tst-COMMON_st上评测_st后缀表示该子集为语音翻译专用切分python ./fairseq_cli/generate.py \ ${MANIFEST_ROOT} \ --task speech_text_joint_to_text \ --max-tokens 25000 \ --nbest 1 \ --results-path ${infer_results} \ --batch-size 512 \ --path ${model} \ --gen-subset tst-COMMON_st \ --config-yaml config.yaml \ --scoring sacrebleu \ --beam 5 --lenpen 1.0 \ --user-dir examples/speech_text_joint_to_text \ --load-speech-only关键点评测必须带--load-speech-only使任务在推理时仅加载语音数据与语音分支源码中speech_only会令source_dictionary返回NoneSpeechToTextJointDatasetCreator不再解析音素源文本解码走spch_decoder路径使用sacrebleu评分、beam size 5、长度惩罚 1.0若需指定推理目标语言任务还支持--infer-target-lang当配置开启prepend_tgt_lang_tag_no_change时作为解码起始 token。实验结果Joint training with initialization CAR online KD文档给出了增强联合训练初始化 CAR 在线 KD在三个语向的 BLEU 结果DirectionEn-DeEn-EsEn-FrBLEU27.431.237.6各语向对应训练好的checkpoint_ave_10.pt可在文档给出的官方路径下载此处仅记录数值请勿将本文数值与其他配置/数据集的结果混同比较。仓库中 iwslt2021.md 还提供了该框架在 IWSLT 2021 多语言语音翻译共享任务上的扩展应用可进一步参考。结语本指南完整覆盖了 MuST-C En-De 语音翻译的语音-文本联合训练全流程从音素化数据准备g2p_encode.py 噪声保留词表、WMT 平行语料构建到两套可直接复现的训练命令再到带--load-speech-only的 sacrebleu 评测。在此基础上本文结合 任务、模型 与 损失函数 三份源码解释了text-sample-ratio、enc-grad-mult、guide-alpha、attentive-cost-regularization等核心参数的底层作用机制方便你在自己的语向或数据集上按需调整。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考