1. Whisper简介

Whisper是OpenAI开源的,识别语音识别能力已达到人类水准自动语音识别系统。Whisper作为一个通用的语音识别模型,它使用了大量的多语言和多任务的监督数据来训练,能够在英语语音识别上达到接近人类水平的鲁棒性和准确性。Whisper还可以进行多语言语音识别、语音翻译和语言识别等任务。Whisper的架构是一个简单的端到端方法,采用了编码器-解码器的Transformer模型,将输入的音频转换为对应的文本序列,并根据特殊的标记来指定不同的任务。

本教程针对语音识别Whisper的训练和部署到EASY-EAI-Orin-nano(RK3576)进行说明

接下来对算法流程进行说明,whisper算法系统流程如下图所示:

预处理器流程:

编码器流程:

解码器流程:

2. Whisper模型训练

Whisper工程下载百度网盘下载链接:

百度网盘 请输入提取码 https://pan.baidu.com/s/1rX422_7AUMNB_MvZRKL9CQ?pwd=1234百度网盘 请输入提取码(提取码: 1234)

2.1 数据集准备

在本例中,whisper-finetuning工程为whisper模型微调训练工程,该工程提供whisper数据转换,模型微调训练代码。本章节将以AiShell数据集演示whisper模型微调训练过程。

其中AiShell下载链接:

Index of /resources/33

2.2 AiShell数据转SRT

在本例中我们提供了AiShell数据集转成SRT的python脚本,请根据示例修改脚本内容,其中:

1. aishell_extract.py 解压AiShell数据集,解压后:

data_aishell
├── transcript
│   └── aishell_transcript_v0.8.txt
└── wav
    ├── dev
    ├── test
    └── train

2. aishell2srt.py 将解压后的AiShell数据集转成SRT格式,其格式如下:

datas/data_aishell/wav/test/S0907/BAC009S0907W0352.wav	作为  此次  赛事  上  唯一  一  场  纯泰  式  规则  的  超级  战  
datas/data_aishell/wav/test/S0907/BAC009S0907W0269.wav	苹果  正在  全力  以  赴  出售  尽  可能  多  的  智能  手机  
datas/data_aishell/wav/test/S0907/BAC009S0907W0147.wav	从业  人员  五万  人  
datas/data_aishell/wav/test/S0907/BAC009S0907W0495.wav	港媒  称  内地  人  不  穷  了  为  何  仍  爱  抢  学者  抢  习惯  了

3. 在本例中我们提供了create_data.py,将SRT数据转成训练数据,执行命令:

python create_data.py --data-file <path-to-training-file> --language <language-of-your-data> --output train.json

# such as: 
python create_data.py --data-file datas/data_aishell/train.txt --language zh --output train.json

转换后数据格式如下:

{"audio_path": "datas/data_aishell/wav/test/S0907/BAC009S0907W0352.wav", "text": "作为  此次  赛事  上  唯一  一  场  纯泰  式  规则  的  超级  战", "language": "zh", "prompt": ""}
{"audio_path": "datas/data_aishell/wav/test/S0907/BAC009S0907W0269.wav", "text": "苹果  正在  全力  以  赴  出售  尽  可能  多  的  智能  手机", "language": "zh", "prompt": ""}
{"audio_path": "datas/data_aishell/wav/test/S0907/BAC009S0907W0147.wav", "text": "从业  人员  五万  人", "language": "zh", "prompt": ""}
{"audio_path": "datas/data_aishell/wav/test/S0907/BAC009S0907W0495.wav", "text": "港媒  称  内地  人  不  穷  了  为  何  仍  爱  抢  学者  抢  习惯  了", "language": "zh", "prompt": ""}

2.3 模型训练

在本例中我们提供了run_finetuning.py用于模型训练,执行命令如下:

python run_finetuning.py --train-json <path-to-train.json> --dev-json <path-to-dev.json> --model <model-name> --save-dir <output>

注:其中model可以为tiny, base, small, medium等值,程序会自动下载对应的模型;如果,model的值为本地模型文件,则程序会直接加载本地模型进行微调训练。训练好的模型将保存在save-dir目录下。

2.4 PT模型转ONNX

convert工程为whisper模型转换工程,提供了将pt模型转rknn过程的所有脚本。在本例中我们提供了export_onnx.py脚本将pt模型转成onnx,转换命令:

pip install openai-whisper==20231117

python export_onnx.py --model_type <tiny/base/small...>

注:

model_type可以为tiny, base, small, medium等值,程序会自动下载对应的模型。如果model的值为本地模型文件,则程序会直接加载本地模型进行转换。同时,onnx模型保存地址需要修改export_onnx.py代码。

3. rknn-toolkit模型转换

3.1 rknn-toolkit模型转换环境搭建

onnx模型需要转换为rknn模型才能在EASY-EAI-Orin-nano运行,所以需要先搭建rknn-toolkit模型转换工具的环境。当然tensorflow、tensroflow lite、caffe、darknet等也是通过类似的方法进行模型转换,只是本教程onnx为例。

3.1.1 概 述

模型转换环境搭建流程如下所示:

3.1.2 下载模型转换工具

为了保证模型转换工具顺利运行,请下载网盘里“06.AI算法开发/01.rknn-toolkit2模型转换工具/rknn-toolkit2-v2.3.0/docker/rknn-toolkit2-v2.3.0-cp38-docker.tar.gz”。

网盘下载链接:

https://pan.baidu.com/s/1J86chdq1klKFnpCO1RCcEA?pwd=1234(提取码:1234)

3.1.3 把工具移到ubuntu20.04

把下载完成的docker镜像移到我司的虚拟机ubuntu20.04的rknn-toolkit2目录,如下图所示:

3.1.4 运行模型转换工具环境

在该目录打开终端

执行以下指令加载模型转换工具docker镜像:

docker load --input rknn-toolkit2-v2.3.0-cp38-docker.tar.gz

执行以下指令进入镜像bash环境:

docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb rknn-toolkit2:2.3.0-cp38 /bin/bash

现象如下图所示:

输入“python”加载python相关库,尝试加载rknn库,如下图环境测试成功:

至此,模型转换工具环境搭建完成。

3.2 模型转换为RKNN

EASY EAI Orin-nano支持.rknn后缀的模型的评估及运行,对于常见的tensorflow、tensroflow lite、caffe、darknet、onnx和Pytorch模型都可以通过我们提供的 toolkit 工具将其转换至 rknn 模型,而对于其他框架训练出来的模型,也可以先将其转至 onnx 模型再转换为 rknn 模型。模型转换操作流程如下图所示:

3.2.1 模型转换Demo下载

下载百度网盘链接:

https://pan.baidu.com/s/1C1lQN1U9YhKwpi6PwuyxxA?pwd=1234(提取码: 1234)

把whisper_convert_rk3576.tar.bz2解压到虚拟机,如下图所示:

3.2.2 进入模型转换工具docker环境

执行以下指令把工作区域映射进docker镜像,其中,/home/developer/rknn-toolkit2/model_convert_test为工作区域,/test为映射到docker镜像,/dev/bus/usb:/dev/bus/usb为映射usb到docker镜像

docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v /home/developer/rknn-toolkit2/model_convert_test:/test rknn-toolkit2:2.3.0-cp38 /bin/bash

执行成功如下图所示:

3.2.3 模型转换操作说明

1、模型转换Demo目录结构

2、 onnx模型转换为rknn模型

在本例中我们提供了rknn_convert.py脚本将onnx模型转成rknn,脚本代码清单如下所示:

import os
import urllib
import traceback
import time
import sys
import numpy as np
import cv2
from rknn.api import RKNN


ONNX_MODEL = './whisper_decoder_base_20s.onnx'
RKNN_MODEL = './whisper_decoder_base_20s.rknn'
DATASET = './pic_path.txt'

QUANTIZE_ON = False



if __name__ == '__main__':

	# Create RKNN object
rknn = RKNN(verbose=True)

	if not os.path.exists(ONNX_MODEL):
		print('model not exist')
		exit(-1)

	# pre-process config
	print('--> Config model')
	rknn.config(target_platform = 'rk3576')
	print('done')

	# Load ONNX model
	print('--> Loading model')
	ret = rknn.load_onnx(model=ONNX_MODEL)
	if ret != 0:
		print('Load model failed!')
		exit(ret)
	print('done')

	# Build model
	print('--> Building model')
	ret = rknn.build(do_quantization=QUANTIZE_ON)
	if ret != 0:
		print('Build model failed!')
		exit(ret)
	print('done')

	# Export RKNN model
	print('--> Export RKNN model')
	ret = rknn.export_rknn(RKNN_MODEL)
	if ret != 0:
		print('Export model failed!')
		exit(ret)
	print('done')

切换目录到模型转换工作目录:

cd /test/whisper_convert_rk3576

​执行模型转换脚本,转换解码模型:

python rknn_convert.py

注:whisper是编码器-解码器的Transformer模型,所以encoder和decoder模型均需转换。生成模型如下图所示,模型将保存至output_path 路径,此模型可以在rknn环境和EASY EAI Orin-nano环境运行:

修改rknn_convert.py脚本的ONNX_MODEL和RKNN_MODEL,改为编码模型的信息。

执行模型转换脚本,转换编码模型:

至此,模型转换流程已完成。

4. 模型部署示例

本小节展示Whisper模型的在EASY EAI Orin-nano的部署过程,本章章节使用解码模型whisper_decoder_base_20s.rknn和编码模型whisper_encoder_base_20s.rknn。

4.1 源码下载及说明

下载whisper C Demo示例文件

百度网盘链接:

百度网盘 请输入提取码(提取码:1234)。

下载程序包移至ubuntu环境后,执行以下指令解压:

tar xvf whisper_C_demo.tar.bz2

下载解压后如下图所示:

4.2 例程编译

通过adb接口连接EASY-EAI-Orin-nano,,连接方式如下图所示:

接下来需要通过adb把源码传输到板卡上,先切换目录然后执行以下指令:

adb push whisper_C_demo /userdata

登录到板子切换到例程目录执行编译操作

adb shell
cd /userdata/whisper_C_demo
chmod 777 build.sh
./build.sh

4.3 ​运行结果

编译成功后会得到whisper_demo可执行程序,切换到whisper_C_demo_release/目录:

cd whisper_C_demo_release/

进行中文语音识别测试:

./whisper_demo whisper_encoder_base_20s.rknn whisper_decoder_base_20s.rknn mel_80_filters.txt vocab_zh.txt zh 12345678910_CN.wav

执行成功识别出中文语音内容,RTF值约为0.046:

进行英文语音识别测试,RTF值为0.055:

至此,whisper语音识别例程已成功在板卡运行。

5. 资料下载

whisper语音识别算法训练部署教程完整源码包:

百度网盘 请输入提取码

提取码:1234

在线文档:EASY EAI灵眸科技 | 让边缘AI落地更简单

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐