在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%不知道是什么原因,另外一台只占很少。