SenseVoice

GitHub:FunAudioLLM/SenseVoice: Multilingual Voice Understanding Model

官方介绍:SenseVoice 是具有音频理解能力的音频基础模型,包括语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)或声学事件检测(AED)。本项目提供 SenseVoice 模型的介绍以及在多个任务测试集上的 benchmark,以及体验模型所需的环境安装的与推理方式。

windows

这是和SenseVoice约会的第一个地方

模型下载

代码中用到了iic/SenseVoiceSmalliic/speech_fsmn_vad_zh-cn-16k-common-pytorch这两个模型,咱先把他们弄下来

这里的模型是E:\llm,如下图:

SenseVoice 项目,下载依赖的模型:SenseVoiceSmall、speech_fsmn_vad_zh-cn-16k-common-pytorch

克隆项目

git clone https://github.com/FunAudioLLM/SenseVoice.git,这里将项目克隆到了F:\mllm目录

SenseVoice 克隆项目

虚拟环境/安装依赖

#   创建虚拟环境
python -m venv venv
#   激活虚拟环境
.\venv\scripts\activate
#   退出虚拟环境
deactivate
#   安装依赖(添加到这里,使用的时候方便一些)
pip install -r requirements.txt 
            

SenseVoice 项目,虚拟环境/安装依赖

启动 webui.py

启动之前先修改一下代码,修改模型的路径,具体代码如下:

model_folder = "E:/llm/"
model = AutoModel(model=model_folder + "iic/SenseVoiceSmall",
                  vad_model=model_folder + "iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
                  vad_kwargs={"max_single_segment_time": 30000},
                  trust_remote_code=True,
                  ) 
            

SenseVoice 项目,webui.py 修改前后对比

然后启动webui.py,不出意外,还是出意外了,少了两个库,如下图:

SenseVoice 项目,运行 webui.py 失败,缺少 onnx

SenseVoice 项目,运行 webui.py 失败,缺少 onnxconverter_common

你需要执行pip install onnx onnxconverter_common命令来安装一下。之后,再次运行python webui.py,哇塞,成功了,并附上测试转语音(这里是录音录的)的示例

SenseVoice 项目,运行 webui.py 成功,测试录音转文本

客户端调用

启动 webui.py 之后,还可以使用PythonJavascriptBash这几个客户端去调用API。这里使用Javascript测试一下

SenseVoice 项目,运行 webui.py 成功,API调用示例

Javascript调用代码如下:

import { Client } from "@gradio/client";

const response_0 = await fetch("http://localhost:8888/dmeo.wav");
const exampleAudio = await response_0.blob();

const client = await Client.connect("http://localhost:7860/");
const result = await client.predict("/model_inference", {
    input_wav: exampleAudio,
    language: "auto"
});

console.log(result.data);
            

SenseVoice 项目,运行 webui.py 成功,javascript 调用API示例

启动 api.py

还是这个项目贴心啊,他还提供了纯API服务,基于FastAPI的,直接执行python api.py即可。当然执行之前还需要修改一下代码,如下:

SenseVoice 项目,api.py 修改前后对比

注意:因为咱没有算力,所以这里device参数设置的是cpu

下面是运行成功的截图:

SenseVoice 项目,api.py 运行成功

javascript 调用

都有Swagger UIAPI 接口文档了,我们用javascript测试一下。

在测试之前,服务器端( api.py )还需要添加一下允许跨域的支持,如下:

#   部分代码
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
            

下面是javascript示例代码:

#   html 代码
<p><input type="file" id="file" placeholder="请选择文件" accept="audio/*" /> <button type="button" id="btn">确定</button></p>
#   javascript 代码
document.getElementById("btn").addEventListener("click", async () => {
    const fileEle = document.getElementById("file");
    const arrFiles = Array.from(fileEle.files);
    const keys = Array.from(arrFiles)
        .map((file) => file.name)
        .join(",");
    const formData = new FormData();
    Array.from(arrFiles).forEach((file, index) => {
        formData.append(`files`, file);
    });
    formData.append("keys", keys);
    formData.append("lang", "auto");

    fetch("http://localhost:7860/api/v1/asr", {
        method: "POST",
        headers: {
            Accept: "application/json"
        },
        body: formData
    })
        .then((response) => response.json())
        .then((data) => console.log(data))
        .catch((error) => {
            console.error("Error:", error);
        });
});
            

SenseVoice 项目,api.py 运行成功。javascript 调用API示例