虚拟机+FunASR的安装与使用

写在前面:我是偶然了解到这个语音识别这个AI方向的,由于当时没有接触过其他的AI模型(ps:当时常见的AI大都是使用过的,但只是止于直接地使用,画个图,让AI帮我解决一些不知道的问题而已),所以FunASR算是我接触过的首个开源且我现有的设备能跑的动的AI项目。所以我对AI的了解是十分浅显的,如果在文章中有什么错误希望各位多多担待,也麻烦帮忙指正,谢谢。

FunASR简介

FunASR 是一个基本的语音识别工具包,提供多种功能,包括语音识别 (ASR)、语音活动检测 (VAD)、标点符号恢复、语言模型、说话人验证、说话人分类和多说话者 ASR。 FunASR提供方便的脚本和教程,支持预训练模型的推理和微调。

它由阿里达摩研究院推出的语音提取工具包,现在这个工具包还在被开发中,但是现在它能实现的功能已经很强大,当然如果你有更好的想法和点子,也可以加入FunASR的开发。我对于FunASR还是很佩服的,虽说其相对于openai旗下whisper性能上还是存在某些方面的差距的,但是FunASR跟适合中国宝宝体质,FunASR的标点符号更加精确,对于普通话来说有着能给人更好的体验。

无论您是初学者还是经验丰富的专业人士,FunASR都是一个值得一试的平台。它不仅为您提供了学习语音识别所需的工具和资源,更重要的是,它为学习者带来了乐趣和激励,让语音识别的学习之旅变得愉悦而充实。

如果您对语音识别技术充满兴趣,并且希望以一种全新的方式来探索和学习它,那么不妨加入FunASR的行列,一起开启这段富有乐趣的学习之旅吧!

前期准备

硬件设备:我使用的虚拟机 centos7

软件:无

由于FunASR是对硬件有要求的,所以这里我用的是电脑来进行安装与实验的(ps:能够满足其对性能需求的服务器有点贵,本人有点承担不起),如果有大佬刚好想玩这且有高性能服务器的,还是建议使用服务器来使用。

安装

一、 最简单的安装

使用达摩院的大佬们写好的包快速部署:一键部署工具流程包括安装Docker、下载Docker镜像、启动服务。

① 首先从网址下载一键部署的包和工具。

curl -O https://raw.githubusercontent.com/alibaba-damo-academy/FunASR/main/runtime/deploy_tools/funasr-runtime-deploy-offline-cpu-zh.sh;

② 执行部署工具

根据提示按回车键即可完成服务器的安装部署。目前便捷部署工具仅支持Linux环境。

sudo bash funasr-runtime-deploy-offline-cpu-zh.sh install --workspace ./funasr-runtime-resources

注:如果需要部署时间戳模型或hotword模型,请在安装部署过程的第2步中选择对应的模型,其中1为paraformer-large模型,2为paraformer-large时间戳模型,3为paraformer-large时间戳模型。 paraformer-large 热词模型;服务器从:./funasr-runtime-resources/hotowrds.txt 加载热词文件(每行一个热词,格式为词重:阿里巴巴 20)。

注意这只是简单的安装,某些功能的实现还是得后期设定。

这里只要执行部署工具就会启动服务,所以执行完这步服务已经就启动了。

③客户端测试和使用

这里客户端不需要我们再去下载①步骤中已经帮我们下好了,这是我为什么推荐新手使用此方法的原因,真的很简单不与要动脑子。

客户端有很多种,这里不做太多的介绍,后面客户端部分会着重介绍,此处仅介绍python端。

Python语言客户端为例,使用下面的代码启动Python语言客户端

python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline --audio_in "../audio/asr_example.wav"

注:linux中最好是先升级到python3,因为python2在有些机器中命令过时了,导致无法使用,先将python升级到python3无论在该快速方法里还是之后的手工搭建中都可以避免很多的问题为我们节省脑子。

二、 纯手工搭建实时语音听写服务

前期准备

升级yum源

将python升级到python3 新的虚拟机镜像往往自带的是python2,但是在新开发的项目里python2很多时候是不够用的,所以升级到python3不是什么坏事,可以两个源共存一起使用。

①Docker安装

如果你已经安装了Docker,请忽略此步骤!(这里提供两个方式)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -O https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/shell/install_docker.sh;
sudo bash install_docker.sh

②拉取和启动镜像

使用以下命令拉取并启动FunASR软件包的docker镜像:

sudo docker pull \
  registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.9
  #创建文件夹
mkdir -p ./funasr-runtime-resources/models
	#启动镜像
sudo docker run -p 10096:10095 -it --privileged=true \
  -v $PWD/funasr-runtime-resources/models:/workspace/models \
  registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.9

③启动服务器

使用以下脚本启动服务器:

cd FunASR/runtime
nohup bash run_server_2pass.sh \
  --download-model-dir /workspace/models \
  --vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
  --model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx  \
  --online-model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx  \
  --punc-dir damo/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-onnx \
  --lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
  --itn-dir thuduj12/fst_itn_zh \
  --hotword /workspace/models/hotwords.txt > log.txt 2>&1 &
# 如果您想关闭ssl,增加参数:--certfile 0(请在上面的代码里改好,不要直接复制上去再去改,不让就改不了了)
# 这里是时间戳模型和热词模型都已经加上了

上面的这部分代码是在docker里的,如果你们安装好了docker和DockerDesktop可以直接在DockerDesktop中直接操作。

上面的模型如果你想在配置文件中配置你可以在docker容器中找到FunASR/runtime目录下的run_server_2pass.sh文件中找到对应部分修改它。内部文件内容大概如下:

这里要注意一下,我们如果是没有ssl证书就将certfile设置为0,只要这一切设置好了,后面启动我们只要启动服务就好了,不用再每次都再来设置参数。

bash run_server_2pass.sh

这个时候服务已经启动了,接下来就只要管客户端了。

④关闭FunASR服务方法

# 查看 funasr-wss-server-2pass 对应的PID
ps -x | grep funasr-wss-server-2pass
kill -9 PID

注意:替换正在使用的模型或者其他参数,需先关闭FunASR服务,修改需要替换的参数,并重新启动FunASR服务。其中模型需为ModelScope中的ASR/VAD/PUNC模型,或者从ModelScope中模型finetune后的模型。

# 例如替换ASR模型为 damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx,则如下设置参数 --model-dir
    --model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx 
# 设置端口号 --port
    --port <port number>
# 设置服务端启动的推理线程数 --decoder-thread-num
    --decoder-thread-num <decoder thread num>
# 设置服务端启动的IO线程数 --io-thread-num
    --io-thread-num <io thread num>
# 关闭SSL证书 
    --certfile 0

三、 客户端

快速开发的客户端

快速开发由于需要下载的东西都会帮我们下好,所以我们只需要在./funasr-runtime-resources(默认安装目录)中找到下载客户端测试工具目录samples即可

手工搭建的客户端

下载客户端

wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/sample/funasr_samples.tar.gz

解压客户端

这里要记好你安装的目录,因为如果python版本低了,可能导致WebSocket服务无法使用,所以要配置环境文件,要用到

tar -zxvf funasr_samples.tar.gz

客户端的使用

python-client

使用下面的代码启动Python语言客户端

python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline --audio_in "../audio/asr_example.wav"
html-client

在浏览器中打开 html/static/index.html

这里需要注意,asr地址如果我么们没有ssl则直接使用ws://+地址+端口号(10095)即可

java-client
FunasrWsClient --host localhost --port 10096 --mode 2pass
cpp-client

进入samples/cpp目录后,可以用cpp进行测试,指令如下:

./funasr-wss-client-2pass --server-ip 127.0.0.1 --port 10096 --mode 2pass \
   --wav-path ../audio/asr_example.pcm

遇到的问题

centos7自带的python为python2不支持WebSocket服务,所以我重新下载python3,因为对于Python 3,通常你不需要特别指定gevent-websocketpython-socketio已经包含了WebSocket的支持。

注意:这里我只给出一个解决方法,我当时的操作和这大同小异,因为我当时没有截图,所以无法给出当时的所有操作了。

  1. 安装依赖: 使用pip安装Flask-SocketIO以及相应的异步库,如gevent、eventlet等,根据项目需求选择合适的异步环境。

    Bash

    pip install flask flask-socketio
    # 如果使用gevent作为异步服务器
    pip install gevent
    # 或者如果使用eventlet
    pip install eventlet
    
  2. 初始化Flask应用与SocketIO实例: 创建一个Flask应用,并将其与SocketIO结合。

    Python

    from flask import Flask, render_template
    from flask_socketio import SocketIO, emit
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'your-secret-key-here'
    socketio = SocketIO(app, async_mode='gevent' | 'eventlet' | 'threading')
    
    # 根据你的部署环境选择async_mode,例如在本地开发时,可能选用'threading'模式,在生产环境为了性能可能会选择'gevent'或'eventlet'。
    
  3. 定义SocketIO事件处理器: 在后端编写处理SocketIO事件的函数。

    Python

    @socketio.on('message')
    def handle_message(data):
        print('Received message: ', data)
        # 可以在这里向客户端发送响应
        emit('response', {'message': 'The server received your message.'}, broadcast=True)
    
  4. 启动SocketIO服务: 设置路由并启动Flask应用,同时开启SocketIO监听。

    Python

    if __name__ == '__main__':
        # 先启动Flask应用
        app.run(host='0.0.0.0', port=5000)
    
        # 对于异步服务器,直接调用socketio.run()替代app.run()
        socketio.run(app, host='0.0.0.0', port=5000)
    
  5. 创建一个.py脚本文件:来作为可执行程序,来实现WebSocket服务。

    这里我只在客户端的文件夹samples/html/static下创建的python.py和需要启动的index.html在同一目录下

#在标准.py文件做下面的修改
from flask import Flask
app = Flask(__name__, static_url_path='', static_folder='.')

这样设置之后,访问根目录下的 index.html 可能需要通过 URL 像这样访问:

http://localhost:5000/index.html

通过下面命令启动服务

python3 python.py

这样设置之后,访问根目录下的 index.html 可能需要通过 URL 像这样访问:

http://localhost:5000/index.html

相关链接

FunASR在线实时工具包文档

https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/docs/SDK_advanced_guide_online.md

教程:

大佬的:遥遥领先,国产之光 funasr 部署一把过_哔哩哔哩_bilibili

官方的:FunASR实时听写软件包_哔哩哔哩_bilibili
有问题可以联系邮箱:wllei13@outlook.com

posted @ 2024-04-08 00:50  我的十四行诗在哪里  阅读(2423)  评论(0编辑  收藏  举报