FunASR模型训练与微调实战教程

【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-processing etc. 【免费下载链接】FunASR 项目地址: https://gitcode.com/GitHub_Trending/fun/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的数据加载流程可以通过以下流程图展示:

mermaid

环境验证

完成环境搭建和数据准备后,可以通过以下命令验证环境是否配置正确:

# 验证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')
"

常见问题解决

  1. 内存不足:减少batch_size或使用梯度累积
  2. 显存不足:使用混合精度训练或模型并行
  3. 数据格式错误:检查JSONL文件格式是否符合规范
  4. 依赖冲突:使用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
  }
}

训练流程优化

mermaid

关键训练参数详解

工业预训练中的重要参数配置:

# 训练参数配置示例
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}

迁移学习场景

跨语言迁移

mermaid

领域适配
源领域 目标领域 适配策略 效果提升
通用语音 医疗语音 领域数据微调 CER降低35%
普通话 方言 发音词典适配 WER降低28%
朗读语音 会议语音 噪声增强训练

【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-processing etc. 【免费下载链接】FunASR 项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐