FunASR简介

FunASR主要就是在语音识别的学术研究和工业应用之间架起一座桥梁,就是搞语音识别模型的

模型仓库

其中⭐为modelscope的模型仓库,🤗为Huggingface模型仓库

模型名字 任务详情 训练数据 参数量
Fun-ASR-Nano
( 🤗 )
语音识别,支持中文、英文与日语,其中中文支持7个方言,26个地方口音,英文与日语覆盖多地区口音,歌词识别,说唱等 数千万小时 800M
SenseVoiceSmall
( 🤗 )
多种语音理解能力,涵盖了自动语音识别(ASR)、语言识别(LID)、情感识别(SER)以及音频事件检测(AED) 400000 小时,中文 330M
paraformer-zh
( 🤗 )
语音识别,带时间戳输出,非实时 60000 小时,中文 220M
paraformer-zh-streaming
( 🤗 )
语音识别,实时 60000 小时,中文 220M
paraformer-en
( 🤗 )
语音识别,非实时 50000 小时,英文 220M
conformer-en
( 🤗 )
语音识别,非实时 50000 小时,英文 220M
ct-punc
( 🤗 )
标点恢复 100M,中文与英文 290M
fsmn-vad
( 🤗 )
语音端点检测,实时 5000 小时,中文与英文 0.4M
fsmn-kws
( )
语音唤醒,实时 5000 小时,中文 0.7M
fa-zh
( 🤗 )
字级别时间戳预测 50000 小时,中文 38M
cam++
( 🤗 )
说话人确认/分割 5000 小时 7.2M
Whisper-large-v3
( 🍀 )
语音识别,带时间戳输出,非实时 多语言 1550 M
Whisper-large-v3-turbo
( 🍀 )
语音识别,带时间戳输出,非实时 多语言 809 M
Qwen-Audio
( 🤗 )
音频文本多模态大模型(预训练) 多语言 8B
Qwen-Audio-Chat
( 🤗 )
音频文本多模态大模型(chat 版本) 多语言 8B
emotion2vec+large
( 🤗 )
情感识别模型 40000 小时,4 种情感类别 300M

环境配置

这几个东西是一定要装的:

1
2
3
4
5
6
python>=3.8
torch>=1.13
torchaudio
funasr
modelscope
huggingface

其余的依照模型仓库的文档来就好
用N卡的注意:
可以看到这里需要下载torch和torchaudio
但是,我还是推荐用conda虚拟环境来跑这个项目,而直接单独拉这俩文件是没法下载显卡的CUDA,这会导致我们只能用cpu跑这个模型,甚至没法跑成功(A卡和集显的我也没法子)
所以大家可以把这个文件里的torch和torchaudio都删掉,接着执行命令

1
2
pip install -r requirements.txt
pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu126 # 这里如果驱动版本过小需要下载对应版本的CUDA,你不打游戏的话直接更新最新驱动就好

这个命令就可以自动配置CUDA,咱跑模型的适合就可以拿显卡跑了
现在该配置的环境应该都搞定了

食用方法

参考https://github.com/modelscope/FunASR/blob/main/docs/tutorial/README_zh.md

cmd快速测试

如果你想快速测试模型是否可用,可使用cmd命令

1
funasr ++model=[模型名] ++vad_model="[语音端点检测模型]" ++punc_model="[标点恢复模型]" ++input=[测试案例路径.wav]

python代码调用

首先我们需要导入头文件

1
from funasr import AutoModel

指定要使用的模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
model = AutoModel(
model=[str],
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 60000},
punc_model="ct-punc",
spk_model="cam++"

device=[str],
ncpu=[int],
output_dir=[str],
batch_size=[int],
hub=[str],
**kwargs
)

其中

  • model(str): 模型仓库 中的模型名称,或本地磁盘中的模型路径
  • vad_model:语音端点检测模型,可用于检测长语音片段中有效语音的起止时间点,常为fsmn-vad,通常模型输入限制时长30s以下,组合vad_model后,支持任意时长音频输入
  • vad_kwargs(dict)用于指定vad_model相关参数,类似的有punc_kwargsspk_kwargs
  • spk_model:说话人确认模型(常为cam++)
  • model相关的参数可以直接在AutoModel定义中直接指定;
  • max_single_segment_time: 表示vad_model最大切割音频时 长, 单位是毫秒ms.

  • device(str):
    • cuda:0(默认gpu0),使用 GPU 进行推理,指定。
    • cpu,则使用 CPU 进行推理。
    • mps:mac电脑M系列新品试用mps进行推理。
    • xpu:使用英特尔gpu进行推理。
  • ncpu(int): 4 (默认),设置用于 CPU 内部操作并行性的线程数
  • output_dir(str): None (默认),如果设置,输出结果的输出路径
  • batch_size(int): 1 (默认),解码时的批处理,样本个数,适当减小该值,可以减少显存占用
  • hub(str):
    • ms(默认),从modelscope下载模型。
    • hf,从huggingface下载模型。
  • **kwargs(dict): 所有在config.yaml中参数,均可以直接在此处指定,例如,vad模型中最大切割长度 max_single_segment_time=6000 (毫秒)。

指定模型推理设置

1
2
3
4
5
6
7
8
res = model.generate(
input=[str],
output_dir=[str],
batch_size_s=300,
batch_size_threshold_s=60,
hotword='魔搭',
**kwargs
)
  • input: 要解码的输入,可以是:
    • wav文件路径, 例如: asr_example.wav(主要作用)
    • pcm文件路径, 例如: asr_example.pcm,此时需要指定音频采样率fs(默认为16000)
    • 音频字节数流,例如:麦克风的字节数数据
    • wav.scp,kaldi 样式的 wav 列表 (wav_id \t wav_path), 例如:
      1
      2
      asr_example1  ./audios/asr_example1.wav
      asr_example2 ./audios/asr_example2.wav
      在这种输入 wav.scp 的情况下,必须设置 output_dir 以保存输出结果
    • 音频采样点,例如:audio, rate = soundfile.read("asr_example_zh.wav"), 数据类型为 numpy.ndarray。支持batch输入,类型为list:

    [audio_sample1, audio_sample2, ..., audio_sampleN]

    • fbank输入,支持组batch。shape为[batch, frames, dim],类型为torch.Tensor,例如
  • output_dir: None (默认),如果设置,输出结果的输出路径
  • batch_size_s 表示采用动态batch,batch中总音频时长,单位为秒s。
  • batch_size_threshold_s: 表示vad_model切割后音频片段时长超过 batch_size_threshold_s阈值时,将batch_size数设置为1, 单位为秒s.
  • **kwargs(dict): 与模型相关的推理参数,例如,beam_size=10decoding_ctc_weight=0.1

输出

1
print(res)

建议:

当您输入为长音频,遇到OOM问题时,因为显存占用与音频时长呈平方关系增加,分为3种情况:

  • a)推理起始阶段,显存主要取决于batch_size_s,适当减小该值,可以减少显存占用;
  • b)推理中间阶段,遇到VAD切割的长音频片段,总token数小于batch_size_s,仍然出现OOM,可以适当减小batch_size_threshold_s,超过阈值,强制batch为1;
  • c)推理快结束阶段,遇到VAD切割的长音频片段,总token数小于batch_size_s,且超过阈值batch_size_threshold_s,强制batch为1,仍然出现OOM,可以适当减小max_single_segment_time,使得VAD切割音频时长变短。

ONNX标准化调用

我们下载下来的模型一般都是.pt结尾,这是一个’活着的’工程文件就像.blend,要做到快且通用还需要转化为.ONNX这个标准格式,就像.FBX

有两种将.pt->.ONNX的方法

从命令行导出

1
funasr-export ++model=[模型路径] ++quantize=false

从 Python 导出

1
2
3
from funasr import AutoModel
model = AutoModel(model="[模型路径]")
res = model.export(quantize=False)

执行

1
2
3
4
5
6
7
8
9
10
from funasr_onnx import Paraformer
from pathlib import Path

model_dir = "[模型路径,到模型目录即可]"
model = Paraformer(model_dir, batch_size=1, quantize=True)

wav_path = ['[测试音频路径.wav]']

result = model(wav_path)
print(result)

这个’quantize’可用改为false,用于量化可以减少内存占用
!!! 用ONNX性能好于.pt模型