自动语音识别(多任务处理)
自动语音识别(多任务处理)
这是ESPnet2中ASR1多任务配方的模板。本README提供了关于如何增强ASR1以实现基于提示的多任务学习的全面指导。
目录
配方流程
ASR1配方包含13个阶段。
- 数据准备
数据准备阶段。
ESPnet格式:
它会调用local/data.sh在data/目录下创建Kaldi风格的数据目录,用于训练集、验证集和评估集。除了asr1配方中的文件外,它还会生成一个名为prompt的附加文件,用于指定针对给定话语要执行的任务。
prompt格式uttidA <prompt> uttidB <prompt> ...
另请参阅:
- 速度扰动
通过速度扰动增强训练数据。将生成data/${train_set}_spXX(XX表示速度因子)。此步骤是可选的。
- 生成转储文件夹
转储阶段。此阶段将训练所需的文件从data文件夹移动到dump文件夹。
- 移除长/短数据
此阶段与ASR配方中的阶段相同。在此阶段,所有要进行多任务处理的数据集的转储目录通过简单拼接合并。
- 输入/输出令牌列表生成
为输入和目标生成标记列表(BPE/字符等)。此外,对于Whisper标记化,您可以选择使用--nlsyms_txt标志将特殊标记纳入Whisper词汇表。如果您正在使用任务指定器进行基于提示的多任务处理(类似于原始Whisper公式),则必须将这些任务指定器包含在Whisper词汇表中。
- 语言模型统计信息收集
基于神经网络(NN)的语言模型(LM)是ASR任务的可选组件。您可以通过设置--use_lm false跳过第5-8阶段。统计计算阶段会收集LM文本的形状信息,并计算用于LM训练的统计数据。
- 语言模型训练
基于神经网络的LM模型训练阶段。您可以通过--lm_config和--lm_args选项来更改训练设置。
另请参阅:
- 语言模型困惑度
基于神经网络的LM评估阶段。困惑度(PPL)是针对训练好的模型计算的
另请参阅:
- N-gram语言模型训练
基于N-gram的语言模型训练阶段。
- ASR统计信息收集
统计计算阶段。该阶段收集ASR训练中输入和输出文本的形状信息。
基于提示的多任务处理
- Instructions:
- 要在英语多任务学习中启用基于提示的多任务学习,请确保将
--use_prompt设置为True。默认情况下,该设置会用提示文件中指定的任务标识符替换Whisper公式中的任务标识符,从而实现英语多任务学习。关于如何向Whisper词汇表添加任务标识符的说明,请参阅第5阶段。 - 如果希望在多语言环境下基于提示进行多任务学习,请额外将
--use_lang_prompt设为true。此步骤会将Whisper公式中的语言和任务标识符替换为提示文件中指定的内容,并可引入新的数据集标识符。请注意,要使该选项生效,必须确保任务、数据集和语言标识符都包含在Whisper词汇表中。 - (可选) 要使用自然语言短语进行基于提示的多任务处理,请将
--use_nlp_prompt设为true。这种情况下,您无需对Whisper词汇表做任何修改。
- 要在英语多任务学习中启用基于提示的多任务学习,请确保将
- ASR 训练
ASR模型训练阶段。您可以通过--asr_config和--asr_args选项更改训练设置。您需要按照阶段10中描述的类似步骤执行基于提示的多任务学习。
另请参阅:
- ASR推理
ASR推理阶段。
基于提示的多任务处理
- Instructions:
- 如果您在Whisper词汇表中加入了任何特殊标记,请确保在解码器配置中将包含这些特殊标记的文件指定为
prompt_token_file。 - 如果您正在使用任务、语言和数据集指定符,请在解码器配置中将这些指定符设置为
lang_prompt_token。 - 如果使用自然语言短语作为提示,请在解码器配置中将该短语指定为
nlp_prompt_token。 - 为了实现语言识别和语音活动检测,我们遵循Whisper的预训练设置,即在转录标签开始后立即预测
language id和no speech标签。因此对于这些任务,请将lid prompt设为true。
- 如果您在Whisper词汇表中加入了任何特殊标记,请确保在解码器配置中将包含这些特殊标记的文件指定为
- ASR评分
ASR评分阶段:计算错误率(字符/单词/标记)。
- (可选) 打包结果以上传
打包阶段。它将训练好的模型文件打包,准备上传至Hugging Face。
另请参阅:
15: (可选) 上传模型
将训练好的模型上传至Hugging Face以便分享。更多信息请参阅Docs。
如何运行
SLU多任务训练
这里,我们展示了在14个语音分类任务上运行多任务学习的过程。
使用以下配方创建转储目录:asvspoof, speechcommands, grabo, lt_speech_commands, arabic_sc, fsc, voxforge/lid1, iemocap, accentdb, mustard, mustard_plus_plus, voxceleb1, freesound 和 esc50。您可以通过在每个配方中运行以下命令来实现:
$ ./run.sh --stop_stage 4注意:在创建转储目录之前,请先下载所有数据集压缩文件。请参考https://github.com/ga642381/SpeechPrompt-v2/blob/main/docs/dataset.md下载所有数据集。
转到egs2/uslu14/asr1配方目录。通过运行以下命令生成prompt文件
$ python local/create_*_prompt.py将所有转储目录中的训练和验证转储文件夹内的wav.scp, prompt, text, utt2spk, spk2utt, utt2num_samples文件进行合并,并创建两个新目录dump/raw/train_combined和dump/raw/valid来存放合并后的数据。然后使用以下命令开始训练:
$ ./run.sh --stage 5 --stop_stage 11对每个数据集(即test_)运行解码,使用指定的推理配置(例如conf/decode_asr_),通过以下命令:
$ ./run.sh --stage 12 --stop_stage 12 --inference_config conf/decode_asr_<task>.yaml --test_sets test_<dataset>对于某些任务,您需要使用python local/clean_emotion_pred.py、python local/check_lid_results.py、python local/check_vad_results.py清理预测文件。要获取准确率,请运行
$ ./run.sh --stage 13 --stop_stage 13 --inference_config conf/decode_asr_<task>.yaml --test_sets test_<dataset>对于需要计算f1或weighted_f1的任务,请运行python local/compute_f1.py和python local/compute_weighted_f1.py。
相关工作
@misc{arora2023universlu,
title={UniverSLU: Universal Spoken Language Understanding for Diverse Classification and Sequence Generation Tasks with a Single Network},
author={Siddhant Arora and Hayato Futami and Jee-weon Jung and Yifan Peng and Roshan Sharma and Yosuke Kashiwagi and Emiru Tsunoo and Shinji Watanabe},
year={2023},
eprint={2310.02973},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@InProceedings{pmlr-v202-radford23a,
title = {Robust Speech Recognition via Large-Scale Weak Supervision},
author = {Radford, Alec and Kim, Jong Wook and Xu, Tao and Brockman, Greg and Mcleavey, Christine and Sutskever, Ilya},
booktitle = {Proceedings of the 40th International Conference on Machine Learning},
pages = {28492--28518},
year = {2023},
editor = {Krause, Andreas and Brunskill, Emma and Cho, Kyunghyun and Engelhardt, Barbara and Sabato, Sivan and Scarlett, Jonathan},
volume = {202},
series = {Proceedings of Machine Learning Research},
month = {23--29 Jul},
publisher = {PMLR},
}