ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FunASR 实战:基于 AISHELL-1 从零训练 Paraformer 非自回归 ASR 的完整指南

FunASR 实战:基于 AISHELL-1 从零训练 Paraformer 非自回归 ASR 的完整指南 FunASR 实战基于 AISHELL-1 从零训练 Paraformer 非自回归 ASR 的完整指南【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR本文以 FunASR 仓库中的 AISHELL-1 Paraformer 训练示例 为主线系统讲解 Paraformer 非自回归端到端语音识别模型的训练配置、数据准备、特征提取、训练与评估全流程。读完本文你将掌握如何在 AISHELL-1 中文普通话语料上复现 ParaformerConformer 编码器从数据下载、cmvn 统计、词表构建到多卡训练、推理与 CER 指标计算的完整实战方案并能直接改造脚本用于自己的数据集微调与推理。一、Paraformer 是什么非自回归 ASR 的核心思路Paraformer 是达摩院语音实验室提出的非自回归Non-autoregressiveNAR端到端 ASR 模型其核心思想是在传统 Encoder-Decoder 框架中引入CIFContinuous Integrate-and-Fire预测器让模型在编码器输出上直接预测目标 token 的数量与位置从而一次性并行生成整句结果避免自回归解码的逐 token 串行计算显著提升推理速度。在 FunASR 仓库中Paraformer 的完整实现位于 funasr/models/paraformer/其中model.py 定义了Paraformer主模型类注册名为model_classes / Paraformer其 docstring 明确列出核心特性并行解码的 NAR 推理、基于 CIF predictor 的字级时间戳、流式/离线两种模式、热词定制、说话人分离支持配合 spk_model以及 ONNX 导出能力cif_predictor.py 实现了CifPredictor注册名predictor_classes / CifPredictor通过一维深度卷积与 sigmoid 门控输出累积激活分数alphas再经cif积分-触发机制切分出声学嵌入acoustic embeds与峰值位置decoder.py 提供ParaformerSANDecoder等解码器结构。与逐 token 自回归模型不同Paraformer 的推理流程是编码器提取特征 → CIF 预测器确定 token 数量与边界 → 解码器对所有 token 并行计算输出。你可以在 model.py 的inference方法中看到这条完整调用链encode→calc_predictor→cal_decoder_with_predictor这也是本示例训练出的模型实际运行时的推理路径。二、AISHELL-1 示例整体概览与预训练基线本示例的入口是 examples/aishell/paraformer/目录结构如下文件作用run.sh端到端训练流水线脚本stage -1 5demo_train_or_finetune.sh精简版训练/微调脚本便于接入自有数据demo_infer.sh单条音频推理脚本conf/paraformer_conformer_12e_6d_2048_256.yaml核心训练配置12 层 Conformer 编码器 6 层 SAN 解码器local/aishell_data_prep.shAISHELL-1 原始数据整理脚本local/download_and_untar.sh数据下载脚本utils/文本 tokenize、文本规范化、CER 计算等工具脚本该示例对应的预训练基线模型为 ModelScope 上的speech_paraformer_asr_nat-aishell1-pytorch可直接加载使用本文聚焦于如何在自己的环境中完整复现训练与评估。三、训练配置逐项解析paraformer_conformer_12e_6d_2048_256.yaml原 README 给出的训练配置要点是80 维 fbank 特征、全局 CMVN、速度扰动0.9/1.0/1.1、SpecAugment 增强。这些参数在 conf/paraformer_conformer_12e_6d_2048_256.yaml 中有完整定义下面按模块拆解3.1 网络结构model_confmodel: Paraformer model_conf: ctc_weight: 0.3 lsm_weight: 0.1 length_normalized_loss: false predictor_weight: 1.0 sampling_ratio: 0.4 use_1st_decoder_loss: truectc_weight: 0.3CTC 分支损失权重。训练时总损失为ctc_weight * loss_ctc (1 - ctc_weight) * loss_att loss_pre * predictor_weight见 model.py 的损失聚合逻辑。注意训练用 0.3而解码阶段可配置为 0.0 或 0.5详见第五节lsm_weight: 0.1标签平滑label smoothing权重用于缓解过拟合predictor_weight: 1.0CIF 预测器损失mae_loss即预测 token 长度与真实长度的 MAE的权重sampling_ratio: 0.4训练时的采样器比例。Paraformer 训练采用一种半监督式采样策略——解码器输入是预测声学嵌入 真实 token 嵌入的混合其中sampling_ratio控制有多少比例的预测错误位置被替换为真实 tokensampler方法在 model.py 中实现该机制能大幅提升非自回归训练稳定性use_1st_decoder_loss: true是否对解码器第一次前向输出计算 loss。3.2 编码器12 层 Conformerencoder: ConformerEncoder encoder_conf: output_size: 256 # attention 维度 attention_heads: 4 linear_units: 2048 # 前馈网络隐层维度 num_blocks: 12 # 编码器 block 数 dropout_rate: 0.1 positional_dropout_rate: 0.1 attention_dropout_rate: 0.0 input_layer: conv2d # 编码器输入层类型 normalize_before: true pos_enc_layer_type: rel_pos selfattention_layer_type: rel_selfattn activation_type: swish macaron_style: true use_cnn_module: true cnn_module_kernel: 1512e_6d 即 12 层编码器Conformer 6 层解码器2048_256 指前馈网络维度 2048、注意力维度 256。编码器采用相对位置编码与相对自注意力、macaron 风格前馈、swish 激活、kernel 为 15 的 CNN 模块这些都是 Conformer 的经典配置。3.3 解码器与预测器decoder: ParaformerSANDecoder decoder_conf: attention_heads: 4 linear_units: 2048 num_blocks: 6 dropout_rate: 0.1 positional_dropout_rate: 0.1 self_attention_dropout_rate: 0.0 src_attention_dropout_rate: 0.0 predictor: CifPredictor predictor_conf: idim: 256 threshold: 1.0 l_order: 1 r_order: 1 tail_threshold: 0.45解码器为ParaformerSANDecoderSANSelf-Attention Network6 层结构。预测器为CifPredictor其核心超参在 cif_predictor.py 中定义threshold: 1.0CIF 积分触发的累计阈值决定一个 token 何时被fire出来l_order/r_orderCIF 前的一维深度卷积的左右感受野ConstantPad1d((l_order, r_order), 0)Conv1d(idim, idim, l_order r_order 1, groupsidim)tail_threshold: 0.45尾部残差处理阈值。推理时alphas经tail_process_fn处理避免尾部信息丢失对应 cif_predictor.py 起的尾部处理逻辑。3.4 前端特征与数据增强frontend: WavFrontend frontend_conf: fs: 16000 window: hamming n_mels: 80 frame_length: 25 frame_shift: 10 lfr_m: 1 lfr_n: 1 specaug: SpecAug specaug_conf: apply_time_warp: true time_warp_window: 5 time_warp_mode: bicubic apply_freq_mask: true freq_mask_width_range: [0, 30] num_freq_mask: 2 apply_time_mask: true time_mask_width_range: [0, 40] num_time_mask: 2前端采用 16kHz 采样率、汉明窗、80 维 mel-filterbank帧长 25ms、帧移 10ms不做 LFR 下采样lfr_m: 1, lfr_n: 1训练时启用 SpecAugment时域扭曲窗口 5、频域掩蔽宽度 0~302 个掩蔽、时域掩蔽宽度 0~402 个掩蔽。3.5 优化器、调度器与数据集optim: adam optim_conf: lr: 0.0005 scheduler: warmuplr scheduler_conf: warmup_steps: 30000 train_conf: accum_grad: 1 grad_clip: 5 max_epoch: 150 keep_nbest_models: 10 avg_nbest_model: 10 log_interval: 50 dataset: AudioDataset dataset_conf: index_ds: IndexDSJsonl batch_sampler: EspnetStyleBatchSampler batch_type: length # example 或 length batch_size: 25000 # length 模式下为 source_token_len target_token_len 之和 max_token_length: 2048 buffer_size: 1024 shuffle: True num_workers: 4 preprocessor_speech: SpeechPreprocessSpeedPerturb preprocessor_speech_conf: speed_perturb: [0.9, 1.0, 1.1]这与原 README 的lr 5e-4、batch_size 25000、2 卡 V100、acc_grad 1、50 epochs描述一致README 中 50 epochs 对应论文复现周期配置文件默认max_epoch: 150可按需调整。要点采用warmuplr学习率调度warmup 步数 30000batch_type: length时batch_size表示一个 batch 内源 token 长度 目标 token 长度的总和max_token_length: 2048用于过滤过长的样本速度扰动speed perturb在preprocessor_speech_conf中配置为[0.9, 1.0, 1.1]即训练时按 0.9/1.0/1.1 三档变速扩充数据这是提升鲁棒性的关键手段全局 CMVN 通过 run.sh 中的compute_audio_cmvn.py在 stage 1 计算frontend_conf.cmvn_file在训练/推理时注入对应am.mvn文件分词器为CharTokenizer中文按字切分词表由 stage 2 生成。四、端到端训练流水线run.sh 的 stage 解析run.sh 是完整的复现脚本通过stage/stop_stage控制执行区间先source utils/parse_options.sh解析命令行参数CUDA_VISIBLE_DEVICES0,1 feats_dir../DATA # 特征输出目录 exp_dirpwd langzh token_typechar stage0 stop_stage5 nj32 # 并行 job 数 inference_devicecuda inference_checkpointmodel.pt.avg10 # 默认用 10 个 best 模型平均后的 checkpoint 推理 inference_scpwav.scp inference_batch_size32 raw_data../raw_data data_urlwww.openslr.org/resources/33 # AISHELL-1 下载源 tagexp1 master_port12345各 stage 职责如下Stage功能关键命令-1数据下载AISHELL-1 的data_aishell与resource_aishelldownload_and_untar.sh0数据准备整理 wav.scp/text去除空格并 tokenize生成 jsonlaishell_data_prep.sh funasr/datasets/audio_datasets/scp2jsonl.py1特征与 CMVN 统计funasr/bin/compute_audio_cmvn.py2词表构建blank/s//s/unk 语料字符utils/text2token.py3LM 训练本示例不使用 LM为空操作—4ASR 训练torchrun 多卡启动funasr/bin/train.py5推理 后处理 CER 计算funasr/bin/inference.py postprocess_text_zh.py compute_wer.py4.1 Stage 0数据准备aishell_data_prep.sh 将原始 wav 按wav/train、wav/dev、wav/test目录划分出训练/验证/测试集并通过filter_scp.pl与转录文本对齐生成wav.scp与text。随后 run.sh 对文本做去空格tr -d 与字符级 tokenize最终用scp2jsonl.py将wav.scpsource与texttarget合并为 FunASR 训练所需的audio_datasets.jsonlpython ../../../funasr/datasets/audio_datasets/scp2jsonl.py \ scp_file_list[${feats_dir}/data/${x}/wav.scp,${feats_dir}/data/${x}/text] \ data_type_list[source, target] \ jsonl_file_out${feats_dir}/data/${x}/audio_datasets.jsonl4.2 Stage 1 2CMVN 统计与词表CMVN 统计基于训练集 jsonl 计算全局均值/方差并保存为am.mvn训练时由frontend_conf.cmvn_file指定词表则按blank、s、/s、语料字符、unk的顺序生成到tokens.txt供 tokenizer 使用。4.3 Stage 4多卡训练训练通过torchrun分布式启动GPU 数量由CUDA_VISIBLE_DEVICES自动推导export CUDA_VISIBLE_DEVICES$CUDA_VISIBLE_DEVICES gpu_num$(echo $CUDA_VISIBLE_DEVICES | awk -F , {print NF}) torchrun \ --nnodes 1 \ --nproc_per_node ${gpu_num} \ --master_port ${master_port} \ ../../../funasr/bin/train.py \ --config-path ${workspace}/conf \ --config-name ${config} \ train_data_set_list${feats_dir}/data/${train_set}/audio_datasets.jsonl \ valid_data_set_list${feats_dir}/data/${valid_set}/audio_datasets.jsonl \ tokenizer_conf.token_list${token_list} \ frontend_conf.cmvn_file${feats_dir}/data/${train_set}/am.mvn \ output_dir${exp_dir}/exp/${model_dir} ${log_file}模型目录名规则为baseline_paraformer_conformer_12e_6d_2048_256_zh_char_${tag}训练日志写入exp/${model_dir}/train.log.txt.${当前时间}。4.4 Stage 5推理与 CER 评估推理同样多进程并行按nj将wav.scp切分为多个分片每个分片调用 inference.py配置取自训练产出的config.yaml用init_param指定 checkpoint。默认inference_checkpointmodel.pt.avg10——训练配置中keep_nbest_models: 10与avg_nbest_model: 10会保留 10 个最优模型并做参数平均平均后的模型通常泛化更好。评估流程为python utils/postprocess_text_zh.py ${inference_dir}/1best_recog/text ${inference_dir}/1best_recog/text.proc python utils/postprocess_text_zh.py ${data_dir}/text ${inference_dir}/1best_recog/text.ref python utils/compute_wer.py ${inference_dir}/1best_recog/text.ref ${inference_dir}/1best_recog/text.proc ${inference_dir}/1best_recog/text.cer tail -n 3 ${inference_dir}/1best_recog/text.cer其中 postprocess_text_zh.py 负责去除s//s/unk/等标记、去空格并转小写、按字切分使假设与参考对齐compute_wer.py 则用动态规划Levenshtein逐句计算插入/删除/替换错误数汇总输出%WER与%SER。五、结果与解码配置CER原 README 给出了两种解码配置下的 CER 结果该 README 对应的训练周期为 50 epochs解码配置一conf/decode_asr_transformer_noctc_1best.yamlctc weight: 0.0纯注意力解码取 1-besttestsetCER(%)dev4.66test5.11解码配置二conf/decode_asr_transformer.yamlctc weight: 0.5CTC 与注意力联合打分testsetCER(%)dev4.52test4.94对比可见解码时引入 CTC 分支参与打分ctc weight 0.5比纯注意力解码0.0能进一步降低 CERdev 与 test 上分别降低约 0.14 与 0.17 个百分点。这一现象与 model.py 中init_beam_search的实现对应当解码时decoding_ctc_weight 0时会构建包含CTCPrefixScorer与LengthBonus的 beam search 打分器CTC 前缀分数作为额外证据参与路径排序。需要注意这两个解码配置文件位于原实验目录中README 中标注为conf/下的解码配置当前仓库 examples/aishell/paraformer/conf/ 仅保留了训练配置paraformer_conformer_12e_6d_2048_256.yaml如需复现解码配置差异可在训练产出的exp/${model_dir}目录下基于config.yaml构造对应解码参数ctc_weight: 0.0与ctc_weight: 0.5分别推理。六、自有数据训练与微调demo_train_or_finetune.sh如果不想走完整的 AISHELL-1 流水线可以直接使用精简脚本 demo_train_or_finetune.sh 接入自己的数据。它要求数据目录包含train.jsonl、val.jsonl、tokens.json或tokens.txt与am.mvnexport CUDA_VISIBLE_DEVICES0,1 gpu_num$(echo $CUDA_VISIBLE_DEVICES | awk -F , {print NF}) data_dir/path/to/your/data/list # 含 train.jsonl, val.jsonl, tokens, am.mvn train_data${data_dir}/train.jsonl val_data${data_dir}/val.jsonl tokens${data_dir}/tokens.json cmvn_file${data_dir}/am.mvn output_dir/path/to/exp configparaformer_conformer_12e_6d_2048_256.yaml init_param${output_dir}/model.pt # 微调时指向预训练/已有模型 torchrun \ --nnodes 1 \ --nproc_per_node ${gpu_num} \ ../../../funasr/bin/train.py \ --config-path ${workspace}/conf \ --config-name ${config} \ train_data_set_list${train_data} \ valid_data_set_list${val_data} \ tokenizer_conf.token_list${tokens} \ frontend_conf.cmvn_file${cmvn_file} \ dataset_conf.batch_size32 \ dataset_conf.batch_typeexample \ dataset_conf.num_workers4 \ train_conf.max_epoch150 \ optim_conf.lr0.0002 \ init_param${init_param} \ output_dir${output_dir} ${log_file}该脚本演示了如何通过前缀覆盖 yaml 中的任意配置项FunASR 基于 Hydra 的配置覆盖机制dataset_conf.batch_size32与dataset_conf.batch_typeexample切换为按样本数 32 组 batchoptim_conf.lr0.0002微调时通常降低学习率init_param${init_param}加载预训练 checkpoint微调场景。如果从零训练init_param一行可省略若只有wav.scp与text.txt可先用脚本中注释的scp2jsonl命令生成 jsonl。七、单条音频快速推理demo_infer.sh训练或微调完成后可用 demo_infer.sh 对单条 wav 做快速验证python -m funasr.bin.inference \ --config-path/path/to/exp/baseline_paraformer_conformer_12e_6d_2048_256_zh_char_exp3 \ --config-nameconfig.yaml \ init_param/path/to/exp/.../model.pt.ep38 \ tokenizer_conf.token_list/path/to/tokens.txt \ frontend_conf.cmvn_file/path/to/train/am.mvn \ input/path/to/BAC009S0002W0122.wav \ output_dir./outputs/debug \ devicecuda:0关键点--config-path指向训练产出的exp目录内含训练时保存的config.yaml--config-nameconfig.yaml直接复用训练配置init_param指定具体 checkpoint可以是model.pt.avg10平均模型也可以是model.pt.ep38等指定 epoch 模型input支持单条 wav 路径批量推理时传入wav.scp分片即可。八、总结通过本示例你可以完整掌握 FunASR 中 Paraformer 的实战链路数据侧AISHELL-1 的下载、wav.scp/text整理、jsonl 转换、全局 CMVN 统计与字符词表构建训练侧paraformer_conformer_12e_6d_2048_256.yaml中 12 层 Conformer 6 层 SAN 解码器 CIF 预测器的完整参数语义以及速度扰动、SpecAugment、标签平滑、采样器sampling_ratio等训练技巧评估侧inference.py多进程并行解码 postprocess_text_zh.py文本规范化 compute_wer.py动态规划 CER 计算的完整评估流程并理解解码时 CTC 权重对 CER 的影响扩展侧通过demo_train_or_finetune.sh的覆盖机制快速迁移到自有数据训练或预训练模型微调。仓库内的相关源码Paraformer 模型实现、CIF 预测器、训练入口、推理入口与测试用例如 tests/test_paraformer_timestamp_contract.py、tests/test_paraformer_timestamp_padding.py可作为进一步深入研究的起点。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表