FastASR离线语音识别库

先感谢原作者的项目分享 : GitHub – chenkui164/FastASR: 这是一个用C++实现ASR推理的项目,它依赖很少,安装也很简单,推理速度很快,在树莓派4B等ARM平台也可以流畅的运行。 推理模型是基于目前最先进的conformer模型,使用10000+小时的wenetspeech数据集训练得到, 所以识别效果也很好,可以媲美许多商用的ASR软件。

从来不生成代码,我自是大自然的搬运工! 

Ubuntu 安装依赖

更新软件列表: 

sudo  apt-get update 

安装依赖库libfftw3

sudo apt-get install libfftw3-dev libfftw3-single3

安装依赖库libopenblas

sudo apt-get install libopenblas-dev

安装python环境  (python库主要用来做模型转换,如果直接使用本文转换好的模型可以不用安装)

sudo apt-get install python3 python3-dev

  pip3  install  numpy

  pip3  install  torch

编译源码

下载最新版的源码

git clone https://github.com/chenkui164/FastASR.git

编译最新版的源码,

cd FastASR/
mkdir build
cd build
cmake ..
make

下载预训练模型 (本文最后提供转换好的模型)

k2_rnnt2预训练模型下载

进入FastASR/models/k2_rnnt2_cli文件夹,用于存放下载的预训练模型.

cd ../models/k2_rnnt2_cli

从huggingface官网下载预训练模型,预训练模型所在的仓库地址 也可通过命令一键下载。

wget -c https://huggingface.co/luomingshuang/icefall_asr_wenetspeech_pruned_transducer_stateless2/resolve/main/exp/pretrained_epoch_10_avg_2.pt

将用于Python的模型转换为C++的,这样更方便通过内存映射的方式直接读取参数,加快模型读取速度。

../../scripts/k2_rnnt2_convert.py pretrained_epoch_10_avg_2.pt

查看转换后的参数文件wenet_params.bin的md5码,md5码为33a941f3c1a20a5adfb6f18006c11513,表示转换正确。

md5sum -b wenet_params.bin

conformer_wenetspeech-zh-16k预训练模型下载

进入FastASR/models/paddlespeech_cli文件夹,用于存放下载的预训练模型.

cd ../models/paddlespeech_cli

从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++的,这样更方便通过内存映射的方式直接读取参数,加快模型读取速度。

../../scripts/paddlespeech_convert.py wenetspeech/exp/conformer/checkpoints/wenetspeech.pdparams

查看转换后的参数文件wenet_params.bin的md5码,md5码为9cfcf11ee70cb9423528b1f66a87eafd,表示转换正确。

md5sum -b wenet_params.bin

流模式预训练模型下载

进入FastASR/models/paddlespeech_stream文件夹,用于存放下载的预训练模型.

cd ../models/paddlespeech_stream

从PaddleSpeech官网下载预训练模型,如果之前已经在运行过PaddleSpeech, 则可以不用下载,它已经在目录~/.paddlespeech/models/conformer_online_wenetspeech-zh-16k中。

wget -c https://paddlespeech.bj.bcebos.com/s2t/wenetspeech/asr1/asr1_chunk_conformer_wenetspeech_ckpt_1.0.0a.model.tar.gz

将压缩包解压wenetspeech目录下

mkdir wenetspeech
tar -xzvf asr1_chunk_conformer_wenetspeech_ckpt_1.0.0a.model.tar.gz -C wenetspeech

将用于Python的模型转换为C++的,这样更方便通过内存映射的方式直接读取参数,加快模型读取速度。

../../scripts/paddlespeech_convert.py wenetspeech/exp/chunk_conformer/checkpoints/avg_10.pdparams

查看转换后的参数文件wenet_params.bin的md5码,md5码为367a285d43442ecfd9c9e5f5e1145b84,表示转换正确。

md5sum -b wenet_params.bin

 

测试例子

进入项目的根目录FastASR下载用于测试的wav文件

下载时长为5S的测试音频

wget -c https://paddlespeech.bj.bcebos.com/PaddleAudio/zh.wav 

下载时长为30min的测试音频

wget -c https://github.com/chenkui164/FastASR/releases/download/V0.01/long.wav

k2_rnnt2模型测试

第一个参数为预训练模型存放的目录;
第二个参数为需要识别的语音文件。

./build/examples/k2_rnnt2_cli models/k2_rnnt2_cli/ zh.wav

程序输出

Audio time is 5.015000 s. len is 80240
Model initialization takes 0.211781s
result: "我认为跑步最重要的就是给我带来了身体健康"
Model inference takes 0.570641s.

长语音测试

./build/examples/k2_rnnt2_cli models/k2_rnnt2_cli/ long.wav

程序输出

Audio time is 1781.655518 s. len is 28506489
Model initialization takes 0.172187s.
Result: "听众朋友您下面将要听到的是世界文学宝库中的珍品海明威最优秀的作品老人与海
................................................................................
................................................................................
................................................................................
我也许不像我自以为那样的强壮了可是我懂得不少窍门儿而且有决心啊你该就去睡觉这样明儿
早上才精神饱满我要把这些东西送回露台饭店去啊哦好那么祝你晚安早上我去叫醒你你是我的
闹钟男孩说年纪是我的闹钟啊老人说为什么老头儿醒得那么早啊难道是要让白天长些吗我不知
道我只知道少年睡得沉起得晚啊嗯我记在心上了到时候会去叫醒你的我不愿让船主人来叫醒我
这样似乎我比他差劲儿了哼我懂安睡吧老大爷男孩儿走出屋去"
Model inference takes 186.848961s.

 温馨提示: 识别的音频格式必须为下述格式: 

gec@PC-20210319SHWX:d$ ./a.out  my.wav
sizeof(WaveHeader) = 44.
open success.
riff_id 1179011410,
riff_size 160988
num_chn 1.
sample_rate 16000.
byte_rate 32000.
block_align 2.

 获取音频格式的源码


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct WaveHeader{
    int riff_id;
    int riff_sz;
    int riff_fmt;
    int fmt_id;
    int fmt_sz;
    short audio_fmt;
    short num_chn;
    int sample_rate;
    int byte_rate;                                                                                                                                                                                          
    short block_align;
    short bits_per_sample;
    int data_id;
    int data_sz;
} WaveHeader;
 
int main(int argc,char *argv[])
{
	FILE *stream;
	WaveHeader wh;
 
	memset(&wh, 0x00, sizeof(wh));
 
	printf("sizeof(WaveHeader) = %ld.\n", sizeof(WaveHeader));
 
	if((stream=fopen(argv[1],"ro"))==NULL)
	{
		fprintf(stderr,"Can not open file.\n");
		return 0;
	}
	printf("open success.\n");
 
	fseek(stream, 0, SEEK_SET);
 
	fread(&wh,1,sizeof(wh),stream);
 
	fclose(stream);
	
	printf("riff_id %d,\n" \
			"riff_size %d\n" \
			"num_chn %d.\n" \
			"sample_rate %d.\n" \
			"byte_rate %d.\n" \
			"block_align %d.\n" \
			, wh.riff_id, wh.riff_sz, wh.num_chn, wh.sample_rate, wh.byte_rate, wh.block_align);
 
	return 0;
}

利用asla库的录制即可得到:  

arecord -d5 -c1 -r16000 -twav -fS16_LE  my.wav

alsa库的使用请自行  www.bing.com  搜索。 

附件已经编译好的程序与模型:  

链接:https://pan.baidu.com/s/1Gkyf6t695GW_lAgo0oxVNA?pwd=2333 
提取码:2333 
–来自百度网盘超级会员V4的分享

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年2月26日 上午9:43
下一篇 2023年2月26日 上午9:44

相关推荐