在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%不知道是什么原因,另外一台只占很少。
我来了,我走了,我又来了,我又走了,你揍我啊
.....