NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

人工智慧洞察站發表於2023-05-05

來源:DataFunSummit

導讀 NeMo 是 NVIDIA 用於對話式 AI 的深度學習工具包,它可以用於自動語音識別(ASR, Automatic Speech Recognition)、自然語言處理(NLP, Natural Language Processing)、文字合成語音(TTS, Text to Speech)等多個對話式 AI 相關任務的訓練和推理。本次分享將重點介紹如何透過 NeMo 訓練 ASR 模型、NeMo 對中文語音的支援和對其他 Speech AI 相關應用的支援。

今天的介紹會圍繞下面四點展開:

1. NeMo背景介紹

2. 案例:基於 NeMo 訓練 ASR 模型

3. NeMo 對中文語音的支援

4. NeMo 對其他 Speech AI 相關應用的支援

分享嘉賓|丁文 NVIDIA Solution Architect

編輯整理|李樹

出品社群|DataFun


01

NeMo 背景介紹

1. NeMo 和對話式 AI 的整體介紹

NeMo 工具是一個用於對話式 AI 的深度學習工具,它可以用於自動語音識別( ASR,Automatic Speech Recognition)、自然語言處理(NLP,Natural Language Processing)、語音合成( TTS,Text to Speech)等多個對話式 AI 相關任務的訓練和推理。下面的這張圖給出了一個對話式 AI 的全流程。

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

對話式 AI 的輸入是一個音訊,音訊首先會進入 ASR 模組,ASR 模組包括了特徵提取、聲學模型、語言模型以及解碼器,識別出來的文字接著進入 NLU 模組,根據不同的業務需求進行相應的處理,如機器翻譯或者是 query 匹配等。以機器翻譯為例,我們將英文文字翻譯成中文文字,接著將中文文字輸入 TTS 模組,最終輸出一個語音段。整個 pipeline 均可在 NeMo 中實現。NeMo 希望協助 AI 從業者利用已有的程式碼或 pretrained模型,加快搭建語音語言相關的任務。整個 pipeline 的開始和結束分別是 ASR 和 TTS。這兩個部分屬於 speech AI 的一個領域,也是今天重點討論的範圍。

2. Speech AI—— ASR 的背景介紹

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

本節主要對 ASR 進行簡單的回顧和概述。ASR 是將語音轉換成文字的一個過程。傳統的 ASR 建模方法是基於隱馬爾可夫( HMM )和混合高斯模型(GMM)進行建模。2015 年微軟首次將神經網路引入到語音識別建模當中,使用神經網路來建模基於給定的音訊幀,HMM 狀態的後驗機率分佈,並使用 HMM 進行混合解碼得到文字。

近些年,得益於算力和資料的豐富,端到端的 ASR 得到了廣泛的關注。端到端的 ASR 也使得整個語音建模過程的 pipeline 更加簡潔。上圖給出了一個典型 ASR 的 pipeline。輸入的語音首先進入特徵提取和前處理模組,以獲得頻譜特徵。接著輸入到神經網路的聲學模型裡。最後解碼器結合語言模型輸出一個文字。近年流行的神經網路模型結構包括 Wav2letter,DeepSpeech,LAS,Citrinet 以及現在非常熱門的 Conformer。常見的語音識別工具包括 Kaldi,它也是語音識別當中最重要的工具之一, NVIDIA  針對 Kaldi 做了一系列的最佳化。Kaldi 主要支援 hybrid 系統及部分常見神經網路的訓練。第二類的工具是基於 PyTorch 或者是 Tensorflow 的開源工具,例如 OpenSeq2Seq、EspNet、WeNet 以及 NeMo。

3. NeMo 對 ASR 的支援

下面介紹 NeMo 目前支援的 ASR 的幾個方面。

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

它主要支援的模型結構包括傳統的 LSTM 以及由 NVIDIA 的 NeMo 團隊提出的 Jasper 家族(包括 Jasper,QuartzNet,Citrinet 等純 CNN 的結構),以及現在比較主流的模型如 Conformer 和 Squeezeformer 等。

NeMo 支援 CTC 和 Transducer/RNNT 兩種,也是目前學術和工業界較為關注的兩種解碼器。語言模型方面,NeMo 支援 N-gram 進行 LM fusion 以及神經網路語言模型進行 Rescoring 兩種方式。此外,NeMo 也支援流式訓練及解碼,可以配置不同的 chunk size 來適配不同的業務需求。

02

案例:基於 NeMo 訓練 ASR 模型

1. ASR 的資料準備

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

本節中將以語音識別為例,介紹如何在 NeMo 裡快速地搭建語音識別模型,會按照前面所提的語音 ASR 各個模組逐一介紹。

NeMo 中透過配置 config 檔案來使用不同的模組和引數。首先,需要準備資料集的 manifest,它是一個JSON檔案。例子如上圖所示,audio_filepath 需提供各條音訊地址。Duration 是音訊長度,text 是標註好的文字。我們也提供了不同資料集的預處理指令碼,例如 Librispeech、中文資料集 Aishell-1/2 等。也可以使用 Kaldi2json 指令碼將 Kaldi 格式的資料轉換成 NeMo 訓練所需要的格式。配置時需要指定 train,validation 和 test 三個部分。上圖右下角給出了示例 train_ds 的配置寫法。使用者根據自己資料的情況來進行相應配置。它主要包括:manifest_filepath 音訊的路徑;取樣率 sample_rate,通常是 16K 或者是 8K;labels 為訓練時的建模單元;max_duration 是最大音訊長度,中文裡我們通常選取 0.1 秒到 20 秒的長度區間,超過則會被丟棄。

NeMo 主要支援字(character)、子詞(subword)或者是 BPE(Byte Pair Encoding)作為建模單元。如上圖示例所示,左側一個子詞作為一個建模單元,右側是一個字作為單元。若我們以字作為建模單元,則需要在 labels 處指定字典即可。若我們以子詞、BPE 作為建模單元,則需要在 config 中指定對應的 tokenizer。我們也提供從文字中獲得 tokenizer 的指令碼。詳見圖片下方的連結,可以直接用來獲取根據個人資料訓練出的 tokenizer。

2. 特徵和增強

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

準備好資料後,首先需要做特徵提取,將語音段轉換成特徵例如梅爾譜或者是 MFCC 特徵。NeMo 中用於特徵提取模組有兩個:使用 AudioToMelSpectrogramPreprocessor 提取梅爾譜或者使用 AudioToMFCCPreprocessor 提取 MFCC 特徵。上圖右邊給出了一個示例。如使用梅爾譜特徵,需要在 preprocessor 模組的 target 部分賦值為 AudioToMelSpectrogramPreprocessor。此外,在 ASR 中常用的特徵增強與資料增強的方式,NeMo 也是支援的。例如 Spec Augmentation,只需在target 處賦值為 SpectrogramAugmentation 即可。NeMo 也支援其他的資料增強方式,包括 Speed perturbation 等。

3. 模型結構

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

處理好特徵後,接下來介紹 NeMo 中如何配置神經網路模型。以 Conformer 為例,主要的配置是在 encoder 部分。將 target 設定成 ConformerEncoder。我們可以透過配置不同的 number of layers(n_layers) 和 dimension(d_model) 來構建不同引數量的 Conformer 模型。也可以透過配置 self-attention 相關引數,如 number of heads(n_heads),以直接調整引數量。同時也支援相對位置編碼。

NeMo 支援流式的訓練和解碼。在這裡我們可以透過配置 att_context_size 來調整。[-1,-1] 表示左右可以看到的長度為無限長,所以此處是一個離線模型的配置。

右圖給出了當前 NeMo ASR 支援的全部模型,以及任務的配置檔案的列表。比如想訓練一個 Conformer 模型,只需要點開 Conformer 的 folder 就可以看到現在可以支援哪些配置。

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

NeMo 支援 CTC 和 RNN-Transducer 兩種 decoder。如果使用的是 CTC loss,需在 decoder 部分的 target 處設定成 Conv ASR Decoder。num_classes 指字典或者是 BPE 的詞表大小。如果使用 RNN Transducer loss,需在 decoder 的 target 處設定為 RNNT Decoder,同時需要配置 prediction network(prednet) 的 hidden size(pred_hidden)和 number of layers(pred_rnn_layers),同時還需要配置 joint network。如上圖右側所示,前往 conformer 資料夾下可以看我們能夠同時支援 CTC 和 Transducer 的 loss,character 和 BPE 的建模基本單元。另外,若需訓練流式 conformer 模型,只需前往 streaming 資料夾內便可看到如何操作。

4. Conformer-CTC 配置

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

結合上面的介紹,如果想啟動一個基於 Conformer CTC 的語音識別模型訓練,只需前往 NeMo 的 git 倉庫內 examples/ ASR /conf/conformer,選擇 conformer_ctc_char.yaml,即可進行相應的配置。需要自行指定的部分,包括最重要的 Dataset。預設 Spec Augment 是開啟的。預設 Decoder 是 CTC(因為前面選擇了 CTC 配置)。預設的最佳化器是 Adam。訓練使用 PyTorch Lightning。訓練時可以指定 GPU 還是 CPU、以及最大的 epoch。此外,其他的訓練配置可以在 Exp_manager 裡面進行設定。

5. 訓練和評估

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

配置完成後,便可以啟動訓練。只需要呼叫 Python 指令碼 examples/ASR/ASR_ctc/speech_to_text_ctc.py。config-name 需要設定成前面配置好的 conformer_ctc_char.yaml。

如果有一些其他引數需要配置或者是替代,可以在啟動訓練時給定一個值。如想替換訓練資料集 manifest 的地址,以及指定訓練的具體某個 GPU,如果想使用混合精度訓練,只需將 trainer.precision 設定成 16,它就會用 FP32 和 FP16 的混合精讀訓練來加速整個訓練流程。

訓練好模型後,需要測試評估,主要使用 speech_to_text_eval.py 檔案,可以把訓練好的 NeMo 的 checkpoint 填入 model_path。dataset_manifest 填入希望去測試的一個集合,格式也是 JSON 檔案。如果 metrics 是 CER,這裡需要配置 user_cer=True。這樣即可使用 CER 來衡量語音識別模型的效能。

6. 部署

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

NeMo 具有可以直接部署的方案。NeMo 首先可以支援直接匯出到 ONNX。NVIDIA 也有提供相應的模型部署的方案,主要是使用 Riva 這個產品。Riva 使用的是 NVIDIA TensorRT 加速神經網路模型,並且使用 NVIDIA Triton 進行服務。訓練好的 NeMo 模型是可以直接使用 NeMo2riva 命令進行轉換,從而可以在 Riva 中使用該模型。Riva 中的 ASR 部分也提供流式解碼功能,可以滿足不同的業務的需求。

03

‏中文支援

1. NeMo 內的中文模型及應用

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

下面主要介紹 NeMo 裡中文語音支援的情況。首先在 ASR 部分提供了 Aishell-1 和 Aishell-2 兩個預處理的指令碼,以及一些 pretrained 的模型,包括 Citrinet-CTC 和 Conformer-Transducer。大家可以去 NGC 下載預訓練好的模型進行測試或 finetune。上圖也給出了現在 Conformer transducer 在 Aishell-2 的效能。總體表現較好。此外,如果想使用其他的網路結構,只需要在配置檔案的 labels 處替換成相應的字典或者是 BPE 詞表即可。NeMo 加入了對中文的文字正則化的支援(基於 WFST),便於使用者對於一些中文資料的預處理。此外,中文的 TTS 也在計劃支援中。

2. Riva 內的中文模型及應用

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

Riva 主要是支援 Citrinet-CTC 和 Conformer-CTC 兩種 ASR 的模型,支援 N-gram LM fusion 的解碼方式,也支援中文標點模型。

04

NeMo 對其他 Speech AI 相關應用的支援

接下來需要討論的是,已經有了一個 ASR 模型,正式去搭建一個語音識別服務時,還需要 Speech AI 其他的哪些功能。

1. 語音端點檢測

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

首先需要一個 VAD(Voice Activity Detection)模組。VAD 是語音端點檢測,可以檢測出音訊中的人聲段,通常是很多語音識別任務的前置模組,用來過濾出有效的人聲段。它能夠節省很多資源,使 ASR 或者後續的其他語音任務更加高效,同時面對不同噪聲能夠更加魯棒,讓 ASR 能夠 focus 在識別的任務本身。它可以看作是把音訊判斷出 Label 為“是人聲”和“不是人聲”的一個二分類任務。在 NeMo 中,我們主要使用的 VAD 模型是  MarbleNet。它的結構見上圖右側,它也是 Jasper 家族的一個變種,一個純卷積網路的結構,它達到了在 AVA speech 資料集上的一個 SOTA 的結果。並且使用了更少的引數量,取得了更好的效能表現。

2. 說話人日誌

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

第二個要介紹的 speech AI 任務是 Speaker Diarization,即說話人日誌。它主要想解決的問題是 ” who spoke when?” (什麼人在什麼時候說話了?)。即給定一段音訊,需要給出屬於不同說話人的音訊段,以及相應的時間戳。這個任務在很多場景中都有應用,例如在會議轉寫場景裡面,SD 模組可給出不同參會者所說出的音訊段。

上圖右側給出了 SD 和 ASR 結合的示例。最上側是一個語音識別模組所做的事情,它識別出了音訊中對應的文字。最下側是 SD 模組,它需要給出 speaker1 說了 “hey” 和 “quite busy” 兩段音訊,speaker2 說了 “how are you”,並且給出了對應話的在音訊段中的開始和結束時間點。SD 模組可以在原始的 ASR 識別出的文字中加入說話人的資訊,能夠捕捉到不同說話人的特徵,並且區分錄音中哪一段屬於哪個說話人。它透過提取說話人的語音特徵,統計說話人的數量,將音訊的片段分配給對應的說話人,得到一個索引。

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

接下來展示 NeMo 中 Speaker Diarization 是如何實現的。上圖展示了它的 pipeline。首先是一個前置的 VAD 模組,會從一個長音訊中檢測出各個人聲段的開始和結束。第二步進行說話人的 Embedding 提取。NeMo 當中採用的模型就是 TitaNet,也是在最新發表在 ICASSP 2022 的論文裡提出的模型,根據聲學特徵來提取說話人的資訊。接下來是聚類模組,它對提取完畢的說話人的 Embedding 進行聚類,分成不同的類別。

最後一步,我們需要將前面的資訊進行彙總,來得到不同的說話人時間戳資訊。NeMo 中採用的是 Multi-scale Speaker Diarization 的方式,這也是在我們最新發表在 InterSpeech 2022 的論文內容,感興趣的同學可以看一下。

3. NeMo 提供的 SD 開源資源

NVIDIA NeMo 如何支援對話式 AI 任務的訓練與推理?

上圖中給出了 Speaker Diarization 方向目前由 NeMo 開源出來的 pretrained 模型,包括基於不同資料訓練出來的 VAD 模型,以及提取說話人 Embedding 特徵 的 Titanet 和 Ecapa_tdnn。前文提到的 Multi-scale Speaker Diarization 模型,也進行了開源,大家可以到對應的 NGC 連結來下載相應的模型進行測試和 finetune。

05

‏問答環節

Q1:Kaldi 單機多卡訓練問題,如何避免任務互相搶佔?

A1:把 GPU 的模式設成 Exclusive status,他就不會發生任務互相搶佔。

Q2:對中文 TTS 的支援情況如何?

A2:應該是年底就會完成支援。我們已經在去推進這個事情了。

Q3:有什麼通用的資料集,如果強行的把詞表放在 GPU 視訊記憶體,會不會給不夠?

A3:我們現在 NeMo 裡面中文用的是漢字,大概是 5000 個常用字(最核心的應該是 3000 個左右),其實 GPU 是可以放下的。

Q4:MarbleNet 的資源消耗和併發情況如何,以及模型的大小?

A4:它的模型非常小,可能幾百 k。其實在 Riva 裡面已經支援了 MarbleNet,整合到整個 pipeline 當中。

Q5:NeMo 的 ASR、VAD、SD 如何同時使用,有相關的指令碼嗎?

A5:有的,在 NeMo 的 tutorial 裡面有這樣的一個示例,怎麼把 VAD 加 SD 串聯起來。

Q6:什麼是預訓練模型?用預訓練模型後怎麼操作可以快速地滿足業務應用語音識別的需求?

A6:比如我們在 Aishell-2 上面訓練了一個 Conformer,然後把 Conformer 模型開源出來,大家就可以再根據自己資料的情況或者業務的情況,把它作為一個初始的模型來做 finetune,這樣會加速整個模型的迭代和收斂的速度。方便大家做後續的任務。

Q7:在 NeMo 的 pipeline 中,後處理的部分,CTC 測試部分,是用的 GPU 還是 CPU?

A7:我們現在 language model 的 fusion 是放在 CPU 上的,但我們其實也有一些 GPU 的解決方案。

Q8:具備對齊功能嗎?效果如何?

A8:沒有的,因為我們支援的是 CTC 和 RNNT,沒有 hybrid 系統裡面的 alignment。

Q9:去噪模型有相應的成果嗎?比如預訓練模型。

A9:我們預設 Spec Augmentation 都是加的,但是其他的一些資料增強的方式,比如混響,加噪和變速預設都是沒有開的。我們的 pretrained 模型一般都是加了 Spec Augmentation 的。

Q10:看大 NeMo 還支援 NLP 相關的任務,請問如果是做關係抽取應該怎麼配置?

A10:關係抽取,NLP 上面的一些任務,大家可以直接去 NeMo 的 Github官網上面看。它的 README 裡面有寫目前支援的模型以及方法。

Q11:ASR 同一模型可以在 inference 時設定 chunk size 同時滿足流式和離線嗎?

A11:在 inference 的時候,chunk size 需要設定成固定的,是不支援動態的加 chunk size 的。

Q12:NeMo 對變長的輸入會做什麼特殊處理嗎?

A12:沒有什麼特殊處理。我們一般在訓練時會對資料做一次排序,這樣每個 batch 的長度是基本一致的,padding 就不會打得長度不一致。基本上每個 batch 大小是比較固定的,能夠提高吞吐和訓練速度。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027828/viewspace-2950135/,如需轉載,請註明出處,否則將追究法律責任。

相關文章