原文: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功能呢? 说到此,不禁想再给阿里点一个赞。