【AI语音】本地部署 - SenseVoice多语言语音理解模型Small

前言

最近了解到很多语音类产品都在使用 SenseVoice,包括小智 AI,我个人之前也简单了解过一些其基本内容,但是对于到底怎么用还是不明白,所以我寻思着自己在本地部署试一试。加深下对于这种模型之类的使用的理解。这里和大家分享下

开发环境:

  • 工具:VSCode
  • 操作系统:Windows 10

1. 简介

SenseVoice 是具有音频理解能力的音频基础模型,包括语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)或声学事件检测(AED)。

在这里插入图片描述

上图中左边提到的,SenseVoice-Small 和 SenseVoice-Large 本质上是同一技术框架下的两个不同尺寸的模型,就像手机有“标准版”和“Pro版”的区别。

然后最右边的输出,是指经过模型的推理之后,所输出的信息包含哪些,例如 Language(语种)/ Emotion(情感)/ Event(事件)

两种模型的区别
这里我们主要是使用 SenseVoice-Small

在这里插入图片描述

2. 环境搭建

2.1 模型下载

模型下载有两种方式,分别是 SDK 下载(代码运行时下载)还有就是通过 Git 进行下载。

SDK 下载:

# 安装 ModelScope  
pip install modelscope  
# SDK 模型下载  
from modelscope import snapshot_download  
model_dir = snapshot_download('iic/SenseVoiceSmall')  

Git 下载:

git clone https://www.modelscope.cn/iic/SenseVoiceSmall.git  

注意点:
我在尝试时本来是先使用的 Git 下载,下载到了本地。结果运行 demo 时,其自动又触发了下载模型到我的 C 盘。
然后发现:

  • 自动下载行为是由 AutoModel 初始化时的 model_dir = "iic/SenseVoiceSmall" 参数导致的
  • AutoModel 来自 FunASR 库,当指定 model_dir 为相对路径 "iic/SenseVoiceSmall" 时,它会自动从远程下载模型到该路径
  • 要阻止自动下载,可以修改代码使用本地已有模型路径,当前工作目录下已有 SenseVoiceSmall 目录
  • 需要将 model_dir = "iic/SenseVoiceSmall" 改为使用本地路径 model_dir = "./SenseVoiceSmall"

代码介绍
下载完成后如下图所示
在这里插入图片描述

核心文件主要包括:

  • tokens.json - 可能包含语音识别使用的 token 词汇表
  • chn_jpn_yue_eng_ko_spectok.bpe.model - 多语言(中/日/粤/英/韩)BPEByte Pair Encoding)模型文件
  • model.pt - PyTorch 训练好的模型权重文件
  • config.yaml/configuration.json - 项目配置文件

example 文件:

  • 多语言音频样本(en/ja/ko/yue/zh.mp3

2.2 依赖环境搭建

推理之前,请务必更新 FunASR 与 ModelScope 版本。

python -m pip install --upgrade pip  
pip install -U funasr modelscope  

上述命令行的目的是安装和更新两个核心工具 FunASR 和 ModelScope

FunASR
一个语音识别相关的工具包,由阿里巴巴开发,用于语音识别任务。FunASR 提供了运行语音识别模型的基础设施,包括音频处理、解码等功能。没有它,无法加载和运行 SenseVoice 模型。

ModelScope
一个模型共享平台,类似于 Hugging Face 的 Model Hub,提供模型下载和管理功能。

3. 编写测试 demo

3.1 复制下 model.py

model.py 是一个基于 PyTorch 实现的语音处理模型,它提供了核心模型框架。一般情况下,预训练模型文件(model.pt)只包含了训练好的参数(模型的权重),而 model.py 定义了模型的结构和计算逻辑,就像是菜谱和食材的关系,光有食材(模型的权重)不知道怎么做菜(如何计算)是不行的。

在这个路径下将 model.py 拷贝到自己的工作目录下:

https://github.com/FunAudioLLM/SenseVoice/blob/main/model.py

在这里插入图片描述

3.2 创建 demo.py

demo.py 是一个使用 SenseVoice 语音识别模型的示例脚本,它用于加载模型,并将语音文件交给模型去进行识别,然后打印出识别的结果。

将如下代码拷贝进去:

#!/usr/bin/env python3  
# -*- encoding: utf-8 -*-  
# Copyright FunASR (https://github.com/FunAudioLLM/SenseVoice). All Rights Reserved.  
#  MIT License  (https://opensource.org/licenses/MIT)  

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

model_dir = "iic/SenseVoiceSmall"  

model = AutoModel(  
    model=model_dir,  
    trust_remote_code=True,  
    remote_code="./model.py",  
    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",  # "zh", "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)  

# zh  
res = model.generate(  
    input=f"{model.model_path}/example/zh.mp3",  
    cache={},  
    language="auto",  # "zh", "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)  

# yue  
res = model.generate(  
    input=f"{model.model_path}/example/yue.mp3",  
    cache={},  
    language="auto",  # "zh", "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)  

# ja  
res = model.generate(  
    input=f"{model.model_path}/example/ja.mp3",  
    cache={},  
    language="auto",  # "zh", "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)  

# ko  
res = model.generate(  
    input=f"{model.model_path}/example/ko.mp3",  
    cache={},  
    language="auto",  # "zh", "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)  

3.3 运行 demo

在 VSCode 中执行:

python demo.py  

在运行过程中,如果碰到了问题可以直接通过询问 DeepSeek 进行解决,一般情况下就是有一些组件没有进行安装,例如:

ModuleNotFoundError: No module named 'torch'
这个错误表明您的 Python 环境中缺少 PyTorch 库,然后我们执行下:

pip install torch torchvision torchaudio  

进行安装即可。

初次运行:
初次运行时会看到又重新下载了 SenseVoiceSmall 模型文件,这是因为我们这里的 model_dir = "iic/SenseVoiceSmall" 会触发自动从网上下载模型。我们告诉模型的 model_dir 下找不到该模型,它就会自动下载。修改办法之一是把我们已经下载好的路径告诉它:
model_dir = "./SenseVoiceSmall"

在这里插入图片描述

到 C 盘的路径下查看了下,和我之前用 Git 下载的一模一样:
在这里插入图片描述

查看 demo 的输出
如下所示,成功将 example 下的语音文件转换成了对应不同国家语言的文本:
在这里插入图片描述

4. 我的疑问

4.1 PyTorch 训练好的模型权重文件 model.pt 这个是啥啊?

PyTorchtorch)是一个开源的深度学习框架,主要用于构建和训练神经网络。它有一个功能就是模型部署与导出:

  • TorchScript:将模型转换为脚本格式(.pt),脱离 Python 环境运行。
  • ONNX 支持:导出为 ONNX 格式(torch.onnx),与其他框架(如 TensorFlow)互操作。

而 model.pt 是 PyTorch 模型的权重文件,相当于语音识别系统的“大脑”,它包含了神经网络的所有学习参数(权重和偏置),没有它的话就无法进行推理。

4.2 使用时是用 chn_jpn_yue_eng_ko_spectok.bpe.model 还是 model.pt 啊?

在实际使用中,这两个文件是配合使用的,各自承担不同功能:

model.pt:声学模型

  • 处理原始音频信号
  • 提取语音特征
  • 输出原始 token 概率分布

chn_jpn_yue_eng_ko_spectok.bpe.model:语言模型

  • 将 token 序列解码为文字
  • 处理多语言混合场景
  • 优化输出流畅度

典型调用代码示例:

# 加载声学模型  
acoustic_model = load_model('model.pt')  

# 加载 BPE tokenizer  
tokenizer = Tokenizer.from_file('chn_jpn_yue_eng_ko_spectok.bpe.model')  

# 完整推理流程  
audio = load_audio('test.wav')  
tokens = acoustic_model(audio)  # 使用 model.pt  
text = tokenizer.decode(tokens)  # 使用 BPE 模型  

4.3 tokens.json 的作用

tokens.json 是语音识别系统中的关键组件,它的作用相当于一个“字典”,将语音特征映射到文本单元。

在端到端语音识别系统中,模型不直接输出文字,而是输出一系列 token(标记),而 tokens.json 定义了这些 token 与实际文字/子词单元的对应关系。

语音信号 -> 声学特征 -> 神经网络 -> token 序列 -> tokens.json 解码 -> 最终文本

5. 总结

说实话目前为止我也只是知道了模型是怎么使用的,但是这个模型到底是怎么进行训练出来的,以及它背后的更多技术细节还不是很清楚。

之所以想要了解怎么本地部署,是因为我有个需求是通过将音频传递到服务端,然后服务端处理后再给我返回文本和语音回复。

不了解模型是怎么工作时,总感觉它是一个很难很难的东西。等真正去了解才发现它背后的原理很难,但是使用起来却很简单,这还是要感谢人家开源做得好啊。试想一下如果太难使用了,也不利于模型应用的推广。

现在了解了模型在本地是怎么进行运行的之后,也大概就理解了服务端的模型是怎么进行工作的了,无非是换了个环境以及通讯的方式发生了变化。在使用过程中我发现每次执行 demo 时电脑都会很卡,然后给出结果的时间也很慢,CPU 和内存消耗会飙得比较高,这么来看模型的推理确实很耗费资源啊。如果我们经常使用,最好还是在云服务器上使用 GPU 进行推理,不然每次调试起来太慢了。

6. 参考地址

posted @ 2025-07-02 00:08  FBshark  阅读(2736)  评论(1)    收藏  举报