FunASR模型训练与微调实战教程
FunASR模型训练与微调实战教程
本教程详细介绍了FunASR语音识别工具包的完整训练与微调流程,涵盖环境搭建、数据准备、工业预训练、模型微调以及性能优化等关键环节。通过本教程,您将掌握从基础环境配置到高级优化策略的全方位技能,能够构建高性能的语音识别系统。
训练环境搭建与数据准备
FunASR作为一个工业级的语音识别工具包,提供了完整的训练环境搭建和数据准备流程。本节将详细介绍如何搭建FunASR的训练环境以及准备训练数据,为后续的模型训练和微调奠定基础。
环境要求与安装
FunASR支持多种安装方式,推荐使用Python 3.8及以上版本,并确保系统已安装以下依赖:
# 基础依赖
python>=3.8
torch>=1.13
torchaudio
安装方式
方式一:通过PyPI安装(推荐)
pip3 install -U funasr
方式二:从源码安装
git clone https://gitcode.com/GitHub_Trending/fun/FunASR.git
cd FunASR
pip3 install -e ./
方式三:安装预训练模型支持(可选)
pip3 install -U modelscope huggingface_hub
硬件环境配置
FunASR支持多种硬件配置,以下是推荐的训练环境:
| 硬件组件 | 推荐配置 | 最低要求 |
|---|---|---|
| GPU | NVIDIA V100/A100 (32GB+) | NVIDIA GTX 1080 (8GB) |
| CPU | 16核心以上 | 8核心 |
| 内存 | 64GB+ | 32GB |
| 存储 | 1TB SSD | 500GB HDD |
数据准备流程
FunASR的数据准备遵循标准的Kaldi格式,主要包含以下步骤:
1. 数据目录结构
data/
├── train/
│ ├── wav.scp # 音频文件路径列表
│ ├── text # 对应的文本标注
│ └── utt2spk # 说话人信息(可选)
├── dev/ # 开发集
└── test/ # 测试集
2. 数据格式规范
wav.scp 格式:
utt_id1 /path/to/audio1.wav
utt_id2 /path/to/audio2.wav
text 格式:
utt_id1 这是第一段音频的文字内容
utt_id2 这是第二段音频的文字内容
3. 数据预处理脚本
FunASR提供了完整的数据预处理流水线,以下是一个典型的数据准备脚本:
#!/bin/bash
# 数据下载和解压
local/download_and_untar.sh ${raw_data} ${data_url} data_aishell
local/download_and_untar.sh ${raw_data} ${data_url} resource_aishell
# 数据准备
local/aishell_data_prep.sh ${raw_data}/data_aishell/wav ${raw_data}/data_aishell/transcript ${feats_dir}
# 格式转换
for x in train dev test; do
# 清理文本
cp ${feats_dir}/data/${x}/text ${feats_dir}/data/${x}/text.org
paste -d " " <(cut -f 1 -d" " ${feats_dir}/data/${x}/text.org) \
<(cut -f 2- -d" " ${feats_dir}/data/${x}/text.org | tr -d " ") \
> ${feats_dir}/data/${x}/text
# 转换为JSONL格式
scp_file_list_arg="++scp_file_list='[\"${feats_dir}/data/${x}/wav.scp\",\"${feats_dir}/data/${x}/text\"]'"
python ../../../funasr/datasets/audio_datasets/scp2jsonl.py \
++data_type_list='["source", "target"]' \
++jsonl_file_out=${feats_dir}/data/${x}/audio_datasets.jsonl \
${scp_file_list_arg}
done
特征提取与CMVN计算
FunASR使用80维FBank特征作为默认的音频特征,支持全局CMVN(Cepstral Mean and Variance Normalization)标准化。
特征提取配置
# frontend配置示例
frontend: WavFrontend
frontend_conf:
fs: 16000
window: hamming
n_mels: 80
frame_length: 25
frame_shift: 10
lfr_m: 1
lfr_n: 1
CMVN计算
# 计算CMVN统计量
python ../../../funasr/bin/compute_audio_cmvn.py \
--config-path "${workspace}/conf" \
--config-name "${config}" \
++train_data_set_list="${feats_dir}/data/${train_set}/audio_datasets.jsonl" \
++cmvn_file="${feats_dir}/data/${train_set}/cmvn.json"
词典构建
FunASR支持字符级和子词级tokenization,词典构建流程如下:
# 创建词典目录
mkdir -p ${feats_dir}/data/${lang}_token_list/$token_type/
# 构建基础词典
echo "<blank>" > ${token_list}
echo "<s>" >> ${token_list}
echo "</s>" >> ${token_list}
# 从训练文本中提取字符
utils/text2token.py -s 1 -n 1 --space "" ${feats_dir}/data/$train_set/text | \
cut -f 2- -d" " | tr " " "\n" | \
sort | uniq | grep -a -v -e '^\s*$' | awk '{print $0}' >> ${token_list}
echo "<unk>" >> ${token_list}
数据增强配置
FunASR支持多种数据增强技术,包括速度扰动和SpecAugment:
# 数据增强配置
preprocessor_speech: SpeechPreprocessSpeedPerturb
preprocessor_speech_conf:
speed_perturb: [0.9, 1.0, 1.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
训练数据流水线
FunASR的数据加载流程可以通过以下流程图展示:
环境验证
完成环境搭建和数据准备后,可以通过以下命令验证环境是否配置正确:
# 验证FunASR安装
python -c "import funasr; print('FunASR installed successfully')"
# 验证GPU支持
python -c "import torch; print(f'GPU available: {torch.cuda.is_available()}')"
# 验证数据格式
python -c "
import json
with open('data/train/audio_datasets.jsonl', 'r') as f:
sample = json.loads(f.readline())
print('Data format check passed')
"
常见问题解决
- 内存不足:减少batch_size或使用梯度累积
- 显存不足:使用混合精度训练或模型并行
- 数据格式错误:检查JSONL文件格式是否符合规范
- 依赖冲突:使用conda创建虚拟环境隔离依赖
通过本节的内容,您已经完成了FunASR训练环境的搭建和数据准备工作,为后续的模型训练和微调做好了充分准备。
工业数据预训练流程
FunASR提供了完整的工业数据预训练解决方案,支持多种先进的语音识别模型架构。工业数据预训练流程涵盖了从数据准备、模型配置、训练优化到模型导出的完整生命周期,为大规模工业应用提供了强有力的技术支撑。
数据准备与格式转换
工业数据预训练首先需要规范化的数据格式。FunASR支持标准的Kaldi格式数据,通过scp2jsonl工具将wav.scp和text.txt文件转换为训练所需的jsonl格式。
# 数据格式转换示例
scp2jsonl \
++scp_file_list='["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt"]' \
++data_type_list='["source", "target"]' \
++jsonl_file_out="${train_data}"
转换后的jsonl格式包含音频路径和对应文本标注,便于模型训练时高效读取和处理。
多模型架构支持
FunASR工业预训练支持多种先进的语音识别模型架构:
| 模型类型 | 特点 | 适用场景 |
|---|---|---|
| Paraformer | 非自回归,高效推理 | 高并发实时识别 |
| Conformer | 卷积增强Transformer | 高精度识别 |
| Whisper | 多语言通用模型 | 跨语言应用 |
| Sense Voice | 感知语音模型 | 复杂环境鲁棒性 |
| Streaming Models | 流式处理 | 实时语音交互 |
分布式训练配置
工业级训练支持多机多卡分布式训练,通过DeepSpeed优化训练效率:
# DeepSpeed配置示例 (ds_stage1.json)
{
"train_batch_size": 16,
"train_micro_batch_size_per_gpu": 4,
"gradient_accumulation_steps": 1,
"optimizer": {
"type": "AdamW",
"params": {
"lr": 0.0001,
"betas": [0.9, 0.999],
"eps": 1e-8,
"weight_decay": 0.01
}
},
"fp16": {
"enabled": true,
"auto_cast": false,
"loss_scale": 0,
"initial_scale_power": 16,
"loss_scale_window": 1000,
"hysteresis": 2,
"min_loss_scale": 1
}
}
训练流程优化
关键训练参数详解
工业预训练中的重要参数配置:
# 训练参数配置示例
train_conf = {
"max_epoch": 50, # 最大训练轮次
"log_interval": 1, # 日志间隔
"resume": True, # 断点续训
"validate_interval": 2000, # 验证间隔
"save_checkpoint_interval": 2000, # 保存间隔
"keep_nbest_models": 20, # 保留最佳模型数
"avg_nbest_model": 10, # 模型平均数量
"use_deepspeed": False, # 使用DeepSpeed
}
dataset_conf = {
"batch_sampler": "BatchSampler", # 批采样器
"batch_size": 6000, # 批大小(token数)
"sort_size": 1024, # 排序大小
"batch_type": "token", # 批类型(token/example)
"num_workers": 4, # 数据加载线程数
}
模型导出与部署
训练完成后,支持多种格式的模型导出:
# ONNX格式导出
python export.py ++model=./outputs/avg_10.pth ++export_type=onnx
# TorchScript格式导出
python export.py ++model=./outputs/avg_10.pth ++export_type=torchscript
# 本地推理测试
python demo.py ++model=./outputs/avg_10.pth ++input=test.wav
性能监控与调优
工业训练过程中的性能监控指标:
| 监控指标 | 说明 | 优化目标 |
|---|---|---|
| WER (词错误率) | 识别准确率 | 降低至行业标准 |
| RTF (实时因子) | 推理速度 | 小于0.1 |
| GPU利用率 | 计算资源使用 | 保持在80%以上 |
| 内存占用 | 显存使用 | 避免OOM |
通过系统的工业数据预训练流程,FunASR能够为不同规模的语音识别应用提供稳定可靠的模型训练解决方案,满足工业级部署的高标准要求。
模型微调与迁移学习实战
FunASR提供了强大的模型微调与迁移学习能力,让开发者能够基于预训练模型快速适配特定领域和场景。通过利用大规模工业数据预训练的模型作为起点,可以在少量标注数据上实现出色的性能提升。
微调策略与配置
FunASR支持多种微调策略,包括全参数微调、部分层冻结微调、以及LoRA等参数高效微调方法。
冻结层配置示例
在模型配置文件中,可以通过freeze参数控制特定组件的冻结状态:
# 冻结音频编码器
audio_encoder: "iic/Whisper-large-v3"
audio_encoder_conf:
hub: ms
freeze: true
# 冻结语言模型
llm: Qwen1.5-7b-chat
llm_conf:
hub: hf
freeze: true
训练参数配置
微调时的关键训练参数配置:
train_conf:
accum_grad: 1
grad_clip: 5
max_epoch: 15
keep_nbest_models: 10
log_interval: 10
optim: adamw
optim_conf:
lr: 0.0001 # 较小的学习率
weight_decay: 0.000000
scheduler: warmuplr
scheduler_conf:
warmup_steps: 1500
数据准备与格式
微调需要准备特定格式的训练数据,FunASR支持多种数据格式:
JSONL格式数据示例
{"source": "path/to/audio1.wav", "target": "这是测试音频一"}
{"source": "path/to/audio2.wav", "target": "这是第二个测试音频"}
{"source": "path/to/audio3.wav", "target": "hello world"}
数据预处理脚本
使用内置工具转换数据格式:
# 从Kaldi格式转换到JSONL
scp2jsonl \
++scp_file_list='["train_wav.scp", "train_text.txt"]' \
++data_type_list='["source", "target"]' \
++jsonl_file_out="train.jsonl"
微调流程详解
完整的微调脚本
#!/bin/bash
workspace=`pwd`
# GPU配置
export CUDA_VISIBLE_DEVICES="0,1"
gpu_num=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')
# 模型配置
model_name_or_model_dir="iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch"
# 数据路径
data_dir="../../../data/list"
train_data="${data_dir}/train.jsonl"
val_data="${data_dir}/val.jsonl"
# 输出目录
output_dir="./outputs"
log_file="${output_dir}/log.txt"
# DeepSpeed配置
deepspeed_config=${workspace}/../../ds_stage1.json
mkdir -p ${output_dir}
# 分布式训练参数
DISTRIBUTED_ARGS="
--nnodes ${WORLD_SIZE:-1} \
--nproc_per_node $gpu_num \
--node_rank ${RANK:-0} \
--master_addr ${MASTER_ADDR:-127.0.0.1} \
--master_port ${MASTER_PORT:-26669}
"
# 启动训练
torchrun $DISTRIBUTED_ARGS \
../../../funasr/bin/train_ds.py \
++model="${model_name_or_model_dir}" \
++train_data_set_list="${train_data}" \
++valid_data_set_list="${val_data}" \
++dataset="AudioDataset" \
++dataset_conf.index_ds="IndexDSJsonl" \
++dataset_conf.batch_sampler="BatchSampler" \
++dataset_conf.batch_size=6000 \
++dataset_conf.sort_size=1024 \
++dataset_conf.batch_type="token" \
++dataset_conf.num_workers=4 \
++train_conf.max_epoch=50 \
++train_conf.log_interval=1 \
++train_conf.resume=true \
++train_conf.validate_interval=2000 \
++train_conf.save_checkpoint_interval=2000 \
++train_conf.keep_nbest_models=20 \
++train_conf.avg_nbest_model=10 \
++train_conf.use_deepspeed=false \
++train_conf.deepspeed_config=${deepspeed_config} \
++optim_conf.lr=0.0002 \
++output_dir="${output_dir}" &> ${log_file}
迁移学习场景
跨语言迁移
领域适配
| 源领域 | 目标领域 | 适配策略 | 效果提升 |
|---|---|---|---|
| 通用语音 | 医疗语音 | 领域数据微调 | CER降低35% |
| 普通话 | 方言 | 发音词典适配 | WER降低28% |
| 朗读语音 | 会议语音 | 噪声增强训练 |
更多推荐


所有评论(0)