ASR引擎测试:FunASR,必须给阿里点一个赞

773 阅读6分钟

原文:www.oddmeta.net/archives/16…

前两天试了一下小红书开源出来的FireRedASR,整体感觉是小红书团队只是把关键的语音识别的模型开放出来了(也只开放了-L的模型),但是由于缺了一些前处理(语音VAD检测)、后处理(标点,多人语音聚类,热词等)相关的功能,普通用户拿到他们这个模型也根本没法直接拿来用,所以个人的观点是对于开源FireRedASR来说,小红书团队的诚意是不够的。 而光嘴巴说他们诚意不够是不能令人信服的,所以咱把阿里在2年多前开源出来的FunASR拿出来介绍一下,诚意够不够让大家自己体会。

一、FunASR介绍

FunASR是一个由阿里巴巴达摩院开发的开源语音识别工具包,旨在为学术研究和工业应用提供桥梁。它支持多种语音识别功能,包括语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别。FunASR提供了便捷的脚本和教程,支持预训练模型的推理与微调,帮助用户快速构建高效的语音识别服务。

支持各种音视频格式输入,可以把几十个小时的长音频与视频识别成带标点的文字,支持上百路请求同时进行转写 支持中文、英文、日文、粤语和韩语等。

在线体验:www.funasr.com/

注: FunASR是支持GPU推理加速的,不像阿云早先的一个私有云版本的ASR引擎那样,只用CPU来推理的。

二、FunAsr核心功能

1。功能列表

  • 语音识别(ASR):支持离线和实时语音识别。
  • 语音端点检测(VAD):检测语音信号的起始和结束。
  • 标点恢复:自动添加标点符号,提高文本可读性。
  • 语言模型:支持多种语言模型的集成。
  • 说话人验证:验证说话人的身份。
  • 说话人分离:区分不同说话人的语音。
  • 多人对话语音识别:支持多人同时对话的语音识别。
  • 模型推理与微调:提供预训练模型的推理和微调功能。

2。离线语音识别

拥有完整的语音识别链路,结合了语音端点检测、语音识别、标点等模型,可以将几十个小时的长音频与视频识别成带标点的文字,而且支持上百路请求同时进行转写。输出为带标点的文字,含有字级别时间戳,支持ITN与用户自定义热词等。

3。实时听写

FunASR实时语音听写软件包,集成了实时版本的语音端点检测模型、语音识别、语音识别、标点预测模型等。采用多模型协同,既可以实时的进行语音转文字,也可以在说话句尾用高精度转写文字修正输出,输出文字带有标点,支持多路请求。依据使用者场景不同,支持实时语音听写服务(online)、非实时一句话转写(offline)与实时与非实时一体化协同(2pass)3种服务模式。

三、安装部署

1。Requirements

python>=3.8
torch>=1.13
torchaudio

2。创建虚拟环境

conda create --prefix=/root/autodl-tmp/jacky/envs/funasr python==3.12.3 conda activate /root/autodl-tmp/jacky/envs/funasr

3。安装

  • 直接安装 pip3 install -U funasr
  • 源码安装 git clone github.com/alibaba/Fun… && cd FunASR pip3 install -e ./ pip install -r requirements.txt export MODEL_DIR=/root/autodl-tmp/FunAsr

4。下载模型

pip3 install -U modelscope huggingface_hub

四、测试运行

1。ASR转写

  • 命令行模式 funasr ++model=paraformer-zh ++vad_model="fsmn-vad" ++punc_model="ct-punc" ++input=asr_example_zh.wav

  • python 调用离线文件转写

from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess

model_dir = "iic/SenseVoiceSmall"

model = AutoModel(
    model=model_dir,
    vad_model="fsmn-vad",
    vad_kwargs={"max_single_segment_time": 30000},
    device="cuda:0",
)

# en
res = model.generate(
    input=f"{model.model_path}/example/en.mp3",
    cache={},
    language="auto",  # "zn", "en", "yue", "ja", "ko", "nospeech"
    use_itn=True,
    batch_size_s=60,
    merge_vad=True,  #
    merge_length_s=15,
)
text = rich_transcription_postprocess(res[0]["text"])
print(text)
  • python调用实时听写
from funasr import AutoModel

chunk_size = [0, 10, 5] #[0, 10, 5] 600ms, [0, 8, 4] 480ms
encoder_chunk_look_back = 4 #number of chunks to lookback for encoder self-attention
decoder_chunk_look_back = 1 #number of encoder chunks to lookback for decoder cross-attention

model = AutoModel(model="paraformer-zh-streaming")

import soundfile
import os

wav_file = os.path.join(model.model_path, "example/asr_example.wav")
speech, sample_rate = soundfile.read(wav_file)
chunk_stride = chunk_size[1] * 960 # 600ms

cache = {}
total_chunk_num = int(len((speech)-1)/chunk_stride+1)
for i in range(total_chunk_num):
    speech_chunk = speech[i*chunk_stride:(i+1)*chunk_stride]
    is_final = i == total_chunk_num - 1
    res = model.generate(input=speech_chunk, cache=cache, is_final=is_final, chunk_size=chunk_size, encoder_chunk_look_back=encoder_chunk_look_back, decoder_chunk_look_back=decoder_chunk_look_back)
    print(res)

2。VAD检测

对于语音转来说的,非常重要的一个前处理,尤其是针对文件转写来说,通常都需要先检测一下VAD,如果没有VAD,那么那一段时间的音频可以直接扔掉;另外,如果需要将大文件做切片的时候也需要根据VAD来做切片。哪怕转写出来文字后,要进行分段处理,那VAD的情况也是一个重要的参考指标。

  • 命令行模式
python vad.py --model fsmn-vad --input oddmeta_com.wav
  • python调用模式
from funasr import AutoModel
vad_model = AutoModel.from_pretrained("fsmn-vad")
vad_result = vad_model.detect("oddmeta_com.wav")
print(vad_result)

3。标点恢复

我相信没人想要一陀没有任何标点符号的文本吧。FunASR的ct-punc模型可以帮你处理标点符号的恢复。

  • 命令行模式
python punctuate.py --model ct-punc --input oddmeta_com.txt
  • python调用模式
from funasr import AutoModel
punc_model = AutoModel.from_pretrained("ct-punc")
punc_result = punc_model.punctuate("oddmeta_com.txt")
print(punc_result)

4。说话人验证

如果你想做一些说话人验证的产品和功能的时候,FunASR的这个speaker-verification模型可以直接拿来用。

  • 命令行模式
python verify.py --model speaker-verification --input oddmeta_com.wav
  • python调用模式
from funasr import AutoModel
verify_model = AutoModel.from_pretrained("speaker-verification")
verify_result = verify_model.verify("oddmeta_com.wav")
print(verify_result)

5。多人对话语音识别

多人对话的语音识别,做到基于聚类的角色分离。这也是语音转写里很重要的一个功能需求。

  • 命令行模式
python multi_asr.py --model multi-talker-asr --input your_audio.wav
  • python调用模式
from funasr import AutoModel
multi_asr_model = AutoModel.from_pretrained("multi-talker-asr")
multi_asr_result = multi_asr_model.recognize("oddmeta_com.wav")
print(multi_asr_result)

凭良心讲,阿里在开源FunASR的时候是真的够诚意,很地道。FunASR这玩意儿TMD基本上就是一个商业化的东西直接开源出来给大家用了。 这一点其他的一些团队是真的可以再好好学习和思考一下的。 当然,你要说诸如FireRedASR所缺失的一些功能,可以让开发者自己再结合诸如FunASR的各种模型来自行实现,这样说是没错,但是如果不是专门搞ASR/STT的开发者,又会有几个人愿意拿一个半吊子的东西,自己再往上面做各种缝缝补补然后才能实现一个完整的ASR功能呢? 说到此,不禁想再给阿里点一个赞。