资讯动态

SimulST on MuST-C:基于 EdgeLM (fairseq) 的 wait-k 端到端同时语音翻译训练与评测实战

发布时间:2026/9/13 7:26:54 来源:尧图企业网站定制
SimulST on MuST-C基于 EdgeLM (fairseq) 的 wait-k 端到端同时语音翻译训练与评测实战【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本文以仓库中edgelm/examples/speech_to_text/docs/simulst_mustc_example.md教程为主体系统讲解如何在 MuST-C 英德数据集上完成数据准备 → 离线 ASR 预训练 → wait-k / 单调多头注意力的同时语音翻译SimulST训练 → 基于 SimulEval 的延迟与质量评测的完整流水线并结合 convtransformer_simul_trans.py、fixed_pre_decision.py、label_smoothed_cross_entropy_latency_augmented.py 等源码深入解释--simul-type、--fixed-pre-decision-ratio等关键参数的底层实现以及 READ/WRITE 决策、BLEU 与 AL/DAL/AP 延迟指标的计算原理。1. 任务背景从 SimulMT 到 SimulST同时语音翻译Simultaneous Speech Translation, SimulST要求模型在音频流式到达的过程中边听边译而不是听完整句再翻译。本教程实现的方法来自论文 SimulMT to SimulST: Adapting Simultaneous Text Translation to End-to-End Simultaneous Speech TranslationAACL 2020核心思路是先把文本领域的同时翻译策略wait-k、单调多头注意力适配到语音上语音侧采用 ConvTransformer 编码器 带读出策略的单调解码器。数据集选用MuST-C多语言语音到文本翻译语料库基于英文 TED 演讲含 8 种语言译文。从源码看prep_mustc_data.py 中的MUSTC类明确定义了支持的划分与语言SPLITS [train, dev, tst-COMMON, tst-HE] LANGUAGES [de, es, fr, it, nl, pt, ro, ru]__init__会读取${MUSTC_ROOT}/en-{lang}/data/{split}/下的txt/{split}.yaml音频分段信息wav 文件名、offset、duration、speaker_id以及txt/{split}.en、txt/{split}.{lang}两个逐行对齐的文本文件按wav → 分段分组后用 soundfile 切片得到(waveform, sample_rate, src_utt, tgt_utt, spk_id, utt_id)形式的样本。整体训练-评测链路为下载 MuST-C 数据并按en-{lang}目录组织运行prep_mustc_data.py分别生成 ASR 与 ST 两套 manifest、特征、词表与配置训练一个离线 ASR 模型convtransformer_espnet得到可复用的 encoder 权重用--load-pretrained-encoder-from加载该权重训练同时翻译模型用 SimulEval 框架 仓库自带的 fairseq_simul_st_agent.py 在线评测 BLEU 与延迟指标。2. 数据准备Data Preparation安装额外依赖后在fairseq本仓库中对应 edgelm 目录下对 ASR 与 ST 两个任务各跑一次数据准备脚本# Additional Python packages for S2T data processing/model training pip install pandas torchaudio sentencepiece # Generate TSV manifests, features, vocabulary, # global cepstral and mean estimation, # and configuration for each language cd fairseq python examples/speech_to_text/prep_mustc_data.py \ --data-root ${MUSTC_ROOT} --task asr \ --vocab-type unigram --vocab-size 10000 \ --cmvn-type global python examples/speech_to_text/prep_mustc_data.py \ --data-root ${MUSTC_ROOT} --task st \ --vocab-type unigram --vocab-size 10000 \ --cmvn-type globalMuST-C 原始数据需从官方站点下载并解压到${MUSTC_ROOT}/en-{target_lang}例如${MUSTC_ROOT}/en-de。2.1 脚本参数详解结合 prep_mustc_data.py 的argparse定义各参数含义与默认值如下参数默认值说明--data-root/-d必填MuST-C 根目录其下应为en-{lang}/data/{split}结构--task无asr或st决定 manifest 中tgt_text取源句英文还是目标语言译文--vocab-typeunigram必填词表类型可选bpe/unigram/char--vocab-size8000sentencepiece 词表大小教程中设为 10000--cmvn-typeutterance倒谱均值方差归一化类型可选global/utterance教程使用global--gcmvn-max-num150000估计全局 CMVN 统计量时最多使用的句子数--joint关闭8 语言联合训练模式本文单语向英德翻译不需要--use-audio-input关闭用原始波形flac代替 fbank 特征2.2 脚本内部流程源码印证process(args)对每个存在en-{lang}目录的语言依次执行以下操作特征提取遍历MUSTCDataset逐句调用extract_fbank_features生成fbank80/{utt_id}.npy80 维 log-mel fbank来自 data_utils.py全局 CMVN 估计当split train且--cmvn-type global时缓存训练集特征调用cal_gcmvn_stats估计全局均值/标准差并保存为gcmvn.npz。这也是配置文件里global_cmvn.stats_npz_path的来源打包与 manifest把特征目录压成fbank80.zip读取 zip manifest 后生成 5 列的 TSVid, audio, n_frames, tgt_text, speaker。注意tgt_text的取值逻辑src_utt if args.task asr else tgt_utt——即 ASR 任务的标签是英文转写ST 任务的标签是目标语言译文词表生成把训练集tgt_text写入临时文件按spm_{vocab_type}{size}_{task}命名生成 sentencepiece 模型与词典如spm_unigram10000_st.model/.txt。ST 词表会额外注入lang:{lang}特殊符号见process_joint中special_symbols的构造用于多语向场景配置生成调用gen_config_yaml生成config_asr.yaml/config_st.yaml其中包含 sentencepiece 路径、gcmvn 路径、specaugment 策略fbank 模式为lb策略等。处理完成后${MUSTC_ROOT}/en-de/目录下将得到类似产物fbank80.zip、train_asr.tsv、dev_asr.tsv、train_st.tsv、dev_st.tsv、spm_unigram10000_asr.model、spm_unigram10000_st.model、gcmvn.npz、config_asr.yaml、config_st.yaml等。3. ASR 预训练同时语音翻译需要先有一个预训练好的离线 ASR 模型其 encoder 将在 ST 阶段被整体复用--load-pretrained-encoder-from。假设保存目录为${ASR_SAVE_DIR}教程中的命令默认在 1 张 GPU 上训练若用 8 卡可去掉--update-freq 8fairseq-train ${MUSTC_ROOT}/en-de \ --config-yaml config_asr.yaml --train-subset train_asr --valid-subset dev_asr \ --save-dir ${ASR_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-update 100000 \ --task speech_to_text --criterion label_smoothed_cross_entropy --report-accuracy \ --arch convtransformer_espnet --optimizer adam --lr 0.0005 --lr-scheduler inverse_sqrt \ --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8关键参数说明--config-yaml config_asr.yaml这里传的是相对于 data 目录的 basename即第 2 步生成的config_asr.yaml。数据目录为${MUSTC_ROOT}/en-de其中已包含train_asr.tsv/dev_asr.tsv因此--train-subset/--valid-subset只需给出 TSV 前缀--arch convtransformer_espnetESPnet 风格的 ConvTransformer 语音编码器架构是后续 SimulST 模型的编码器基础--criterion label_smoothed_cross_entropy --report-accuracy标准标签平滑交叉熵损失并额外报告 top-1 准确率--lr 0.0005、inverse_sqrt调度、--warmup-updates 10000、--max-update 100000、梯度裁剪--clip-norm 10.0--update-freq 8累积 8 个 batch 再更新一次等效于放大 batch size适配单卡显存。教程说明可以从论文作者的公共发布地址下载预训练好的 ASR checkpointmust_c_v1_en_de_pretrained_asr跳过本步骤下载后其checkpoint_best.pt即为 ST 阶段--load-pretrained-encoder-from的输入。4. 同时语音翻译训练ST 模型架构注册在 convtransformer_simul_trans.pySimulConvTransformerModel继承自ConvTransformerModel复用 ASR 的 ConvTransformer 编码器把解码器替换为TransformerMonotonicDecoder定义在 transformer_monotonic_attention.py。该解码器的每一层 encoder attention 是一个单调注意力头前向传播时会同时输出一个action0 READ还没读够需要更多输入1 WRITE可以吐出下一个词元。架构convtransformer_simul_trans_espnet就是在convtransformer_espnet(args)基础上注册的别名。解码策略READ/WRITE 的判定规则由--simul-type选择对应fixed_pre_decision.py中通过register_monotonic_attention注册的三类单调注意力--simul-type取值底层类策略含义waitk_fixed_pre_decisionWaitKAttention fixed pre-decisionwait-k 策略--waitk-lagging控制 lagginghard_aligned_fixed_pre_decisionMonotonicAttention fixed pre-decision硬对齐单调注意力infinite_lookback_fixed_pre_decisionMonotonicInfiniteLookbackAttention fixed pre-decision可无限回看的单调多头注意力MMAfixed pre-decision 指在固定分块的边界上做出 READ/WRITE 决策FixedStrideMonotonicAttention会用pre_decision_ratio对 key 序列做池化默认average即AvgPool1d(kernel_sizeratio, strideratio, ceil_modeTrue)last则取每块最后一个位置在池化后的粗粒度序列上算p_choose再用insert_zeros上采样回原始分辨率块内其余位置概率置零从而保证每ratio个编码器步才产生一次读出决策。相关超参数在 fixed_pre_decision.py 中注册--fixed-pre-decision-ratio必填多少个编码器状态步触发一次同时决策源码断言ratio 1--fixed-pre-decision-typeaverage默认或last池化--fixed-pre-decision-pad-threshold默认0.3池化块中 pad 占比超过该阈值则整块视为 pad。另外infinite_lookback变体在推理时会把池化长度向下取整math.floor避免提前看到最后一块不完整分块的偏差——源码注释中明确写到 The floor instead of ceil is used for inference。4.1 Wait-k 固定预决策以固定预决策比例 7每 7 个编码器状态做一次 READ/WRITE 决策 wait-3 策略为例假设 ST 模型保存目录为${ST_SAVE_DIR}fairseq-train ${MUSTC_ROOT}/en-de \ --config-yaml config_st.yaml --train-subset train_st --valid-subset dev_st \ --save-dir ${ST_SAVE_DIR} --num-workers 8 \ --optimizer adam --lr 0.0001 --lr-scheduler inverse_sqrt --clip-norm 10.0 \ --criterion label_smoothed_cross_entropy \ --warmup-updates 4000 --max-update 100000 --max-tokens 40000 --seed 2 \ --load-pretrained-encoder-from ${ASR_SAVE_DIR}/checkpoint_best.pt \ --task speech_to_text \ --arch convtransformer_simul_trans_espnet \ --simul-type waitk_fixed_pre_decision \ --waitk-lagging 3 \ --fixed-pre-decision-ratio 7 \ --update-freq 8与 ASR 阶段相比的要点--load-pretrained-encoder-from ${ASR_SAVE_DIR}/checkpoint_best.pt整体加载离线 ASR 的编码器权重这是 SimulST 方法从 ASR 迁移到 ST的关键--simul-type waitk_fixed_pre_decisionwait-k 策略在 fixed pre-decision 的池化序列上执行--waitk-lagging 3表示 wait-3读到第 k 个输入后先产出滞后 3 步的词元--lr 0.0001比 ASR 阶段小一个量级、--warmup-updates 4000、--seed 2该阶段使用普通label_smoothed_cross_entropy损失不显式惩罚延迟。4.2 单调多头注意力MMA 固定预决策第二种策略使用可无限回看的单调多头注意力并切换为延迟增广损失fairseq-train ${MUSTC_ROOT}/en-de \ --config-yaml config_st.yaml --train-subset train_st --valid-subset dev_st \ --save-dir ${ST_SAVE_DIR} --num-workers 8 \ --optimizer adam --lr 0.0001 --lr-scheduler inverse_sqrt --clip-norm 10.0 \ --warmup-updates 4000 --max-update 100000 --max-tokens 40000 --seed 2 \ --load-pretrained-encoder-from ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} \ --task speech_to_text \ --criterion latency_augmented_label_smoothed_cross_entropy \ --latency-weight-avg 0.1 \ --arch convtransformer_simul_trans_espnet \ --simul-type infinite_lookback_fixed_pre_decision \ --fixed-pre-decision-ratio 7 \ --update-freq 8其损失函数latency_augmented_label_smoothed_cross_entropy实现于 label_smoothed_cross_entropy_latency_augmented.py值得注意的实现细节延迟可微化compute_latency_loss从每层单调注意力头取出软对齐分布alphanet_output[1].attn_list把源端位置索引steps arange(1, 1src_len)与alpha加权求和得到每个 (batch, 层×头, 目标步) 的expected_delays再用 SimulEval 的LATENCY_METRICSaverage_lagging/average_proportion/differentiable_average_lagging默认类型为differentiable_average_lagging计算期望延迟多头聚合--latency-gather-method支持average/weighted_average对多头延迟做 softmax 加权默认/max三种聚合方式权重与门控总延迟损失为avg_loss var_loss其中avg_loss latency_avg_weight * expected_latency即教程里的--latency-weight-avg 0.1还支持latency_update_after在训练前若干步内关闭延迟项硬依赖该 criterion 在__init__中断言LATENCY_METRICS is not None即必须先安装 SimulEvalpip install simuleval否则无法训练 MMA 变体训练日志会额外输出latency、delays_var、latency_loss三个标量reduce_metrics中按句子数平均可在训练过程中直接监控延迟下降趋势。MMA 变体不指定--waitk-lagging而是由注意力本身学习何时该读、何时该写配合延迟损失显式压低平均滞后。5. 推理与评测SimulEval评测框架使用 SimulEval。注意本仓库自带了评测 agentfairseq_simul_st_agent.py文档命令中写作${FAIRSEQ}/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.pygit clone https://github.com/facebookresearch/SimulEval.git cd SimulEval pip install -e . simuleval \ --agent ${FAIRSEQ}/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.py --source ${SRC_LIST_OF_AUDIO} --target ${TGT_FILE} --data-bin ${MUSTC_ROOT}/en-de \ --config config_st.yaml \ --model-path ${ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ --output ${OUTPUT} \ --scores5.1 输入文件格式${SRC_LIST_OF_AUDIO}每行一个 wav 文件绝对路径的列表例如/home/user/data/audio-1.wav /home/user/data/audio-2.wav${TGT_FILE}每行一条对应音频的参考译文Translation_1 Translation_2若评测集就是 MuST-C 官方切分无需手工准备上述文件——仓库提供 seg_mustc_data.py 直接从原始 MuST-C 切出逐段 wav 与文本python ${FAIRSEQ}/examples/speech_to_text/seg_mustc_data.py \ --data-root ${MUSTC_ROOT} --lang de \ --split ${SPLIT} --task st \ --output ${EVAL_DATA}该脚本参数--data-root/--taskasr|st/--lang/--output/--split--split取值即MUSTC.SPLITSdev、tst-COMMON、tst-HE、train会复用MUSTCDataset输出到${EVAL_DATA}下逐段音频{utt_id}.wav、参考文本{split}.{lang}、音频路径清单{split}.wav_list其中文本取tgt列即--task st时为目标语言译文。5.2 配置与数据目录的对应关系如果数据是自己从原始 MuST-C 准备的--data-bin与--config必须与训练章节保持一致若只做评测可使用官方发布目录must_c_v1.0_en_de_databin.tgz其中包含spm_unigram10000_st.modelsentencepiece 模型spm_unigram10000_st.txt对应词典gcmvn.npz全局倒谱均值/方差统计config_st.yaml配置样例见下。若使用下载的数据目录需要把sentencepiece_model与stats_npz_path改为本机绝对路径bpe_tokenizer: bpe: sentencepiece sentencepiece_model: ABS_PATH_TO_SENTENCEPIECE_MODEL global_cmvn: stats_npz_path: ABS_PATH_TO_GCMVN_FILE input_channels: 1 input_feat_per_channel: 80 sampling_alpha: 1.0 specaugment: freq_mask_F: 27 freq_mask_N: 1 time_mask_N: 1 time_mask_T: 100 time_mask_p: 1.0 time_wrap_W: 0 transforms: *: - global_cmvn _train: - global_cmvn - specaugment vocab_filename: spm_unigram10000_st.txt注意一个容易踩坑的细节一旦设置了--data-bin--config传的是 config yaml 的basename而非完整路径agent 内部以os.path.join(args.data_bin, args.config)打开该文件并从中读取global_cmvn.stats_npz_path。5.3 Agent 在线推理机制源码印证fairseq_simul_st_agent.py 中的FairseqSimulSTAgent实现了 SimulEval 的SpeechAgent协议核心机制在线特征提取OnlineFeatureExtractor按默认 25 ms 窗长 / 10 ms 移步--window-size 25/--shift-size 1016 kHz 采样率用kaldi.fbank流式生成 80 维 fbank并应用与训练一致的全局 CMVN 变换np.subtract/np.divide决策步长对齐speech_segment_size默认 40 ms4 倍池化比 × 10 ms 移步若解码器 attention 层带有pre_decision_ratio则speech_segment_size * pre_decision_ratio——即每读入40ms × fixed_pre_decision_ratio的音频才调用一次policy()与训练时的每 ratio 个编码器步做一次决策严格对齐READ/WRITE 循环policy()中把当前已读特征喂给 encoderupdate_model_encoder增量更新encoder_states随后执行 decoder 一步前向从返回的outputs.action得到READ_ACTION继续要音频或WRITE_ACTIONpredict()取 argmax 词元输出子词→词的去分词units_to_segment用 sentencepiece 的\u2581BOW 前缀判断词边界把子词拼成完整词再发给 SimulEval 服务端并受--max-len默认 200截断与--force-finish源音频未读完时是否强制结束控制模型加载load_model_vocab通过 checkpoint 中的cfg重建 task 与模型load_pretrained_encoder_from置空以保证strictTrue加载并设置torch.set_grad_enabled(False)。agent 暴露的常用参数包括--model-path必填、--data-bin必填、--config、--global-stats、--tgt-splitter-type/--tgt-splitter-path、--max-len、--force-finish以及特征窗口参数。5.4 参考结果与指标解读官方发布的convtransformer_wait5_pre7checkpointwait-5、预决策 280 ms 的模型在tst-COMMON上的评测结果为{ Quality: { BLEU: 13.94974229366959 }, Latency: { AL: 1751.8031870037803, AL_CA: 2338.5911762796536, AP: 0.7931395378788959, AP_CA: 0.9405103863210942, DAL: 1987.7811616943081, DAL_CA: 2425.2751560926167 } }指标含义均基于去分词文本计算Quality / BLEU去分词 BLEU因此必须保证发给 SimulEval 服务端的是完整词而非子词——这正是 agent 中units_to_segment的职责ALAverage Lagging平均滞后时间msAL_CA为 Context-Adaptive 变体把首词输出前的上下文填充时间剔除APAverage Proportion平均产出比例衡量输出进度对输入进度的跟随程度AP_CA为其上下文自适应版本DALDifferentiable Average Lagging可微平均滞后即训练阶段latency_augmented_label_smoothed_cross_entropy中用于反传的那个延迟量的在线实测值可与训练日志中的latency相互印证。带上--output ${OUTPUT}后详细日志逐句 READ/WRITE 事件、词元与延迟明细和分数会一并保存到${OUTPUT}目录便于复盘策略行为。6. 完整流程小结与注意事项阶段关键命令/文件产物数据准备prep_mustc_data.py--task asr/--task st*.zip、{split}_{task}.tsv、spm_*.model/.txt、gcmvn.npz、config_*.yamlASR 预训练fairseq-train--arch convtransformer_espnet${ASR_SAVE_DIR}/checkpoint_best.ptSimulST 训练fairseq-train--arch convtransformer_simul_trans_espnet--simul-type {waitk,infinite_lookback}_fixed_pre_decision${ST_SAVE_DIR}/checkpoint_*.pt评测数据切分seg_mustc_data.py${EVAL_DATA}/{split}.wav_list、{split}.{lang}在线评测simuleval fairseq_simul_st_agent.pyBLEU、AL/AP/DAL含_CA实操中需要特别注意的前置条件训练/评测命令均以在fairseqEdgeLM仓库根目录下运行为前提examples/speech_to_text/prep_mustc_data.py等路径都是相对该根目录MMA 变体的训练与延迟评测依赖 SimulEvalcriterion 初始化时即断言其存在需先pip install simuleval--data-bin与--config必须同源于同一份数据准备结果且--config传 basename评测 BLEU 基于去分词文本若自行修改 agent务必保留 BOW 前缀的词元拼接逻辑官方预训练 ASR checkpoint 与must_c_v1_en_deST 模型wait-5、280 ms 预决策均提供下载可跳过训练直接验证评测链路是否跑通再回头做自定义--waitk-lagging/--fixed-pre-decision-ratio的实验。掌握以上内容后你可以完整复现 MuST-C 英德方向 SimulST 的 wait-k 与 MMA 两类基线通过--waitk-lagging、--fixed-pre-decision-ratio、--latency-weight-avg等超参搜索延迟-质量折中并基于 SimulEval 日志对 READ/WRITE 决策行为做逐句分析。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价