FunASR语音识别模型使用指南:从推理到训练全流程解析
项目概述
FunASR是一个开源的语音识别框架,提供了大量基于工业数据预训练的语音处理模型。这些模型涵盖了语音识别、语音活动检测、标点恢复等多个语音处理任务,支持多种语言和场景的应用。
模型推理指南
快速开始
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", # 使用GPU
ncpu=4, # CPU线程数
output_dir=None, # 结果输出目录
batch_size=1, # 批处理大小
hub="ms", # 模型下载源
**kwargs # 其他模型配置参数
)
典型应用场景
1. 非流式语音识别
SenseVoice模型示例:
model = AutoModel(
model="iic/SenseVoiceSmall",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cuda:0"
)
res = model.generate(
input="音频文件路径.mp3",
language="auto", # 自动检测语言
use_itn=True, # 启用逆文本归一化
batch_size_s=60 # 动态批处理(秒)
)
Paraformer模型示例:
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='关键词' # 热词增强
)
2. 流式语音识别
model = AutoModel(model="paraformer-zh-streaming")
chunk_size = [0, 10, 5] # 600ms实时+300ms前瞻
chunk_stride = 960 # 600ms采样点数
for i in range(total_chunk_num):
speech_chunk = 获取音频片段()
is_final = (i == total_chunk_num - 1)
res = model.generate(
input=speech_chunk,
cache=cache,
is_final=is_final,
chunk_size=chunk_size
)
print(res)
3. 语音活动检测(VAD)
非流式VAD:
model = AutoModel(model="fsmn-vad")
res = model.generate(input="音频.wav")
# 输出格式: [[开始1,结束1], [开始2,结束2], ...] (毫秒)
流式VAD:
model = AutoModel(model="fsmn-vad")
chunk_size = 200 # 毫秒
for i in range(total_chunk_num):
speech_chunk = 获取音频片段()
is_final = (i == total_chunk_num - 1)
res = model.generate(
input=speech_chunk,
cache=cache,
is_final=is_final,
chunk_size=chunk_size
)
# 可能输出: [[beg,-1]], [[-1,end]], []等
4. 标点恢复
model = AutoModel(model="ct-punc")
res = model.generate(input="无标点文本")
print(res) # 输出带标点的文本
模型训练指南
快速开始
推荐使用Python脚本进行训练:
cd examples/industrial_data_pretraining/paraformer
bash finetune.sh
训练参数详解
funasr/bin/train.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/length/token)batch_size
: 批处理大小(样本数/帧数/token数)max_epoch
: 训练总轮次lr
: 学习率
多GPU训练配置
单机多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} --master_port 12345 \
funasr/bin/train.py ${train_args}
多机多GPU
主节点(IP:192.168.1.1):
torchrun --nnodes 2 --node_rank 0 --nproc_per_node ${gpu_num} \
--master_addr 192.168.1.1 --master_port 12345 \
funasr/bin/train.py ${train_args}
工作节点:
torchrun --nnodes 2 --node_rank 1 --nproc_per_node ${gpu_num} \
--master_addr 192.168.1.1 --master_port 12345 \
funasr/bin/train.py ${train_args}
数据准备
训练数据需要准备为jsonl格式,可以从wav.scp和text.txt转换而来:
转换命令
:
scp2jsonl \
++scp_file_list='["train_wav.scp", "train_text.txt"]' \
++data_type_list='["source", "target"]' \
++jsonl_file_out="train.jsonl"
常见问题解决
-
内存不足(OOM)问题:
- 降低
batch_size_s
值 - 调整
batch_size_threshold_s
阈值 - 减小
max_single_segment_time
值
- 降低
-
长音频处理:
- 结合VAD模型分割长音频
- 使用动态批处理(batch_size_s)
-
流式处理延迟:
- 通过
chunk_size
参数控制实时性 - 平衡延迟和准确率
- 通过
通过本指南,您可以快速掌握FunASR模型的使用方法,从基础推理到高级训练,满足不同场景下的语音处理需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考