FastASR——PaddleSpeech的C++实现
FastASR
基于PaddleSpeech所使用的conformer模型,使用C++的高效实现模型推理,在树莓派4B等ARM平台运行也可流畅运行。
项目简介
本项目仅实现了PaddleSpeech r1.01版本中conformer_wenetspeech-zh-16k预训练模型。
这个预训练模型采用了当下最先进的conformer模型,使用10000+小时的wenetspeech数据集训练得到。
经过测试它识别效果很好,可以媲美许多商用的ASR软件。
PaddleSpeech是基于python实现的,本身的性能已经很不错了,即使在没有GPU的个人电脑上运行,
也能满足实时性的要求(如:时长为10s的语音,推理时间小于10s,即可满足实时性)。
但是要把PaddleSpeech部署在ARM平台,会遇到两个方面的困难。
- 不容易安装,需要自己编译一些组件。
- 执行效率很慢,无法满足实时性的要求。
因此就有这个项目,它由纯C++编写,仅实现了模型的推理过程。
- 语言优势: 由于C++和Python不同,是编译型语言,编译器会根据编译选项针对不同平台的CPU进行优化,更适合在不同CPU平台上面部署,充分利用CPU的计算资源。
- 独立: 实现不依赖于现有的深度学习框架如pytorch、paddle、tensorflow等。
- 依赖少: 项目仅使用了两个第三方库libfftw3和libopenblas,并无其他依赖,所以在各个平台的可移植行很好,通用性很强。
- 效率高:算法中大量使用指针,减少原有算法中reshape和permute的操作,减少不必要的数据拷贝,从而提升算法性能。
快速上手
安装依赖
安装依赖库libfftw3
sudo apt-get install libfftw3-dev libfftw3-single3
安装依赖库libopenblas
sudo apt-get install libopenblas-dev
编译源码
下载最新版的源码
git clone https://github.com/chenkui164/FastASR.git
编译最新版的源码
cd FastASR/
make
下载预训练模型
从PaddleSpeech官网下载预训练模型,如果之前已经在运行过PaddleSpeech,
则可以不用下载,它已经在目录~/.paddlespeech/models/conformer_wenetspeech-zh-16k
中。
wget -c https://paddlespeech.bj.bcebos.com/s2t/wenetspeech/asr1_conformer_wenetspeech_ckpt_0.1.1.model.tar.gz
将压缩包解压wenetspeech目录下
mkdir wenetspeech
tar -xzvf asr1_conformer_wenetspeech_ckpt_0.1.1.model.tar.gz -C wenetspeech
将用于Python的模型转换为C++的,这样更方便通过内存映射的方式直接读取参数,加快模型读取速度。
./convert.py wenetspeech/exp/conformer/checkpoints/wenetspeech.pdparams
查看转换后的参数文件wenet_params.bin的md5码,md5码为9cfcf11ee70cb9423528b1f66a87eafd,表示转换正确。
md5sum -b wenet_params.bin
同时我也把转换好的wenet_params.bin上传至github,可以直接下载,可能会有些慢。
wget -c https://github.com/chenkui164/FastASR/releases/download/V0.01/wenet_params.bin
如何使用
下载用于测试的wav文件
wget -c https://paddlespeech.bj.bcebos.com/PaddleAudio/zh.wav
执行程序
./fastasr zh.wav
程序输出
Audio time is 4.996812 s.
Model initialization takes 0.163184s
result: "我认为跑步最重要的就是给我带来了身体健康"
Model inference takes 0.462369s.
树莓派4B上优化部署
由于深度学习推理过程,属于计算密集型算法,所以CPU的指令集对代码的执行效率会有重要影响。
从纯数值计算角度来看,64bit的指令及要比32bit的指令集执行效率要提升1倍。
经过测试同样的算法在64bit系统上,确实是要比32bit系统上,执行效率高很多。
为树莓派升级64位系统raspios
到树莓派官网下载最新的raspios 64位系统,
我下载的是没有桌面的精简版raspios_lite_arm64,
当然也可以下载有桌面的版本raspios_arm64,
两者没有太大差别,全凭个人喜好。
下载完成镜像,然后烧写SD卡,保证系统新做的系统能正常启动即可。
重新编译依赖库
尽管两个依赖库fftw3和openblas都是可以通过sudo apt install
直接安装的,
但是软件源上的版本是通用版本,是兼容树莓派3B等老版本的型号,
并没有针对树莓派4B的ARM CORTEX A72进行优化,所以执行效率并不高。
因此我们需要针对树莓派4B重新编译,让其发挥最大效率。
注意:以下编译安装步骤都是在树莓派上完成,不使用交叉编译!!!
安装fftw3
下载源码
wget -c http://www.fftw.org/fftw-3.3.10.tar.gz
解压
tar -xzvf fftw-3.3.10.tar.gz
cd fftw-3.3.10/
配置工程,根据CPU选择适当的编译选项
./configure --enable-shared --enable-float --prefix=/usr
编译和安装
make -j4
sudo make install
安装OpenBLAS
下载源码
wget -c https://github.com/xianyi/OpenBLAS/releases/download/v0.3.20/OpenBLAS-0.3.20.tar.gz
解压
tar -xzvf OpenBLAS-0.3.20.tar.gz
cd OpenBLAS-0.3.20
编译和安装
make -j4
sudo make PREFIX=/usr install
编译和测试
编译和下载预训练模型的过程,请参考上文的快速上手章节。
运行程序
./fastasr zh.wav
结果
Audio time is 4.996812 s.
Model initialization takes 10.288784s
result: "我认为跑步最重要的就是给我带来了身体健康"
Model inference takes 4.900788s.
当第一次运行时,发现模型初始化时间就用了10.2s,
显然不太合理,这是因为预训练模型是在SD卡中,一个450M大小的文件从SD卡读到内存中,主要受限于SD卡的读取速度,所以比较慢。
得利于linux的缓存机制,第二次运行时,模型已经在内存中,不用在从SD卡读取了,所以只有重启后第一次会比较慢。
第二次运行结果
Audio time is 4.996812 s.
Model initialization takes 0.797091s
result: "我认为跑步最重要的就是给我带来了身体健康"
Model inference takes 4.916471s.
从结果中可以看出,当音频文件为4.99s时,推理时间为4.91秒,推理时间小于音频时间,刚刚好能满足实时性的需求。
FastASR——PaddleSpeech的C++实现的更多相关文章
- paddlespeech asr 使用教程
目录 安装 paddle框架安装 软件源安装 源码安装 快速使用 下载测试使用的音频 非流式命令行接口(CLI) 非流式Server服务 流式Server服务 指令详解 打印paddlespeech_ ...
- 年底了是时候学新技术了「GitHub 热点速览 v.21.52」
作者:HelloGitHub-小鱼干 年底了,又有新技术冒出来需要你来 Pick 了,第一个先要被 Pick 的是即将到来的元旦英文版:Happy New Year,再来的话就是这周非常火的新一代爬虫 ...
随机推荐
- Linux的Docker安装教程
Docker下载的官方文档地址:https://docs.docker.com/engine/install/centos/ 卸载旧版本 sudo yum remove docker \ docker ...
- JAVA IDEA连接mysql遇到的问题
Mysql-connector-java驱动问题 因为缺乏驱动而无法成功连接数据库 下载驱动(教程) 相关网址 安装驱动 简单图示
- 关于linux多线程fork的理解和学习
fork在英文中是"分叉"的意思.为什么取这个名字呢?因为一个进程在运行中,如果使用了fork函数,就产生了另一个进程,于是进程就"分叉"了,所以这个名字取得很 ...
- 使用BGP-blackhole解决IDC频繁遭受DDOS攻击困扰
项目背景 该项目位于某市级BGP IDC机房,机房客户多为web业务,遭受小流量攻击(10G量级)较为频繁,针对这一现象在机房core旁路部署ADS系统,牵引异常流量清洗后进行回源,该清洗方案在此不再 ...
- 【数据库】MySQL如何删除索引
1.查看表上的索引 -- 查看table_name表上的索引 show index from table_name ; 2.删除表上的索引 删除索引可以使用ALTER TABLE或DROP INDEX ...
- 第06组 Beta冲刺 (2/5)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.杜筱 4.黄少丹 5. 董翔云 6.鲍凌函 7.詹鑫冰 8.曹兰英 9.曾丽莉 10.吴沅静 1.3 冲刺成果展示 1.1 ...
- React中使用react-player 播放视频或直播
业务中需要播放视频,寻来寻去,找到了react-player 初次点击,甚是眼熟,思来想去,竟是钉钉同款 如果使用react框架 先安装 npm install --save video-react ...
- MySQL - 数据库设计步骤
需求分析:分析用户的需求,包括数据.功能和性能需求. 概念结构设计:主要采用E-R模型进行设计,包括画E-R图. 逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换,进行关系规范化 ...
- 【SpringSecurity系列3】基于Spring Webflux集成SpringSecurity实现前后端分离无状态Rest API的权限控制
源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/02-springsecurity-state ...
- 蓝牙、WiFi、ZigBee三大无线通信技术协议模块哪一个是最好的?
曾经,在2015年极客公园创新大会上,小米首次在非官方平台发布了新款产品小米智能家庭套装.自此,Zigbee便常出现在大众视野中. 如今,小米在IoT物联网应用开发者平台上明确说明,不再推广Zigbe ...