在Windows系统部署FunASR语音识别

在Windows系统的电脑上部署语音识别模型。
使用CPU推理

 

1. 从GitHub上下载FunASR源码到本地电脑上.
git clone https://github.com/modelscope/FunASR.git
2. 使用conda创建python环境
conda create -n funasr python=3.9
conda activate funasr
3. 安装必要的依赖库
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu118
pip install -U funasr

Q:为什么我们已经从GitHub上下载了funasr的源码,还要使用pip安装funasr

A:从GitHub上下载的代码除了funasr这个核心推理框架,还有包含了多种编程语音、多种使用方式、对外提供服务的runtime代码,如果只通过pip安装funasr只能在控制台测试,很不方便。
4. 安装下载模型文件需要的库
pip install -U modelscope huggingface huggingface_hub

国内只安装modelscope就可以了,从modelscope下载模型速度比较快。

启动的时候会检查本地是否已经下载了模型文件、以及本版更新,如果没有下载就会自动下载,
5. 快速开始
- 使用命令行模式
funasr ++model=paraformer-zh ++punc_model="ct-punc"  ++input="example/asr_example_en.wav"

这种就是使用funasr库,在命令行中交互。

input是输入的音频路径,默认是根据提供的模型目录,自动从ModelScope平台下载所需的模型和示例数据。

 

- 使用python代码模式
新建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"example/asr_example_en.wav",
    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 = AutoModel(model='iic/SenseVoiceSmall') 和 wav_file = "example/asr_example.wav"分别为模型和输入的路径.

funasr可以推理多种模型,可以按需修改这个参数。下图列举了funasr可以推理的模型列表。

7. 使用runtime中的websocket示例
这里我测试的是runtime\python\websocket中的funasr_wss_server.py和runtime\html5\h5server.py.
首先安装依赖库,funasr_wss_server.py需要websockets,h5Server.py需要flask。
pip install websockets
pip install flask

GitHub上提供的代码在Windows系统运行还有些问题,需要修改才能启动。下面是funasr_wss_server.py代码。

####以上省略
async def async_asr_online(websocket, audio_in):
    if len(audio_in) > 0:
        # print(websocket.status_dict_asr_online.get("is_final", False))
        rec_result = model_asr_streaming.generate(
            input=audio_in, **websocket.status_dict_asr_online
        )[0]
        # print("online, ", rec_result)
        if websocket.mode == "2pass" and websocket.status_dict_asr_online.get("is_final", False):
            return
            #     websocket.status_dict_asr_online["cache"] = dict()
        if len(rec_result["text"]):
            mode = "2pass-online" if "2pass" in websocket.mode else websocket.mode
            message = json.dumps(
                {
                    "mode": mode,
                    "text": rec_result["text"],
                    "wav_name": websocket.wav_name,
                    "is_final": websocket.is_speaking,
                }
            )
            await websocket.send(message)
#######################################上面的保持不变###################################################

async def main():
    if len(args.certfile) > 0:
        # 加载SSL证书
        ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        ssl_cert = args.certfile
        ssl_key = args.keyfile
        ssl_context.load_cert_chain(ssl_cert, keyfile=ssl_key)
        server = await websockets.serve(
            ws_serve,
            args.host,
            args.port,
            subprotocols=["binary"],
            ping_interval=None,
            ssl=ssl_context
        )
    else:
        # 无SSL
        server = await websockets.serve(
            ws_serve,
            args.host,
            args.port,
            subprotocols=["binary"],
            ping_interval=None,
            max_queue=10
        )

    print(f"Server started on {args.host}:{args.port}")
    await server.wait_closed()


if __name__ == "__main__":
    asyncio.run(main())

服务端设置了subprotocol,客户端也需要设置一下。打开runtime\html5\static\wsconnecter.js,在创建websocket对象时增加一个参数。

speechSokt = new WebSocket( Uri ,"binary");

然后分别启动websocket服务和web服务,在浏览器中输入web服务地址进入前端交互页面。可以使用麦克风实时语音识别、录音文件识别等等。

8. 相关内容
- 模型在电脑中的位置:C:\Users\{username}\.cache\modelscope\hub\models\iic
- 我在两台电脑上进行推理,其中一台电脑在推理时CPU占100%不知道是什么原因,另外一台只占很少。
点赞

发表回复

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像(已失效)