之前的工作主要是计算机视觉方向,大模型盛行下开始接触大语言模型和多模态模型,但是一直也没有机会接触语音识别方向的算法,比较好奇, 前两天刷到一个科普小视频提到FunASR这个开源工具,今天介绍一个语音识别领域的开源工具-FunASR。
GitHub
一、简介
FunASR 是阿里巴巴达摩院开源的一款轻量级语音识别工具包,旨在为开发者提供高效、易用的语音处理解决方案。它集成了多种先进的语音识别技术和模型,支持语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等功能;
二、功能实现
2.1 环境安装
2.1.1 依赖环境
# 依赖环境
python>=3.8
torch>=1.13
torchaudio
2.1.2 pip安装
pip3 install -U funasr
pip3 install -U modelscope huggingface huggingface_hub
2.2 功能实现
2.2.1 语音识别
- 定义:将语音信号转换为文本的过程。
- 目标:将人类语言的音频输入转化为可读的文本输出。
- 应用场景:语音助手、字幕生成、会议记录等。
2.2.1.1 基于SenseVoice模型的语音识别
# 语音识别-SenseVoice
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocessmodel_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="./gy.m4a",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)
参数:
model_dir
:模型名称,或本地磁盘中的模型路径;vad_model
:表示开启VAD,VAD的作用是将长音频切割成短音频,此时推理耗时包括了VAD与SenseVoice总耗时,为链路耗时,如果需要单独测试SenseVoice模型耗时,可以关闭VAD模型;vad_kwargs
:表示VAD模型配置,max_single_segment_time
: 表示vad_model
最大切割音频时长, 单位是毫秒ms;use_itn
:输出结果中是否包含标点与逆文本正则化;batch_size_s:
表示采用动态batch,batch中总音频时长,单位为秒s;merge_vad
:是否将 vad 模型切割的短音频碎片合成,合并后长度为merge_length_s
,单位为秒s;ban_emo_unk
:禁用emo_unk标签,禁用后所有的句子都会被赋与情感标签;
输出结果:
2.2.1.2 基于paraformer模型的语音识别
# 语音识别-paraformer
from funasr import AutoModel
# paraformer-zh is a multi-functional asr model
# use vad, punc, spk or not as you need
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc", # spk_model="cam++")
res = model.generate(input="./gy.m4a", batch_size_s=300, hotword='魔搭')
print(res)
输出结果:
输出结果包含文件名、语音识别文本以及每个文本字符在音频中的时间跨度,单位毫秒;
2.2.2 语音端点检测 (VAD,Voice Activity Detection)
- 定义:检测语音信号中的有效语音片段,去除静音或背景噪声。
- 目标:确定语音开始和结束的时间点。
- 应用场景:优化语音识别性能、降低计算资源消耗。
2.2.2.1 基于fsmn-vad模型的语音端点检测
# 语音端点检测-fsmn-vad
from funasr import AutoModelmodel = AutoModel(model="fsmn-vad")# wav_file = f"{model.model_path}/example/vad_example.wav"
wav_file = './gy.m4a'
res = model.generate(input=wav_file)
print(res)
输出结果:
输出结果包含文件名和连续有效语音时间跨度时间戳,单位毫秒;
2.2.3 标点恢复
- 定义:在语音识别生成的文本中添加正确的标点符号。
- 目标:提高文本的可读性和语义完整性。
- 应用场景:自动生成带标点的会议记录、实时字幕。
2.2.3.1 基于ct-punc模型的标点补全
# 标点恢复-ct-punc
from funasr import AutoModelmodel = AutoModel(model="ct-punc")res = model.generate(input="势如破竹 三国末年 晋武帝司马炎夺取魏国政权后 准备出兵攻打吴国 可当时朝廷中许多大臣都认为吴国占据着长江天险 水军非常强大 应该等到有了足够的准备后再攻打吴国 可是大将杜禹却认为现在正是消灭吴国最好的时机 不能给他喘息的机会 于是 晋武帝向自己最信任的大臣张华征求了意见 张华听了 连忙说 理应尽快攻打吴果 以免留下后患 晋武帝闻言立即下令道 好 那便封杜誉为征南大将军 即刻攻打吴国 杜豫的军队十分勇勇猛 连续攻下吴国的江陵湘江直逼吴国国都建邺 晋武帝大月准备下令让杜豫从小路向吴国国都建业进发 可有些朝臣认为 如今长江水势大涨 恐怕会影响作战 不如先收兵等冬天再战 但是杜玉坚决反对退兵 他说 现在我们的军队势如破竹 斗志阵望 取得了一个又一个的胜利 只要一鼓作气就能攻破建业 果然正如杜豫所言 没过多久便攻占了建 业灭掉了吴国 帮助晋武帝完成了统一中原的大业")
print(res)
输出结果:
2.2.4 说话人验证(声纹识别)
- 定义:验证某段语音是否属于特定说话人。
- 目标:确认身份。
- 应用场景:语音解锁、身份认证。
2.2.4.1 基于CAM++模型的声纹识别
# 说话人确认-CAM++
from modelscope.pipelines import pipeline
sv_pipeline = pipeline(task='speaker-verification',model='damo/speech_campplus_sv_zh-cn_16k-common',model_revision='v1.0.0'
)
speaker1_a_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker1_a_cn_16k.wav'
speaker1_b_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker1_b_cn_16k.wav'
speaker2_a_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker2_a_cn_16k.wav'# 相同说话人语音
result = sv_pipeline([speaker1_a_wav, speaker1_b_wav])
print(result)
输出结果:
输出结果包含相似度和识别结果;
三、总结
任务名称 | 主要目标 | 应用场景 | 技术特点 |
---|---|---|---|
ASR | 将语音转为文本 | 字幕生成、语音助手 | 声学模型+语言模型 |
VAD | 检测语音活动 | 语音信号预处理 | 时间域或频域特征分析 |
标点恢复 | 添加标点符号 | 自动化文本生成 | 上下文语义理解 |
说话人验证 | 确认语音归属 | 身份认证 | 声学特征提取+相似度比较 |
FunASR工具箱包含了很多处理语音数据的深度学习模型集合,这里只是简单的呈现了部分功能,先Mark住,有需要的朋友也可以做更加深入的探索。