开发者实战 | 如何使用英特尔开发套件部署 AI 字幕生成器

2023/09/30 17:00
阅读数 21

点击蓝字

关注我们,让开发变得更有趣

作者:周兆靖  英特尔软件应用工程师




一、本文目的


市面上有很多自然语言处理模型,本文旨在帮助开发者快速将 OpenAI* 的热门 NLP 模型 Whisper 部署至英特尔® 开发套件爱克斯开发板上,由于开发板内存有限,所以我们选择较轻量化的 Base Whisper 模型通过 OpenVINO™ 工具套件进行 AI 推理部署。由于声音处理应用的广泛性,开发者可以基于本项目继续进行 AI 应用的顶层开发。



二、项目介绍


语音识别是人工智能中的一个领域,它允许计算机理解人类语音并将其转换为文本。 该技术用于 Alexa* 和各种聊天机器人应用程序等设备。 而我们最常见的就是语音转录,语音转录可以语音转换为文字记录或字幕。通过输入音频,通过 OpenVINO™ 优化过的Whisper模型,将音频进行 AI 处理,最后输出音频处理结果。此结果可以根据开发者不同的需求,继续进行再次开发。


英特尔® 开发套件——爱克斯开发板简介


英特尔® 认证的开发套件 —— AIxBoard(爱克斯板*)开发板是专为支持入门级边缘 AI 应用程序所设计的嵌入式硬件,它能够满足开发者对于人工智能学习、开发、实训等应用场景的使用需求。


基于 x86 平台所设计的开发板,可支持 Linux* Ubuntu*及完整版 Windows* 操作系统,很方便开发者进行软硬件开发,以及尝试所有 x86 平台能够应用的软件功能。开发板搭载一颗英特尔® 赛扬® N5105 4 核 4 线程处理器,睿频可达 2.9GHz,且内置英特尔® 超核芯显卡,含有 24 个执行单元,分辨率最大支持 4K 60 帧,同时支持英特尔® Quick Sync Video 技术可以快速转换便携式多媒体播放器的视频。板载 64GB eMMC 存储及 LPDDR4x 2933MHz(4GB/6GB/8GB),内置蓝牙和 Wi-Fi 模组,支持 USB 3.0、HDMI 视频输出、3.5mm 音频接口,1000Mbps 以太网口。


此外, 其接口与 Jetson Nano 载板兼容,GPIO 与树莓派兼容,能够最大限度地复用树莓派、Jetson Nano 等生态资源,无论是摄像头物体识别,3D 打印,还是 CNC 实时插补控制都能稳定运行。可作为边缘计算引擎用于人工智能产品验证、开发;也可以作为域控核心用于机器人产品开发。


图 1:爱克斯板硬件参数


图 2:爱克斯板实物拍摄


OpenVINO™ 工具套件介绍


OpenVINO™ 是一个开源工具包,可优化和部署深度学习模型。它提供了针对视觉、音频和语言模型的深度学习性能加速,支持流行框架如 TensorFlow、PyTorch 等。

图 3:OpenVINO™ 工具套件部署架构图


OpenVINO™ 可以优化几乎任何框架的深度学习模型,并在各种英特尔处理器和其他硬件平台上以最佳性能进行部署。OpenVINO™ Runtime 可以自动使用激进的图形融合、内存重用、负载平衡和跨 CPU、GPU、VPU 等进行集成并行处理,以优化深度学习流水线。您可以集成和卸载加速器附加操作,以减少端到端延迟并提高吞吐量。通过 OpenVINO™ 的后训练优化工具和神经网络压缩框架中提供的量化和其他最先进的压缩技术,进一步提高模型的速度。这些技术还可以减少模型的大小和内存需求,使其能够部署在资源受限的边缘硬件上。


Whisper 模型介绍


Whisper 来自于知名 AI 组织 OpenAI*,这个模型是一种通用的语音识别模型。它是在各种音频的大型数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。


wav2vec2、Conformer 和 Hubert 等最先进模型的最新发展极大地推动了语音识别领域的发展。 这些模型采用无需人工标记数据即可从原始音频中学习的技术,从而使它们能够有效地使用未标记语音的大型数据集。 它们还被扩展为使用多达 1,000,000 小时的训练数据,远远超过学术监督数据集中使用的传统 1,000 小时,但是以监督方式跨多个数据集和领域预训练的模型已被发现表现出更好的鲁棒性和对持有数据集的泛化,所以执行语音识别等任务仍然需要微调,这限制了它们的全部潜力。为了解决这个问题 OpenAI 开发了 Whisper,一种利用弱监督方法的模型。


图 4:Whisper 模型框图



主要采用的结构是编码器 - 解码器结构。


模型的输入音频重采样设为 16000 Hz,针对音频的特征提取方法是使用 25 毫秒的窗口和 10 毫秒的步幅计算80通道的 log Mel 谱图。最后对输入特征进行归一化,将输入在全局内缩放到 -1 到 1 之间,并且在预训练数据集上具有近似为零的平均值。


编码器/解码器:

该模型的编码器和解码器采用 Transformers。

编码器的过程:

编码器首先使用一个包含两个卷积层(滤波器宽度为 3)的词干处理输入表示,使用 GELU 激活函数。


第二个卷积层的步幅为 2,然后将正弦位置嵌入添加到词干的输出中,然后应用编码器 Transformer 块。


Transformers 使用预激活残差块,编码器的输出使用归一化层进行归一化。

解码的过程:

在解码器中,使用了学习位置嵌入和绑定输入输出标记表示。


编码器和解码器具有相同的宽度和数量的 Transformers 块。

训练:

为了改进模型的缩放属性,它在不同的输入大小上进行了训练。


通过 FP16、动态损失缩放,并采用数据并行来训练模型。


使用 AdamW 和梯度范数裁剪,在对前 2048 次更新进行预热后,线性学习率衰减为零。


使用 256 个批大小,并训练模型进行 220 次更新,这相当于对数据集进行两到三次前向传递。


Whisper 在不同数据集上的对比结果,相比 wav2vec 取得了目前最低的词错误率,如下表:


图 5:Whisper 模型与 wav2vec 词错误率对比表



三、项目流程


图 6:Whisper 模型语音处理流程图


利用 Whisper 模型进行视频文字识别的流程如上,首先准备语音文件,常规操作是将语音流从视频流中分离,然后通过 Whisper 模型编码语音文件的前 30 秒,输出该语音文件对于的语言种类的多种可能性,选择可能性最高的一种语言继续进行编码。将整段语音文件分割成多个 30 秒的小段进行编码,再通过 Beam 搜索算法将音频特征都转 为token ID, 最后将 token ID 翻译成 tokens 就可以获得识别到的文本了。


使用 OpenVINO™ 工具套件对 Whisper 模型进行推理加速,主要在 Encoder 和 Decoder 上使用 OpenVINO™ Runtime,对应到流程图中,我们在不更改主体 pipeline 的前提下,OpenVINO™ 为流程中的“Positional Encoding”和“Cross attention”赋能,代码实现层面就是使用 OpenVINO™ Runtime API 替换掉原先的 Encoder 和 Decoder,使得 OpenVINO™ 得以加入到这个音频处理流程中,如下图所示:


图 7:OpenVINO™ 赋能 Whisper 模型项目示意图



四、实验流程


硬件:英特尔® 开发套件 —— 爱克斯开发板


OS:Ubuntu 20.04LTS 


软件:OpenVINO™  2023.0,Whisper


由于 Whisper 预训练模型根据参数量分为 Tiny, Base, Small, Medium, Large。本次实验中选择参数量为 74M 的 base 模型进行实验,使用预训练模型直接通过 OpenVINO™ 的模型优化器 API 转换为 IR 格式文件,将 Whisper 的编解码器构建成流水线,便可对视频进行语音转文字的 AI 处理了。


安装依赖:


为实现最快速的部署,我们直接下载 OpenVINO™ Open Model Zoo 里的现成 Notebook 进行实验。

Git clone https://github.com/openvinotoolkit/ openvino_notebooks.git

左滑查看更多


构建虚拟环境,安装 OpenVINO™,Whisper 以及其他依赖:

python3 -m venv openvino_envsource env/bin/activate

左滑查看更多


命令行中运行如下 pip 安装指令:

pip install openvinopip install -q "python-ffmpeg<=1.0.16" moviepy transformers onnxpython -m pip install pytubepip install -q -U gradiopip install git+https://github.com/openai/whisper.git

左滑查看更多


进入 notebooks/227-whisper-subtitles-generation/目录中,安装 Jupyter Notebook 并打开 227-whisper-convert.ipynb 文件:

pip install notebookjupyter notebook


下面进入 227-whisper-convert.ipynb 文件中运行代码


首先,下载 Whisper 现成的预训练模型,代号为“base”

import whisper
model = whisper.load_model("base")model.to("cpu")model.eval()pass

左滑查看更多


模型主要是编码器 - 解码器的结构,所以我们先把 Encoder 部分被转成 IR 模型,保存至本地:

import torchimport openvino as ov
mel = torch.zeros((1, 80, 3000))audio_features = model.encoder(mel)encoder_model = ov.convert_model(model.encoder, example_input=mel)ov.save_model(encoder_model, WHISPER_ENCODER_OV)

左滑查看更多


然后把模型的 Decoder 部分也转成 IR 模型,保存至本地:

tokens = torch.ones((5, 3), dtype=torch.int64)logits, kv_cache = model.decoder(tokens, audio_features, kv_cache=None)
tokens = torch.ones((5, 1), dtype=torch.int64)decoder_model = ov.convert_model(model.decoder, example_input=(tokens, audio_features, kv_cache))
ov.save_model(decoder_model, WHISPER_DECODER_OV)

左滑查看更多


创建 core 对象,启用 OpenVINO™ Runtime:

core = ov.Core()


推理设备选择“AUTO”Plugin,表示自动选择当前系统最优的推理硬件:

device = widgets.Dropdown(    options=core.available_devices + ["AUTO"],    value='AUTO',    description='Device:',    disabled=False,)

左滑查看更多


我们的实验将复用原生模型处理音频的 pipeline,只需要将原来的编码器和解码器用 OpenVINO™ Runtime API 重写,即可得到 OpenVINO™ 加速过的 pipeline。


当前文件目录下包含“utils.py”,此脚本中集成了三个最重要的类,分别是:

patch_whisper_for_ov_inference,

OpenVINOAudioEncoder, 

OpenVINOTextDecoder。


patch_whisper_for_ov_inference 主要提供了一些功能函数,比如获取音频,增加时间戳,生成字幕文件等等。另外两个类在这里的作用是使用 OpenVINO™ Runtime API 对原始模型 Encoder 和 Decoder 进行重写,利用 OpenVINO™ Runtime 替换掉原始模型中的 Encoder 和 Decoder 以加速优化模型运行的速度。

from utils import patch_whisper_for_ov_inference, OpenVINOAudioEncoder, OpenVINOTextDecoder
patch_whisper_for_ov_inference(model)
model.encoder = OpenVINOAudioEncoder(core, WHISPER_ENCODER_OV, device=device.value)model.decoder = OpenVINOTextDecoder(core, WHISPER_DECODER_OV, device=device.value)

左滑查看更多


最终,调用 model.transcribe 函数,运行 AI 推理,并将生成的字幕文件保存为 srt 格式文件:

output_file = Path("downloaded_video.mp4")from utils import get_audio
audio = get_audio(output_file)task = widgets.Select(    options=["transcribe", "translate"],    value="translate",    description="Select task:",    disabled=False)tasktranscription = model.transcribe(audio, task=task.value)from utils import prepare_srt
srt_lines = prepare_srt(transcription)# save transcriptionwith output_file.with_suffix(".srt").open("w") as f:    f.writelines(srt_lines)

左滑查看更多


注意,由于 Notebook 提供的视频是 YTB 的视频,可能遇到无法下载的情况,这里我们也提供了一小段英文视频可供读者自由下载:http://985.so/2nu1c

(复制链接到浏览器打开查看更多内容)


只需将下载视频替换 notebook 里的视频路径即可体验 AI 字幕的功能。


结果展示:


原视频截图:

图 8:未进行字幕识别的原始视频截图


视频播放软件可以直接导入 SRT 字幕文件生成字幕:

图 9:已经进行字幕识别的原始视频截图



五、小结


英特尔® 认证的开发套件—— 爱克斯开发板以 Intel® Celeron™ N5105 作为处理核心,在相同的功耗下获得了优秀的计算性能。在本次实验中,它在 OpenVINO™ 工具套件的加持下可以轻松完成语音转文字的任务,通过轻量化 AI 模型(Whisper)实现字幕实时生成的功能。回顾之前搭建流媒体服务器的文章,我们可以使用开发板搭建一个 RTMP 流媒体服务器,然后可以将它们结合,将输入服务器的视频流实时生成字幕之后进行输出,这样就可以获得一个能给视频加英文字幕的流媒体服务器。爱克斯板的 I/O 接口丰富,摄像头,麦克风,传感器都可以进行接入,并且开发板有着不错的 CPU 处理性能,可以在 OpenVINO™ 工具套件的加持下处理一些常规的 AI 推理任务,开发者可以根据项目需求进行巧妙搭配,组合创新。作为英特尔® 认证的 DevKit,这块小小的开发板却蕴含着巨大的能量,可以兼容市面上大多数的扩展设备,也可以应用上英特尔提供的软硬件技术,加上集成显卡能为编解码处理与 AI 推理赋能,这块板子还是能创造出许多有趣的应用的。如果你对这块开发板感兴趣,那就赶快行动起来,开始你的开发创造之旅吧。


*注:文中带*为第三方开源软件工具并且文中涉及的其它名称及商标属于各自所有者资产。

OpenVINO™

--END--


              
              
              
你也许想了解(点击蓝字查看)⬇️
➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI
➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手
➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人
➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能
➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易
➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能
➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型
➡️ 开发者实战系列资源包来啦!
➡️  以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️  还不知道如何用OpenVINO™作画?点击了解教程。
➡️   几行代码轻松实现对于PaddleOCR的实时推理,快来get!
➡️   使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理


             
             
             

扫描下方二维码立即体验 

OpenVINO™ 工具套件 2023.1


点击 阅读原文 立即体验OpenVINO 2023.1
文章这么精彩,你有没有“在看”?

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部