FunASR语音识别模型教程:从推理到训练全流程指南
项目概述
FunASR是一个开源的语音识别工具包,提供了大量基于工业数据预训练的语音处理模型。该项目支持语音识别(ASR)、语音活动检测(VAD)、标点恢复(PUNC)等多种语音处理任务,同时提供了从模型推理到训练的全套解决方案。
模型推理指南
快速开始
FunASR提供了两种简单的模型调用方式:
命令行方式:
funasr ++model=paraformer-zh ++vad_model="fsmn-vad" ++punc_model="ct-punc" ++input=asr_example_zh.wav
Python API方式(推荐):
from funasr import AutoModel
model = AutoModel(model="paraformer-zh")
res = model.generate(input="音频文件.wav")
print(res)
AutoModel核心参数详解
model = AutoModel(
model="模型名称或路径",
device="cuda:0", # 指定计算设备
ncpu=4, # CPU线程数
output_dir=None, # 结果输出目录
batch_size=1, # 批处理大小
hub="ms", # 模型下载源
**kwargs # 其他模型特定参数
)
典型应用场景
1. 非流式语音识别
model = AutoModel(
model="paraformer-zh",
vad_model="fsmn-vad",
punc_model="ct-punc"
)
res = model.generate(
input="长音频.wav",
batch_size_s=300, # 动态批处理总时长(秒)
batch_size_threshold_s=60, # 单音频最大时长阈值
hotword="关键词" # 热词增强
)
内存优化技巧:
- 减少
batch_size_s
降低初始内存 - 调整
batch_size_threshold_s
处理长音频 - 修改
max_single_segment_time
控制VAD分段长度
2. 流式语音识别
model = AutoModel(model="paraformer-zh-streaming")
# 流式处理参数
chunk_size = [0, 10, 5] # 600ms实时+300ms前瞻
chunk_stride = 960 # 600ms采样点数
for i in range(总段数):
is_final = (i == 总段数-1)
res = model.generate(
input=音频段,
cache=cache,
is_final=is_final,
chunk_size=chunk_size
)
3. 语音活动检测(VAD)
离线模式:
model = AutoModel(model="fsmn-vad")
res = model.generate(input="音频.wav")
# 输出格式: [[开始1,结束1], [开始2,结束2], ...] (毫秒)
流式模式:
for 音频段 in 流式音频:
res = model.generate(
input=音频段,
cache=cache,
is_final=是否最后一段,
chunk_size=200 # 200ms
)
# 可能输出: [[beg,-1]], [[-1,end]], []等状态
4. 标点恢复
model = AutoModel(model="ct-punc")
res = model.generate(input="无标点文本")
5. 时间戳预测
model = AutoModel(model="fa-zh")
res = model.generate(
input=("音频.wav", "文本.txt"),
data_type=("sound", "text")
)
模型训练指南
快速开始
Python方式(推荐):
cd examples/industrial_data_pretraining/paraformer
bash finetune.sh
训练参数详解
funasr/bin/train_ds.py \
++model="模型名称或路径" \
++train_data_set_list="训练数据.jsonl" \
++valid_data_set_list="验证数据.jsonl" \
++dataset_conf.batch_size=20000 \
++dataset_conf.batch_type="token" \ # 动态批处理
++train_conf.max_epoch=50 \
++optim_conf.lr=0.0002 \
++output_dir="输出路径"
关键参数说明:
batch_type
: 可选"example"(固定样本数)/"token"(动态批处理)batch_size
: 与batch_type配合使用validate_interval
: 验证间隔步数save_checkpoint_interval
: 模型保存间隔
分布式训练方案
单机多GPU训练
export CUDA_VISIBLE_DEVICES="0,1"
gpu_num=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')
torchrun --nnodes 1 --nproc_per_node ${gpu_num} \
funasr/bin/train_ds.py ${train_args}
多机多GPU训练
主节点(IP:192.168.1.1):
torchrun --nnodes 2 --node_rank 0 ... --master_addr=192.168.1.1 ...
工作节点:
torchrun --nnodes 2 --node_rank 1 ... --master_addr=192.168.1.1 ...
数据准备
-
准备标准格式文件:
train_wav.scp
: 音频ID与路径映射train_text.txt
: 音频ID与文本映射
-
转换为JSONL格式:
scp2jsonl \
++scp_file_list='["wav.scp", "text.txt"]' \
++data_type_list='["source", "target"]' \
++jsonl_file_out="train.jsonl"
大规模数据训练技巧
当数据量极大(如>5万小时)时,可采用分片策略:
- 将数据拆分为多个JSONL分片
- 创建
data.list
列出所有分片路径 - 训练时设置:
++train_data_set_list="data.list" \
++dataset_conf.data_split_num=256 # 分片组数
注意:应确保各分片组数据分布均衡
训练监控
训练日志包含丰富信息:
[时间][rank][INFO] - train, epoch: 0/50, step: 6990/1,
loss_avg_epoch: 0.409,
ppl_avg_epoch: 1.506,
acc_avg_epoch: 0.795,
lr: 1.165e-04,
[('loss_att', 0.259), ('acc', 0.825)],
GPU memory: usage: 3.830 GB
关键指标:
- loss_avg_epoch: 平均损失
- ppl_avg_epoch: 困惑度
- acc_avg_epoch: 准确率
- GPU内存使用情况
结语
FunASR提供了一套完整的语音识别解决方案,从即用型的预训练模型到自定义训练流程,支持多种语音处理任务。通过本教程,您可以快速掌握FunASR的核心功能,包括模型推理、流式处理、分布式训练等高级特性。无论是研究还是工业应用,FunASR都能提供强大的支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考