7.5 KiB
快速开始
在此我们将以"使用AISHELL-1数据集,从随机初始化训练一个paraformer模型"为例,介绍如何使用FunASR。根据这个例子,用户可以类似地使用别的数据集(如AISHELL-2数据集等)训练别的模型(如conformer,transformer等)。
整体介绍
我们提供了egs/aishell/paraformer/run.sh来实现使用AISHELL-1数据集训练一个paraformer模型。该脚本包含5个阶段,包括从数据处理到训练解码等整个流程,同时提供了单/多GPU训练和CPU/GPU解码。在详细介绍每个阶段之前,我们先对用户需要手动设置的一些参数进行说明。
CUDA_VISIBLE_DEVICES: 可用的GPU列表gpu_num: 用于训练的GPU数量gpu_inference: 是否使用GPU进行解码njob: for CPU decoding, indicating the total number of CPU jobs; for GPU decoding, indicating the number of jobs on each GPU. 对于CPU解码,表示解码任务数;对于GPU解码data_aishell: AISHELL-1原始数据的路径feats_dir: 经过处理得到的特征的保存路径nj: 数据处理时的并行任务数speed_perturb: 变速设置exp_dir: 实验结果的保存路径tag: 实验结果目录的后缀名
阶段 0: 数据准备
本阶段用于处理原始的AISHELL-1数据,并生成相应的wav.scp和text,保存在$feats_dir/data/xxx目录下,这里的xxx表示train, dev 或 test(下同)。 这里我们假设用户已经下载好了AISHELL-1数据集。如果没有,用户可以在这里 下载数据,并将$data_aishell设置为相应的路径。下面给出生成的wav.scp和text的示例:
本阶段用于处理原始的AISHELL-1数据,并生成相应的wav.scp和text,保存在$feats_dir/data/xxx目录下,这里的xxx表示train, dev 或 test(下同)。 这里我们假设用户已经下载好了AISHELL-1数据集。如果没有,用户可以在这里 下载数据,并将$data_aishell设置为相应的路径。下面给出生成的wav.scp和text的示例:
wav.scp
BAC009S0002W0122 /nfs/ASR_DATA/AISHELL-1/data_aishell/wav/train/S0002/BAC009S0002W0122.wav
BAC009S0002W0123 /nfs/ASR_DATA/AISHELL-1/data_aishell/wav/train/S0002/BAC009S0002W0123.wav
BAC009S0002W0124 /nfs/ASR_DATA/AISHELL-1/data_aishell/wav/train/S0002/BAC009S0002W0124.wav
...
text
BAC009S0002W0122 而 对 楼 市 成 交 抑 制 作 用 最 大 的 限 购
BAC009S0002W0123 也 成 为 地 方 政 府 的 眼 中 钉
BAC009S0002W0124 自 六 月 底 呼 和 浩 特 市 率 先 宣 布 取 消 限 购 后
...
可以看到,这两个文件均包括两列,第一列是音频的id,第二列分别是音频路径和音频对应的抄本。
阶段 1:特征提取
本阶段将会基于原始的音频wav.scp提取FBank特征。如果指定了参数speed_perturb,则会额外对音频进行变速来实现数据增强。用户可以设置nj参数来控制特征提取的并行任务数。处理后的特征保存在目录$feats_dir/dump/xxx/ark下,相应的feats.scp文件路径为$feats_dir/dump/xxx/feats.scp。下面给出feats.scp的示例:
feats.scp
...
BAC009S0002W0122_sp0.9 /nfs/funasr_data/aishell-1/dump/fbank/train/ark/feats.16.ark:592751055
...
注意,该文件的样本顺序已经进行了随机打乱。该文件包括两列,第一列是音频的id,第二列是对应的kaldi-ark格式的特征。另外,在此阶段还会生成训练需要用到的speech_shape和text_shape两个文件,记录了每个样本的特征维度和抄本长度。下面给出这两个文件的示例:
speech_shape
...
BAC009S0002W0122_sp0.9 665,80
...
text_shape
...
BAC009S0002W0122_sp0.9 15
...
可以看到,这两个文件均包括两列,第一列是音频的id,第二列是对应的特征的维度和抄本的长度。
阶段 2:字典准备
本阶段用于生成字典,用于训练过程中,字符到整数索引之间的映射。生成的字典文件的路径为$feats_dir/data/zh_toekn_list/char/tokens.txt。下面给出tokens.txt的示例:
tokens.txt
<blank>
<s>
</s>
一
丁
...
龚
龟
<unk>
<blank>: 表示CTC训练中的blank<s>: 表示句子的起始符</s>: 表示句子的终止符<unk>: 表示字典外的字符
阶段 3:训练
本阶段对应模型的训练。在开始训练之前,需要指定实验结果保存目录exp_dir,训练可用GPUCUDA_VISIBLE_DEVICES和训练的gpu数量gpu_num。默认情况下,最好的$keep_nbest_models模型结果会被平均从而来获取更好的性能。
- DDP Training
我们提供了分布式训练(DDP)功能,具体的细节可以在这里 找到。为了开启分布式训练,需要设置gpu_num大于1。例如,设置CUDA_VISIBLE_DEVICES=0,1,5,6,7,gpu_num=3,则编号为0,1和5的GPU会被用于训练。
- DataLoader
我们提供了基于Pytorch Iterable-style DataPipes 实现的大数据DataLoader,用户可以通过设置dataset_type=large来启用。
- Configuration
训练相关的参数,包括模型,优化器,数据等,均可以通过conf目录下的config文件指定。同时,用户也可以直接在run.sh脚本中指定相关参数。请避免在config文件和run.sh脚本中设置相同的参数,以免造成歧义。
- Training Steps
我们提供了两种方式来控制训练的总步数,对应的参数分别为max_epoch和max_update。max_epoch表示训练的最大epoch数,max_update表示训练的最大迭代次数。如果这两个参数同时被指定,则一旦训练步数到达其中任意一个参数,训练结束。
- Tensorboard
用户可以通过tensorboard来观察训练过程中的损失,学习率等。可以通过下述指定来实现:
tensorboard --logdir ${exp_dir}/exp/${model_dir}/tensorboard/train
阶段 4: 解码
本阶段用于解码得到识别结果,同时计算CER来验证训练得到的模型性能。
- Mode Selection
由于我们提供了paraformer,uniasr和conformer等模型,因此在解码时,需要指定相应的解码模式。对应的参数为mode,相应的可选设置为asr/paraformer/uniasr等。
- Configuration
我们提供了ctc解码, attention解码和ctc-attention混合解码。这几种解码方式可以通过conf下的解码配置文件中的ctc_weight参数来指定。具体的,ctc_weight=1.0表示CTC解码, ctc_weight=0.0表示attention解码, 0.0<ctc_weight<1.0表示ctc-attention混合解码。
- CPU/GPU Decoding
我们提供CPU/GPU解码。对于CPU解码,用户需要设置gpu_inference=False,同时设置njob来指定并行解码任务数量。对于GPU解码,用户需要设置gpu_inference=True,设置gpuid_list来指定哪些GPU用于解码,设置njobs来指定每张GPU上的并行解码任务数量。
- Performance
我们采用CER来验证模型的性能。解码结果保存在$exp_dir/exp/$model_dir/$decoding_yaml_name/$average_model_name/$dset,具体包括text.cer和text.cer.txt两个文件。text.cer中的内容为识别结果和对应抄本之间的比较,text.cer.txt记录了最终的CER。下面给出text.cer的示例:
text.cer
...
BAC009S0764W0213(nwords=11,cor=11,ins=0,del=0,sub=0) corr=100.00%,cer=0.00%
ref: 构 建 良 好 的 旅 游 市 场 环 境
res: 构 建 良 好 的 旅 游 市 场 环 境
...