【学习心得】基于FunASR推理的SenseVoiceSmall模型来实现语音识别

一、介绍一下SenseVoiceSmall

1、什么是SenseVoiceSmall

**SenseVoice**是多语言音频理解模型,支持语音识别、语种识别、语音情感识别、声学事件检测、逆文本正则化等能力,采用工业级数十万小时的标注音频进行模型训练,保证了模型的通用识别效果。模型可以被应用于中文、粤语、英语、日语、韩语音频识别,并输出带有情感和事件的富文本转写结果。

2、怎么下载模型权重

SenseVoice 魔搭社区https://www.modelscope.cn/models/iic/SenseVoiceSmall/summary

bash 复制代码
pip install modelscope

modelscope download --model iic/SenseVoiceSmall --local_dir ./SenseVoiceSmall

二、介绍一下FunASR推理框架

1、什么是FunASR

FunASR 是由阿里巴巴达摩院推出的一个开源端到端语音识别工具包,致力于在学术研究与工业应用之间架起桥梁。它支持语音识别(ASR)、语音活动检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离、多说话人语音识别等多种功能,并提供丰富的预训练模型和便捷的部署方式,非常适合研究者和开发者使用。

2、使用音频文件来进行语音识别

python 复制代码
# 导入FunASR的自动模型类
from funasr import AutoModel
# 导入后处理工具,用于美化转写结果
from funasr.utils.postprocess_utils import rich_transcription_postprocess

# 指定预训练模型路径
model_dir = "/root/workspace/models/SenseVoiceSamll"


# 初始化AutoModel实例,加载SenseVoice模型及相关配置
model = AutoModel(
    model=model_dir,                                    # 模型路径
    trust_remote_code=True,                             # 允许加载远程代码
    remote_code="/root/workspace/SenseVoice/model.py",  # 远程模型定义文件
    vad_model="fsmn-vad",                               # 使用FSMN-VAD进行语音活动检测
    vad_kwargs={"max_single_segment_time": 30000},     # VAD最大分段时长30秒
    device="cuda:0",                                    # 使用第一块GPU
)

# 对指定音频文件进行语音识别(示例为中文音频)
res = model.generate(
    input=f"{model.model_path}/example/zh.mp3",  # 输入音频文件路径
    cache={},                                    # 初始缓存为空
    language="auto",                            # 自动检测语言,也可手动指定"zh","en","yue","ja","ko","nospeech"
    use_itn=True,                               # 启用逆文本规范化(ITN)
    batch_size_s=60,                            # 每批处理60秒音频
    merge_vad=True,                             # 合并VAD分段结果
    merge_length_s=15,                          # 合并后每段最长15秒
)

# 使用rich_transcription_postprocess美化转写文本
text = rich_transcription_postprocess(res[0]["text"])
# 打印最终转写结果
print(text)

3、使用麦克风收音实时语音识别

你要先安装souddevice库

bash 复制代码
pip install sounddevice

如果你在Linux系统下,sounddevice 依赖系统级的 PortAudio 动态库( libportaudio.so )可以执行下面的代码来解决:

bash 复制代码
# 解决方法一:使用 Conda 安装 PortAudio:
conda install -c conda-forge portaudio

# 解决方法二:使用系统包管理器安装
sudo apt-get update && sudo apt-get install -y portaudio19-dev libportaudio2

# 最后重新安装一下 Python 包
pip install -U sounddevice

然后下面我给出了一个示例代码:

python 复制代码
# 导入音频输入库
import sounddevice as sd
# 导入数值计算库
import numpy as np
# 导入深度学习框架
import torch
# 从 funasr 库导入自动语音识别模型
from funasr import AutoModel

# 初始化 SenseVoice 模型,指定模型路径、VAD 模型及参数,并启用 CUDA
model = AutoModel(
    model="/root/workspace/models/SenseVoiceSamll",  # 模型权重路径
    trust_remote_code=True,                        # 允许加载远程代码
    remote_code="/root/workspace/SenseVoice/model.py",  # 远程模型定义文件
    vad_model="fsmn-vad",                          # 语音活动检测模型
    vad_kwargs={"max_single_segment_time": 30000},  # VAD 单段最大时长 30 秒
    device="cuda:0",                               # 使用第一块 GPU
)

# 初始化缓存字典,用于模型推理时保存中间状态
state = {}
# 定义采样率 16 kHz
sr = 16000
# 定义每次处理的块时长为 2 秒
block_s = 2
# 计算每块对应的采样点数
block_size = sr * block_s

# 定义音频输入回调函数,每次采集到一块数据时自动调用
def callback(indata, frames, time_info, status):
    # 提取单声道音频数据并复制一份,避免只读问题
    audio = indata[:, 0].copy()
    # 将 numpy 数组转换为 PyTorch 张量,并转为 float32 类型
    t = torch.from_numpy(audio).float()
    # 使用模型进行语音识别推理
    res = model.generate(
        input=[t],              # 输入音频张量
        cache=state,            # 传入缓存状态
        language="auto",        # 自动检测语言
        use_itn=True,           # 启用文本正则化
        batch_size_s=block_s,   # 每批处理时长
        merge_vad=True,         # 合并 VAD 分段
        merge_length_s=5,       # 合并最大长度 5 秒
    )
    # 提取识别结果中的文本
    text = res[0]["text"]
    # 打印识别到的文本
    print(text)

# 创建音频输入流,指定采样率、通道数、数据类型、块大小及回调函数
with sd.InputStream(samplerate=sr, channels=1, dtype="float32", blocksize=block_size, callback=callback):
    # 让程序持续运行 60 秒,期间持续监听麦克风输入
    sd.sleep(60_000)
相关推荐
小鸡吃米…30 分钟前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫1 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)1 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
minhuan1 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维1 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd2 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟2 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
Carl_奕然2 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
旅途中的宽~2 小时前
《European Radiology》:2024血管瘤分割—基于MRI T1序列的分割算法
人工智能·计算机视觉·mri·sci一区top·血管瘤·t1