FunASR详解
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 | python>=3.8 |
其余的依照模型仓库的文档来就好
用N卡的注意:
可以看到这里需要下载torch和torchaudio
但是,我还是推荐用conda虚拟环境来跑这个项目,而直接单独拉这俩文件是没法下载显卡的CUDA,这会导致我们只能用cpu跑这个模型,甚至没法跑成功(A卡和集显的我也没法子)
所以大家可以把这个文件里的torch和torchaudio都删掉,接着执行命令
1 | pip install -r requirements.txt |
这个命令就可以自动配置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 | model = AutoModel( |
其中
model(str): 模型仓库 中的模型名称,或本地磁盘中的模型路径vad_model:语音端点检测模型,可用于检测长语音片段中有效语音的起止时间点,常为fsmn-vad,通常模型输入限制时长30s以下,组合vad_model后,支持任意时长音频输入vad_kwargs(dict)用于指定vad_model相关参数,类似的有punc_kwargs,spk_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 | res = model.generate( |
input: 要解码的输入,可以是:- wav文件路径, 例如: asr_example.wav(主要作用)
- pcm文件路径, 例如: asr_example.pcm,此时需要指定音频采样率fs(默认为16000)
- 音频字节数流,例如:麦克风的字节数数据
- wav.scp,kaldi 样式的 wav 列表 (
wav_id \t wav_path), 例如:在这种输入1
2asr_example1 ./audios/asr_example1.wav
asr_example2 ./audios/asr_example2.wavwav.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=10,decoding_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 | from funasr import AutoModel |
执行
1 | from funasr_onnx import Paraformer |
这个’quantize’可用改为false,用于量化可以减少内存占用
!!! 用ONNX性能好于.pt模型
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 YSir_Blog!