語音辨識是人工智慧中的一個領域,它允許電腦理解人類語音並將其轉換為文字。該技術用於 Alexa 和各種聊天機器人應用程式等設備。而我們最常見的就是語音轉錄,語音轉錄可以語音轉換成文字記錄或字幕。
wav2vec2、Conformer 和 Hubert 等最先進模型的最新發展極大地推動了語音辨識領域的發展。這些模型採用無需人工標記資料即可從原始音訊中學習的技術,使它們能夠有效地使用未標記語音的大型資料集。它們也被擴展為使用多達1,000,000 小時的訓練數據,遠遠超過學術監督數據集中使用的傳統1,000 小時,但是以監督方式跨多個數據集和領域預訓練的模型已被發現表現出更好的穩健性和對持有資料集的泛化,所以執行語音辨識等任務仍然需要微調,這限制了它們的全部潛力。為了解決這個問題OpenAI 發展了 Whisper,一種利用弱監督方法的模型。
本文將說明用於訓練的資料集的種類以及模型的訓練方法,以及如何使用Whisper
Whisper模型是在68萬小時標記音訊資料的資料集上訓練的,其中包括11.7萬小時96種不同語言的演講和12.5萬小時從」任意語言「到英語的翻譯資料。該模型利用了互聯網生成的文本,這些文本是由其他自動語音識別系統(ASR)生成而不是人類創建的。該資料集還包括一個在VoxLingua107上訓練的語言偵測器,這是從YouTube影片中提取的短語音片段的集合,並根據影片標題和描述的語言進行標記,並帶有額外的步驟來去除誤報。
主要採用的結構是編碼器-解碼器結構。
重採樣:16000 Hz
特徵擷取方法:使用25毫秒的視窗和10毫秒的步幅計算80通道的log Mel譜圖表示。
特徵歸一化:輸入在全域內縮放到-1到1之間,並且在預訓練資料集上具有近似為零的平均值。
編碼器/解碼器:此模型的編碼器和解碼器採用Transformers。
編碼器首先使用一個包含兩個卷積層(濾波器寬度為3)的詞幹處理輸入表示,並使用GELU啟動函數。
第二個卷積層的步幅為 2。
然後將正弦位置嵌入新增到詞幹的輸出中,然後套用編碼器 Transformer 區塊。
Transformers使用預先啟動殘差塊,編碼器的輸出使用歸一化層進行歸一化。
在解碼器中,使用了學習位置嵌入和綁定輸入輸出標記表示。
編碼器和解碼器具有相同的寬度和數量的Transformers區塊。
為了改進模型的縮放屬性,它在不同的輸入大小上進行了訓練。
透過 FP16、動態損失縮放,並採用資料並行來訓練模型。
使用AdamW和梯度範數裁剪,在對前 2048 次更新進行預熱後,線性學習率衰減為零。
使用 256 個批次大小,並訓練模型進行 220次更新,這相當於對資料集進行兩到三次前向傳遞。
由於模型只訓練了幾個輪次,過度擬合不是一個重要問題,並且沒有使用資料增強或正規化技術。這反而可以依靠大型資料集內的多樣性來促進泛化和魯棒性。
Whisper 在先前使用過的資料集上展示了良好的準確性,並且已經針對其他最先進的模型進行了測試。
Whisper在不同資料集上的比較結果,相較於wav2vec取得了目前最低的字錯誤率
模型沒有在timit資料集上進行測試,所以為了檢查它的單字錯誤率,我們將在這裡示範如何使用Whisper來自行驗證timit資料集,也就是說使用Whisper來建立我們自己的語音辨識應用。
TIMIT 閱讀語音語料庫是語音資料的集合,它專門用於聲學語音研究以及自動語音辨識系統的開發和評估。它包括來自美國英語八種主要方言的 630 位演講者的錄音,每人朗讀十個語音豐富的句子。語料庫包括時間對齊的拼字、語音和單字轉錄以及每個語音的 16 位元、16kHz 語音波形檔案。該語料庫由麻省理工學院 (MIT)、SRI International (SRI) 和德州儀器 (TI) 共同開發。 TIMIT 語料庫轉錄已手動驗證,並指定了測試和訓練子集,以平衡語音和方言覆蓋範圍。
安裝:
!pip install git+https://github.com/openai/whisper.git !pip install jiwer !pip install datasets==1.18.3
第一條指令將安裝whisper模型所需的所有相依性。 jiwer是用來下載文字錯誤率包的datasets是hugface提供的資料集包,可以下載timit資料集。
導入庫
import whisper from pytube import YouTube from glob import glob import os import pandas as pd from tqdm.notebook import tqdm
載入timit資料集
from datasets import load_dataset, load_metric timit = load_dataset("timit_asr")
考慮到過濾英文資料和非英文數據的需求,我們在這裡選擇使用多語言模型,而不是專門為英語設計的模型。
但是TIMIT資料集是純英文的,所以我們要應用相同的語言偵測和辨識過程。另外就是TIMIT資料集已經分割好訓練和驗證集,我們可以直接使用。
要使用Whisper,我們就要先了解不同模型的參數,大小和速度。
載入模型
model = whisper.load_model('tiny')
tiny可以替換為上面提到的模型名稱。
定義語言偵測器的函數
def lan_detector(audio_file): print('reading the audio file') audio = whisper.load_audio(audio_file) audio = whisper.pad_or_trim(audio) mel = whisper.log_mel_spectrogram(audio).to(model.device) _, probs = model.detect_language(mel) if max(probs, key=probs.get) == 'en': return True return False
轉換語音到文字的函數
def speech2text(audio_file): text = model.transcribe(audio_file) return text["text"]
在不同模型大小下運行上面的函數,timit訓練和測試得到的單字錯誤率如下:
#與其他語音辨識模型相比,Whisper 不僅能辨識語音,還能解讀一個人語音中的標點語調,並插入適當的標點符號,我們下面使用u2b的影片進行測試。
這裡就需要一個套件pytube,它可以輕鬆的幫助我們下載和提取音訊
def youtube_audio(link): youtube_1 = YouTube(link) videos = youtube_1.streams.filter(only_audio=True) name = str(link.split('=')[-1]) out_file = videos[0].download(name) link = name.split('=')[-1] new_filename = link+".wav" print(new_filename) os.rename(out_file, new_filename) print(name) return new_filename,link
獲得wav檔案後,我們就可以應用上面的函數從中提取文字。
本文的程式碼在這裡
https://drive.google.com/file/d/1FejhGseX_S1Ig_Y5nIPn1OcHN8DLFGIO/view
還有許多操作可以用Whisper完成,你可以依照本文的程式碼自行嘗試。
以上是使用OpenAI的Whisper 模型進行語音識別的詳細內容。更多資訊請關注PHP中文網其他相關文章!