一、本文目的
市面上有很多自然語言處理模型,本文旨在幫助開發者快速將 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 實時插補控制都能穩定運行。可作為邊緣計算引擎用于人工智能產品驗證、開發;也可以作為域控核心用于機器人產品開發。
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_env source env/bin/activate
左滑查看更多
命令行中運行如下 pip 安裝指令:
pip install openvino pip install -q "python-ffmpeg<=1.0.16" moviepy transformers onnx python -m pip install pytube pip install -q -U gradio pip install git+https://github.com/openai/whisper.git
左滑查看更多
進入 notebooks/227-whisper-subtitles-generation/目錄中,安裝 Jupyter Notebook 并打開 227-whisper-convert.ipynb 文件:
pip install notebook jupyter notebook
下面進入 227-whisper-convert.ipynb 文件中運行代碼
首先,下載 Whisper 現成的預訓練模型,代號為“base”
import whisper model = whisper.load_model("base") model.to("cpu") model.eval() pass
左滑查看更多
模型主要是編碼器 - 解碼器的結構,所以我們先把 Encoder 部分被轉成 IR 模型,保存至本地:
import torch import 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 ) task transcription = model.transcribe(audio, task=task.value) from utils import prepare_srt srt_lines = prepare_srt(transcription) # save transcription with output_file.with_suffix(".srt").open("w") as f: f.writelines(srt_lines)
左滑查看更多
注意,由于 Notebook 提供的視頻是 YTB 的視頻,可能遇到無法下載的情況,這里我們也提供了一小段英文視頻可供讀者自由下載
只需將下載視頻替換 notebook 里的視頻路徑即可體驗 AI 字幕的功能。
結果展示:
視頻播放軟件可以直接導入 SRT 字幕文件生成字幕
五、小結
英特爾認證的開發套件—— 愛克斯開發板以 Intel Celeron N5105 作為處理核心,在相同的功耗下獲得了優秀的計算性能。在本次實驗中,它在 OpenVINO 工具套件的加持下可以輕松完成語音轉文字的任務,通過輕量化 AI 模型(Whisper)實現字幕實時生成的功能。回顧之前搭建流媒體服務器的文章,我們可以使用開發板搭建一個 RTMP 流媒體服務器,然后可以將它們結合,將輸入服務器的視頻流實時生成字幕之后進行輸出,這樣就可以獲得一個能給視頻加英文字幕的流媒體服務器。愛克斯板的 I/O 接口豐富,攝像頭,麥克風,傳感器都可以進行接入,并且開發板有著不錯的 CPU 處理性能,可以在 OpenVINO 工具套件的加持下處理一些常規的 AI 推理任務,開發者可以根據項目需求進行巧妙搭配,組合創新。作為英特爾認證的 DevKit,這塊小小的開發板卻蘊含著巨大的能量,可以兼容市面上大多數的擴展設備,也可以應用上英特爾提供的軟硬件技術,加上集成顯卡能為編解碼處理與 AI 推理賦能,這塊板子還是能創造出許多有趣的應用的。如果你對這塊開發板感興趣,那就趕快行動起來,開始你的開發創造之旅吧。
審核編輯:湯梓紅
-
英特爾
+關注
關注
61文章
9964瀏覽量
171773 -
AI
+關注
關注
87文章
30896瀏覽量
269086 -
人工智能
+關注
關注
1791文章
47279瀏覽量
238493 -
開發套件
+關注
關注
2文章
154瀏覽量
24277 -
OpenVINO
+關注
關注
0文章
93瀏覽量
202
原文標題:如何使用英特爾開發套件部署 AI 字幕生成器 | 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論