ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Fairseq 语音-文本联合训练(Joint Speech-Text Training)实战指南:MuST-C 语音翻译、IWSLT2021 多语言系统与统一预训练

2026/9/19 11:46:49 拓冰建站 浏览量
Fairseq 语音-文本联合训练(Joint Speech-Text Training)实战指南:MuST-C 语音翻译、IWSLT2021 多语言系统与统一预训练 Fairseq 语音-文本联合训练Joint Speech-Text Training实战指南MuST-C 语音翻译、IWSLT2021 多语言系统与统一预训练【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq本文围绕 fairseq 仓库中的examples/speech_text_joint_to_text模块系统讲解在语音到文本S2T任务上叠加文本到文本T2T协同训练的联合训练方法包括双输入 Transformer 模型架构、带在线知识蒸馏与交叉注意力正则化的损失函数、音素化数据处理流程以及 MuST-C 英德语音翻译、IWSLT 2021 多语言语音翻译、LibriSpeech/MuST-C 统一语音-文本预训练三套可直接复现的完整方案。读完本文你将掌握如何在 fairseq 中配置speech_text_joint_to_text与speech_text_joint_denoising任务理解各训练参数的含义并能够独立跑通数据准备、训练、评估全流程。一、模块定位S2T 的联合训练扩展examples/speech_text_joint_to_text是 fairseq S2TSpeech-to-Text项目的扩展核心思想是在语音到文本任务之外协同训练一个文本到文本映射任务让模型在同一个框架下同时消费“语音 文本”两种模态的输入从而利用海量平行文本数据提升语音翻译质量。该模块的完整说明与用法参见 examples/speech_text_joint_to_text/README.md其基础能力继承自 examples/speech_to_text/README.mdS2T 快速建模工具。从源码结构看模块内部按 fairseq 的标准约定划分为子目录内容关键文件tasks/联合训练与预训练任务speech_text_joint.py、speech_text_denoise_pretrain.py、pair_denoising.pymodels/双输入模型架构s2t_dualinputtransformer.py、s2t_dualinputwavtransformer.py、s2t_dualinputxmtransformer.py、joint_speech_text_pretrain_transformer.pycriterions/联合训练损失text_guide_cross_entropy_acc.py、multi_modality_cross_entropy.py、multi_modality_compound.pydata/配对去噪数据集pair_denoising_dataset.pyscripts/数据处理工具g2p_encode.py词转音素、convert_model.pyconfigs/保留词表等mustc_noise.listdocs/完整实操文档ende-mustc.md、iwslt2021.md、pre-training.md模块内提供了三套官方示例对应三篇论文English-to-German MuST-C 语音翻译docs/ende-mustc.md对应A General Multi-Task Learning Framework to Leverage Text Data for Speech to Text TasksICASSP 2021与Improving Speech Translation by Understanding and Learning from the Auxiliary Text Translation TaskACL 2021IWSLT 2021 多语言语音翻译docs/iwslt2021.md对应FST: the FAIR Speech Translation System for the IWSLT21 Multilingual Shared TaskIWSLT 2021语音-文本联合预训练docs/pre-training.md对应Unified Speech-Text Pre-training for Speech Translation and RecognitionACL 2022。二、模型架构Dual-Input Transformer联合训练的核心模型注册名为dual_input_s2t_transformer实现在 models/s2t_dualinputtransformer.py。与普通 S2T 模型的关键区别是编码器由两个子编码器构成解码器也由两个子解码器构成训练时可同时接受语音与文本两种输入。2.1 双输入编码器DualInputEncoder编码器包含两条并行的特征提取通路见DualInputEncoder.forward源码语音编码器spch_encoder复用 fairseq S2T 的S2TTransformerEncoder输入是(B, T, C*feat)的语音特征序列由conv_kernel_sizes与conv_channels指定的 Conv1d 子采样层降采样后进入 Transformer 层文本编码器text_encoder标准的 fairseqTransformerEncoder输入是音素序列src_txt_tokens将源端音素映射到与语音编码器相同的隐藏空间。两条通路通过--encoder-shared-layers共享底部若干层参数默认 0 表示不共享共享层级通过set_shared_layer实现支持三种共享粒度--encoder-shared-layer-level0完全共享同一个层对象1共享权重但与共享层分开建模仍共用同一套参数2只共享权重不共享 bias 与 LayerNorm。此外SpeechEoSEncoder包装类提供两个实用特性--add-speech-eos在语音特征末尾追加eos_num 2 * len(conv_kernel_sizes)个可学习的 EOS 嵌入向量为语音输入补充边界信号--speech-encoder-adapter-type可选None/Linear/MLP在语音编码器输出后插入以单位矩阵初始化的 Adapter用于微调阶段适配预训练特征。--enc-grad-mult控制语音、文本两个编码器输出的梯度缩放倍率文档中的推荐值 2.0 用于稳定联合训练--enc2-along-grad-mult则控制仅使用文本编码器时的梯度倍率。2.2 双输入解码器TransformerMultiInputDecoder解码器由spch_decoder与text_decoder两个 Transformer 解码器组成二者共享词嵌入与位置嵌入。训练时若同时送入语音与文本解码器会把两个子解码器的输出沿 batch 维拼接torch.cat(..., dim0)因此损失函数中需要将 logits 按 2 均分对应下文is_dual_input分支的torch.chunk(lprobs, 2)。解码器层级的共享程度由--decoder-shared-layer-level控制0完全共享1共享一切但分属不同模型对象2只共享权重不共享 bias 与 LayerNorm。2.3 交叉注意力正则化Cross-Attentive Loss当--attentive-cost-regularization大于 0 时解码器会计算语音状态与文本状态之间的注意力重构损失以文本或语音状态作为 teacher通过注意力加权重建另一模态的状态惩罚两模态表示的不一致见TransformerMultiInputDecoder.cross_attentive_loss。该损失在 criterions/text_guide_cross_entropy_acc.py 中以attn_cost * attn_beta的形式累加到总损失中。--attentive-cost-without-normalize可关闭正则化前的范数归一化。2.4 预训练模型架构变体除上述基础架构外模块还提供针对不同预训练特征源的模型dual_input_wav_transformermodels/s2t_dualinputwavtransformer.py以 wav2vec 2.0 / XLSR 特征作为语音输入dual_input_xm_transformermodels/s2t_dualinputxmtransformer.py直接堆叠 XLSR-w2v 与 mBART 的编码器-解码器结构用于 IWSLT2021 多语言实验dualinputxmtransformer_base预训练主模型speech_text_pretrain_bart_base_stackmodels/joint_speech_text_pretrain_transformer.py以 BART 初始化、可同时处理去噪文本、监督语音S2P/S2T与自监督语音SSL任务。三、任务与数据混合speech_text_joint_to_text联合训练任务注册名为speech_text_joint_to_text实现在 tasks/speech_text_joint.py它继承自 fairseq 的SpeechToTextTask。任务级关键参数如下参数默认值说明--parallel-text-data平行文本数据目录fairseq-preprocess产物为空则纯语音训练--langpairsNone文本训练的语言对如en-de多个以逗号分隔必须显式提供--max-tokens-text无文本编码器单 batch 最大 token 数--max-positions-text400文本编码器单句最大 token 数--speech-sample-ratio1语音数据采样倍率--text-sample-ratio1文本数据采样倍率MuST-C 实验中设为 0.25--update-mix-dataFalseupdate-freq 1时在一个更新内混合语音/文本数据--mask-text-ratio0.0文本纯文本模式下掩码比例--mask-text-typerandom掩码方式random或tail--noise-token掩码噪声 token如▁NOISE--load-speech-onlyFalse仅加载语音数据推理/评估时使用--infer-target-lang推理时目标语言 tag在load_dataset中语音数据通过SpeechToTextJointDatasetCreator.from_tsv从 tsv 清单构建文本数据则通过load_langpair_dataset加载fairseq-preprocess生成的平行语料。若两者都存在任务会用MultiModalityDataset见fairseq/data/audio/multi_modality_dataset.py把语音与文本数据集包成两个ModalityDatasetItem分别用--max-tokens/--max-tokens-text控制 batch 规模get_batch_iterator依据speech_sample_ratio与text_sample_ratio生成采样器并以GroupedEpochBatchIterator输出--update-mix-data决定数据是否在同一更新内混批。预训练任务speech_text_joint_denoising见 tasks/speech_text_denoise_pretrain.py以及文本去噪配套任务paired_denoising见 tasks/pair_denoising.py则负责 T2T 部分的掩码去噪支持--mask、--mask-random、--insert、--mask-length span-poisson、--use-mask-whole-words等 BART 式去噪参数并为多语言场景提供--lang-pairs做掩码与--lang-pairs-bitext不做掩码两种语言对设置去噪数据集实现在 data/pair_denoising_dataset.py。四、损失函数引导式标签平滑交叉熵 在线知识蒸馏联合训练与微调阶段使用的损失是guided_label_smoothed_cross_entropy_with_accuracy实现在 criterions/text_guide_cross_entropy_acc.py。该损失由三个核心超参数驱动参数默认值说明--guide-alpha0.0在线知识蒸馏权重loss alpha * guide_loss (1 - alpha) * nll--disable-text-guide-update-num0前 N 步更新只用普通 NLL 损失之后才启用蒸馏--attentive-cost-regularization0.0交叉注意力正则化系数--text-input-cost-ratio1.0纯文本输入样本的损失权重文档中取 0.5--label-smoothing0.0标签平滑系数实验中常取 0.1其前向逻辑forward为当样本同时含语音与文本输入is_dual_input时模型输出的 logits 沿 batch 维均分为语音、文本两份语音分支走guide_loss_and_acc——以文本分支的 softmax 概率作为教师信号probs_teacher lprobs_teacher.exp()并detach()截断梯度与语音分支的 logits 计算交叉熵蒸馏损失再与语音分支自身的 NLL 损失按alpha加权文本分支则走普通compute_loss_and_acc。disable_text_guide_update_num提供前 N 步只训 NLL 的“预热”机制MuST-C 实验取 5000。当attentive_cost_regularization 0时编码器输出的中间状态还会被用于计算交叉注意力正则项见attn_cost。预训练阶段则使用speech_text_pretrain_cross_entropycriterions/multi_modality_cross_entropy.py继承标签平滑交叉熵。其compute_loss支持两种目标普通 token 目标label_smoothed_nll_loss以及“目标为 logprobs”的自监督蒸馏目标——当target是 dict 时以target_logprobs作为教师分布计算-(t_probs * (lprobs - t_lprobs)).sum()并对掩码帧mask_indices外的部分清零。若选择 CTC 方式监督 S2P 任务则改用speech_text_pretrain_compoundcriterions/multi_modality_compound.py。五、数据准备音素化与平行文本联合训练的关键预处理步骤是把源端英文文本转成音素表示使文本输入与语音特征在更接近的“发音”层级上对齐。工具脚本为 scripts/g2p_encode.py基于g2p_en库实现用法如下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}关键选项--lower-case转小写--do-filter把-、—等连接符替换为空格--use-word-start为每个词的音素前加词起始符▁--no-punc去除标点--reserve-word保留词表word → 音素映射用于把(Applause)之类的舞台指示固定映射为NOISE/VOICE等特殊音素 token。默认保留词表见 configs/mustc_noise.list内容形如(Applause) NOISE、(Laughter) VOICE--dup-vowel/--dup-consonant重复元音/辅音音素默认 1不重复--parallel-process-num配合 submitit 并行加速。转换完成后需要把 MuST-C tsv 清单中src_text列替换为对应的音素串。文档给出的 dev tsv 样例如下音素串省略id audio n_frames tgt_text src_text speaker ted_767_0 en-de/flac.zip:10071514743:48445 56160 Heute spreche ich zu Ihnen über Energie und Klima. ▁AY1 M ▁G OW1 IH0 NG ... spk.767_再据音素词汇生成源端词典src_dict.txt放入$MANIFEST_ROOT。目标端仍用 SentencePiece 子词spm.model、dict.txt、config.yaml三个文件由原文档提供公开下载地址。文本侧准备 WMT 平行语料参见 examples/translation/prepare-wmt14en2de.sh英文侧同样执行上述音素化德文侧保留 SentencePiece 子词然后用fairseq-preprocess生成二值化平行数据--parallel-text-data指向的目录。六、MuST-C 英德语音翻译实战完整文档见 docs/ende-mustc.md。语音数据准备遵循 S2T 示例见 examples/speech_to_text/README.md 中 MuST-C 数据准备章节训练在 8 张 V100 GPU 上进行。6.1 从零联合训练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要点dualinputs2ttransformer_s为小尺寸双输入模型源码中encoder_embed_dim256、speech/text encoder_layers7--user-dir指向本模块以便注册任务/模型/损失--text-sample-ratio 0.25表示文本数据按 1:4 与语音数据混批--add-speech-eos启用语音 EOS 嵌入--noise-token ▁NOISE与--mask-text-ratio配合可在纯文本模式下做掩码增强此处为 0。6.2 带初始化、交叉注意力正则化与在线蒸馏的增强训练先下载两个预训练权重pretrain_encoderMuST-C 联合 ASR Transformer与pretrain_nmtNMT 模型下载地址见原文档。然后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相比 6.1这里启用--guide-alpha 0.8蒸馏权重、--disable-text-guide-update-num 5000前 5000 步仅 NLL、--attentive-cost-regularization 0.02交叉注意力正则并通过三个加载参数分别初始化语音编码器--load-pretrain-speech-encoder、解码器与文本编码器--load-pretrain-decoder/--load-pretrain-text-encoder-last。加载逻辑对应 models/s2t_dualinputtransformer.py 中build_encoder/build_decoder对checkpoint_utils.load_pretrained_component_from_model的调用。6.3 评估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只加载语音数据此时任务仅使用语音编码器对应DualInputEncoder.forward中src_txt_tokens is None的单输入推理路径。6.4 结果原文档报告联合训练 初始化 CAR 在线 KD的 BLEU 如下checkpoint 下载链接见原文档方向En-DeEn-EsEn-FrBLEU27.431.237.6七、IWSLT 2021 多语言语音翻译实战完整文档见 docs/iwslt2021.md对应 FST 系统。数据准备遵循 S2T 的 mTEDx 数据流程并启用--use-audio-input生成原始音频 tsv详见 examples/speech_to_text/README.md 相关章节src_text列同样按 MuST-C 方式音素化。所需词典、spm 模型与 config 下载地址见原文档。7.1 训练使用两个预训练模型初始化mbart.pt预训练 mBART与xlsr_53_56k.ptXLSR-53 w2v架构为dualinputxmtransformer_basepython train.py ${MANIFEST_ROOT} \ --save-dir ${save_dir} \ --user-dir examples/speech_text_joint_to_text \ --train-subset train_es_en_tedx,train_es_es_tedx,train_fr_en_tedx,train_fr_es_tedx,train_fr_fr_tedx,train_it_it_tedx,train_pt_en_tedx,train_pt_pt_tedx \ --valid-subset valid_es_en_tedx,valid_es_es_tedx,valid_es_fr_tedx,valid_es_it_tedx,valid_es_pt_tedx,valid_fr_en_tedx,valid_fr_es_tedx,valid_fr_fr_tedx,valid_fr_pt_tedx,valid_it_en_tedx,valid_it_es_tedx,valid_it_it_tedx,valid_pt_en_tedx,valid_pt_es_tedx,valid_pt_pt_tedx \ --config-yaml config.yaml --ddp-backend no_c10d \ --num-workers 2 --task speech_text_joint_to_text \ --criterion guided_label_smoothed_cross_entropy_with_accuracy \ --label-smoothing 0.3 --guide-alpha 0.8 \ --disable-text-guide-update-num 5000 --arch dualinputxmtransformer_base \ --max-tokens 500000 --max-sentences 3 --max-tokens-valid 800000 \ --max-source-positions 800000 --enc-grad-mult 2.0 \ --attentive-cost-regularization 0.02 --optimizer adam \ --clip-norm 1.0 --log-format simple --log-interval 200 \ --keep-last-epochs 5 --seed 1 \ --w2v-path ${w2v_path} \ --load-pretrained-mbart-from ${mbart_path} \ --max-update 1000000 --update-freq 4 \ --skip-invalid-size-inputs-valid-test \ --skip-encoder-projection --save-interval 1 \ --attention-dropout 0.3 --mbart-dropout 0.3 \ --finetune-w2v-params all --finetune-mbart-decoder-params all \ --finetune-mbart-encoder-params all --stack-w2v-mbart-encoder \ --drop-w2v-layers 12 --normalize \ --lr 5e-05 --lr-scheduler inverse_sqrt --warmup-updates 5000多语言要点--train-subset/--valid-subset以逗号分隔多个 TEDx 子集--stack-w2v-mbart-encoder表示把 w2v 与 mBART 编码器堆叠--drop-w2v-layers 12丢弃 w2v 顶部层--finetune-*-params all全量微调各组件学习率低至5e-05。7.2 评估python ./fairseq_cli/generate.py \ ${MANIFEST_ROOT} \ --task speech_text_joint_to_text \ --user-dir ./examples/speech_text_joint_to_text \ --load-speech-only --gen-subset test_es_en_tedx \ --path ${model} \ --max-source-positions 800000 \ --skip-invalid-size-inputs-valid-test \ --config-yaml config.yaml \ --infer-target-lang en \ --max-tokens 800000 \ --beam 5 \ --results-path ${RESULTS_DIR} \ --scoring sacrebleu--infer-target-lang用于指定解码起始语言 tag对应任务源码inference_step中bos_tokenself._infer_tgt_lang_id。7.3 结果训练好的模型可从原文档下载各方向 BLEU方向es_enfr_enpt_enit_enfr_espt_esit_eses_esfr_frpt_ptit_itBLEU31.6236.9335.0727.1238.8735.5734.1374.5974.6470.8469.76同语向es_es、fr_fr 等指标显著更高符合语音识别/同语翻译任务难度的预期。八、统一语音-文本预训练Unified Speech-Text Pre-training完整文档见 docs/pre-training.md对应Unified Speech-Text Pre-training for Speech Translation and RecognitionACL 2022。该方案在预训练阶段同时优化四个任务T2T文本到文本对音素源 子词目标的平行文本做去噪数据准备同 MuST-C 章节SSL自监督语音wav2vec 2.0 式掩码预测数据按 examples/wav2vec/README.md 准备S2P语音到音素以音素级强制对齐可由 Kaldi 或 Montreal Forced Aligner 生成监督分类tsv 含id / audio / n_frames / tgt_text / align五列对齐时间点归一化到 0~1S2T语音到文本常规语音翻译任务。8.1 LibriSpeech ASR 预训练python train.py $T2T_DATA \ --save-dir $SAVE_PRE_PATH --user-dir examples/speech_text_joint_to_text --task speech_text_joint_denoising \ --criterion speech_text_pretrain_cross_entropy --optimizer adam --weight-decay 0.01 --config-yaml config_s2p.yaml --config-s2s-yaml config.yaml --ddp-backend no_c10d \ --lang-pairs pho-wrd --num-workers 4 --log-interval 500 --save-interval-updates 5000 --keep-interval-updates 1 --no-emb-update-unsup --report-accuracy --lr 0.001 --end-learning-rate 1e-06 \ --lr-scheduler polynomial_decay --warmup-updates 10000 --total-num-update 800000 --update-freq 6 --validate-interval-updates 10000 --train-subset train \ --valid-subset valid,valid_sup_speech,valid_sup_speech_s2s,valid_unsup_speech --dataset-impl mmap \ --sup-speech-data $S2P_DATA_PATH --sup-speech-train-subset train_960.ali --sup-speech-valid-subset dev-clean.ali --sup-speech-s2s-data $S2T_DATA_PATH \ --sup-speech-s2s-train-subset train --sup-speech-s2s-valid-subset dev-clean --unsup-speech-train-data $SSL_DATA_PATH/train.tsv --unsup-speech-valid-data $SSL_DATA_PATH/valid.tsv \ --batch-size 200 --batch-size-valid 150 --max-source-positions 1024 --max-target-positions 1024 --max-text-tokens 3072 --max-speech-positions 600000 \ --max-sample-size 750000 --min-sample-size 64000 --max-speech-tokens 750000 --max-tokens-valid 750000 --skip-invalid-size-inputs-valid-test \ --unsupervised-speech-sample-ratio 3.0 --supervised-speech-sample-ratio 5 --supervised-speech-s2s-sample-ratio 5 --text-sample-ratio 1.0 --mask 0.3 --mask-random 0.1 \ --mask-length span-poisson --speech-sup-mask-prob 0.3 --speech-unsup-mask-prob 0.7 --use-mask-whole-words --arch speech_text_pretrain_bart_base_stack \ --no-scale-feature --activation-fn gelu --speech-extractor-mode default --stacked-encoder all --encoder-normalize-before --decoder-normalize-before \ --encoder-learned-pos --decoder-learned-pos --dropout 0.1 --load-pretrained-mbart-encoder-from $BART --load-pretrained-mbart-decoder-from $BART参数含义速览--sup-speech-data/--sup-speech-train-subset指定 S2P 对齐数据如 LibriSpeech 960 小时的train_960.ali--sup-speech-s2s-data指定 S2T 数据--unsup-speech-train-data指定 SSL 的 tsv如 LibriLight--unsupervised-speech-sample-ratio 3.0、--supervised-speech-sample-ratio 5、--supervised-speech-s2s-sample-ratio 5、--text-sample-ratio 1.0控制各任务数据配比--speech-sup-mask-prob 0.3/--speech-unsup-mask-prob 0.7为语音掩码概率--stacked-encoder all表示堆叠共享编码器--load-pretrained-mbart-encoder-from/--load-pretrained-mbart-decoder-from用 LibriSpeech 文本训练的 BART 初始化。CTC 替代方案若不使用强制对齐监督数据可将 S2P 改为 CTC 优化——添加--use-sup-speech-ctc --criterion speech_text_pretrain_compound删除--same-data-update --criterion speech_text_pretrain_cross_entropy。文档注明 CTC 方案效果仍逊于强制对齐方案部分原因在于其复用了强制对齐方案的预训练设置。8.2 微调LibriSpeech ASRpython train.py $S2T_DATA_PATH \ --save-dir $SAVE_FT_PATH --num-workers 8 --task speech_text_joint_to_text --arch dualinputs2twavtransformer_base_stack \ --user-dir examples/speech_text_joint_to_text --max-update 100000 --optimizer adam --lr-scheduler inverse_sqrt --lr 0.0003 --update-freq 3 --clip-norm 10.0 \ --criterion guided_label_smoothed_cross_entropy_with_accuracy --guide-alpha 0.8 --label-smoothing 0.1 --warmup-updates 20000 --attentive-cost-regularization 0.02 \ --enc-grad-mult 2.0 --max-tokens 800000 --max-source-positions 800000 --max-tokens-text 10000 --max-positions-text 1024 --max-target-positions 1024 --no-scale-feature \ --activation-fn gelu --load-pretrained-speech-text-encoder $SAVE_PRE_PATH/checkpoint_last.pt --load-pretrained-speech-text-decoder $SAVE_PRE_PATH/checkpoint_last.pt \ --encoder-normalize-before --decoder-normalize-before --speech-extractor-mode default --speech-mask-channel-length 64 --speech-mask-channel-prob 0.5 \ --speech-mask-length 10 --speech-mask-prob 0.65 --text-sample-ratio 0.25 --mask-text-ratio 0.3 --mask-text-type random --parallel-text-data text_bin \ --text-input-cost-ratio 0.5 --langpairs pho-wrd --update-mix-data --log-format json --max-tokens-valid 800000 --ddp-backend no_c10d --log-interval 500 \ --config-yaml config.yaml --skip-invalid-size-inputs-valid-test --keep-last-epochs 50 --layernorm-embedding --encoder-learned-pos --decoder-learned-pos微调阶段通过--load-pretrained-speech-text-encoder/--load-pretrained-speech-text-decoder加载预训练 checkpoint并引入语音特征通道掩码--speech-mask-channel-length 64、--speech-mask-channel-prob 0.5与帧掩码--speech-mask-length 10、--speech-mask-prob 0.65文本侧开启--mask-text-ratio 0.3的随机掩码。8.3 评估与结果取微调最后 10 个 epoch 的模型做平均得到$FINAL_MODEL可用 scripts/average_checkpoints.py 实现然后python ./fairseq_cli/generate.py \ $S2T_DATA_PATH \ --task speech_text_joint_to_text \ --max-tokens 800000 \ --max-source-positions 800000 \ --nbest 1 \ --results-path $RESULTS_LOG \ --batch-size 512 \ --path $FINAL_MODEL \ --gen-subset $SUBSET \ --config-yaml config.yaml \ --scoring wer \ --beam 10 --lenpen 1.0 \ --user-dir examples/speech_text_joint_to_text --load-speech-only \ --model-overrides {load_pretrained_speech_text_decoder:,load_pretrained_speech_text_encoder:}ASR 用 WER 评估。原文档结果数据集dev-cleandev-othertest-cleantest-otherWER2.04.42.14.6预训练 checkpoint、微调 checkpoint、config_s2p.yaml、config.yaml、spm.model、src_dict.txt、tgt_dict.txt及 BART 初始化权重均可在原文档给出的链接中下载包括用 960 小时 LibriSpeech LibriSpeech 文本 LibriLight 数据预训练的模型。8.4 MuST-C 预训练变体把 8.1 中的语音数据替换为 MuST-C、平行文本替换为 WMT 数据即可得到 MuST-C 预训练版本。与 LibriSpeech 配置的差异主要体现在语言对用--lang-pairs-bitext en-frbitext 不做掩码、--bitext-sample-ratio 0.5、--stacked-encoder s2s仅 S2T 路径堆叠共享编码器、以 WMT 预训练 NMT 模型初始化 BART 组件等。微调与评估命令与 8.2 / 8.3 结构一致评分改为--scoring sacrebleu结果方向en-fren-esen-deBLEU39.733.229.2各语言的config.yaml、词典、spm 模型、预训练 NMT、预训练模型与微调模型下载链接均见原文档。九、技术要点小结联合训练的本质在 S2T 任务上叠加 T2T 任务语音与文本共享编码器底层与解码器让文本平行语料“反哺”语音翻译三个增强手段——预训练初始化、交叉注意力正则化CAR、在线知识蒸馏KD——分别对应--load-pretrain-*、--attentive-cost-regularization、--guide-alpha参数。音素中间表示英文源端统一转为 CMU 音素串▁前缀标记词首使得 T2T 与 S2T 的源端表示尽量同构是联合训练数据准备的关键。可复现路径本模块的三篇文档分别给出 MuST-C 双语、IWSLT2021 多语言、LibriSpeech/MuST-C 预训练三套完整命令涉及 fairseq_cli/generate.py、根目录 train.py、fairseq_cli/preprocess.py 等 fairseq 标准入口配合--user-dir机制即可直接运行。十、引用若在研究中使用了该模块请按 examples/speech_text_joint_to_text/README.md 中的引用信息标注以下论文Unified Speech-Text Pre-training for Speech Translation and RecognitionYun Tang, Hongyu Gong, Ning Dong, Changhan Wang, Wei-Ning Hsu, Jiatao Gu, Alexei Baevski, Xian Li, Abdelrahman Mohamed, Michael Auli, Juan Miguel PinoACL 2022Improving Speech Translation by Understanding and Learning from the Auxiliary Text Translation TaskYun Tang, Juan Pino, Xian Li, Changhan Wang, Dmitriy GenzelACL 2021FST: the FAIR Speech Translation System for the IWSLT21 Multilingual Shared TaskYun Tang, Hongyu Gong, Xian Li, Changhan Wang, Juan Pino, Holger Schwenk, Naman GoyalIWSLT 2021A General Multi-Task Learning Framework to Leverage Text Data for Speech to Text TasksYun Tang, J. Pino, Changhan Wang, Xutai Ma, Dmitriy GenzelICASSP 2021fairseq S2T: Fast Speech-to-Text Modeling with fairseqChanghan Wang, Yun Tang, Xutai Ma, Anne Wu, Dmytro Okhonko, Juan PinoAACL 2020 System Demonstrationsfairseq: A Fast, Extensible Toolkit for Sequence ModelingMyle Ott 等NAACL-HLT 2019 Demonstrations。【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考