語音辨識:使用遷移學習技術為您的專業領域自訂模型

作者 NVIDIA

本文是關於生成準確語音轉錄之系列文章的一部分。第一部分請見《Speech Recognition:Generating Accurate Transcriptions Using NVIDIA Riva》。第三部分請見《Speech Recognition:Deploying Models to Production》。

從頭開始建立一個新的人工智慧深度學習模型,是一個極為耗費時間和資源的過程。通常會使用遷移學習來解決這個問題。為了更加簡化這個過程,使用 NVIDIA TAO 工具套件可將工程時間框架從 80 週縮短到 8 週。TAO 工具套件支援電腦視覺與對話式人工智慧(ASR 和 NLP)應用場合。

本文涵蓋下列主題:

  • 安裝 TAO 工具套件及取得預先訓練模型
  • 微調預先訓練語音轉錄模型
  • 將微調好的模型匯出到 NVIDIA Riva

下載 Jupyter notebook,跟著以下步驟一起執行。

安裝 TAO 工具套件並下載預先訓練模型

在安裝 TAO 工具套件前,請確保系統上已安裝了以下元件:

  • python >= 3.6.9
  • docker-ce > 19.03.5
  • nvidia-docker2 3.4.0-1

如需更多關於安裝 nvidia-docker 及 docker 的資訊,請見安裝條件。可以使用 pip 安裝 TAO 工具套件。我們建議使用虛擬環境以避免版本衝突。

pip3 install nvidia-pyindex
pip3 install nvidia-tao

安裝好了之後,下一步是取得一些已預先完成訓練的模型。NVIDIA 提供了許多人工智慧或機器學習模型,不僅用在對話式人工智慧領域,還包括用在 NGC 或 NVIDIA GPU 雲端服務上的眾多領域。NGC 目錄是一套精心規劃的 GPU 最佳化軟體,用於人工智慧、高效能運算和視覺化。

如要從 NGC 下載資源,請使用 NGC API 金鑰登入註冊表。可免費建立和使用一個金鑰。

Screenshot of the API generation page.
1:取得 NGC API 金鑰

NVIDIA 打造的最先進自動語音辨識(automatic speech recognition,ASR)模型 CitriNet,可用於生成語音轉錄。可從 Speech to Text English Citrinet 模型卡下載這個模型。

wget https://api.ngc.nvidia.com/v2/models/nvidia/tao/speechtotext_english_citrinet/versions/trainable_v1.7/files/speechtotext_english_citrinet_1024.tlt

TAO 工具套件在後台下載並運行 Docker 容器,使用前面提到的規範檔以提供流暢的使用體驗。所有細節都隱藏在 TAO 啟動器中。可定義 JSON 檔案 ~/.tao_mounts.json 來指定裝載 Docker 容器的喜好位置。可在 Jupyter notebook 中找到裝載文件。

{
   "Mounts":[
       {
           "source": "~/tao/data",
           "destination": "/data" # The location in which to store the dataset
       },
       {
           "source": "~/tao/specs",
           "destination": "/specs" # The location in which to store the specification files
       },
       {
           "source": "~/tao/results",
           "destination": "/results" # The location in which to store the results
       },
       {
           "source": "~/.cache",
           "destination": "/root/.cache"
       }
   ],
   "DockerOptions":{
         "shm_size": "16G",
         "ulimits": {
            "memlock": -1,
            "stack": 67108864
     }
   }
}

這樣便安裝好了 TAO 工具套件、下載了一個經過預先訓練的 ASR 模型,還有指定了 TAO 工具套件啟動器的安裝點。我們在下一節中將討論如何使用 TAO 工具套件,還有您選擇的資料集來微調這個模型。

微調模型

使用 TAO 工具套件微調模型有三個步驟:

  1. 下載規範檔。
  2. 預先處理資料集。
  3. 使用超參數進行微調。

圖 2 顯示了微調模型所需的步驟。

For the ASR use case, there are three key steps: download specs, run preprocessing, and then fine-tune. Download the AN4 dataset and a .tlt model from NGC.
圖 2:TAO 工具套件工作流程

步驟 1:下載規範檔

NVIDIA TAO 工具套件是一種低程式碼或無程式碼的解決方案,通過規範檔簡化模型的訓練或微調作業。這些檔案讓您可自訂模型特定的參數、訓練師參數、優化器,以及針對您使用的資料集的參數。可將這些規範檔下載到先前裝載的資料夾:

tao speech_to_text_citrinet download_specs \
    -r /speech_to_text_citrinet \
    -o < path to specs dir>/speech_to_text_citrinet

以下是 TAO 工具套件附帶的 YAML 檔。更多相關資訊請見下載規範檔

  • create_tokenizer.yaml
  • dataset_convert_an4.yaml
  • dataset_convert_en.yaml
  • dataset_convert_ru.yaml
  • evaluate.yaml
  • export.yaml
  • finetune.yaml
  • infer_onnx.yaml
  • infer.yaml
  • train_citrinet_256.yaml
  • train_citrinet_bpe.yaml

您可自訂及使用這些規範檔。從預先處理和模型評估到推論及匯出模型,都有相對應的功能。這麼一來便能完成開發或自訂模型的過程,而無需建立複雜的程式碼庫。下載規範檔後,現在可以進到預先處理資料的步驟。

步驟 2:預先處理資料集

在本演練中將使用 CMU 的小型普查資料集 AN4 Dataset,其中包含地址、電話和其他個人資訊的紀錄。這與客戶支援對話中對話的初始步驟所需的轉錄類型類似。具有類似內容的較大自訂資料集可用於實際應用程式。

可直接下載和解壓縮 AN4 資料集或是使用以下命令:

TAO 工具套件訓練和微調模組期望以特定格式呈現資料。可使用 dataset_convert 命令完成此預先處理。我們將 AN4 和 Mozilla 通用語音資料集的規範檔,與 TAO 啟動器一同打包。可在步驟 1 裡面定義的目錄中找到這些規範檔。

這些清單檔(圖 3)包含在後續步驟中使用的以下資訊:

  • 音訊檔的路徑
  • 每個檔的持續時間
  • 每個檔的文字內容
The manifest files specify three things, the path to the audio file, duration of the said file, and the exact transcription for the audio.
圖 3:已處理清單檔的結構
tao speech_to_text_citrinet dataset_convert \
    -e /speech_to_text_citrinet/dataset_convert_an4.yaml \
    -r  /citrinet/dataset_convert \
    source_data_dir= /an4 \
    target_data_dir=/an4_converted

此命令將音訊檔轉換為 WAV 檔,並且生成訓練和測試清單檔。更多相關資訊,請見準備資料集

在大多數情況下都會進行預先處理,但 CitriNet 模型是一個特例。它需要以子詞標記化的形式進行更深入的處理,為文字建立子詞詞彙表。這與 Jasper 或 QuartzNet 不同,Jasper 或 QuartzNet 的詞彙表中只有單個字元被視為元素。在 CitriNet 中,子字可以是一個或多個字元。這可使用以下命令完成:

tao speech_to_text_citrinet create_tokenizer \
-e /speech_to_text_citrinet/create_tokenizer.yaml \
-r /citrinet/create_tokenizer \
manifests=/an4_converted/train_manifest.json \
output_root=/an4 \
vocab_size=32

到目前為止已經建立了一個工具,為遷移學習之類的複雜問題提供低程式碼或無程式碼解決方案。您已下載了一個預先訓練的模型,將音訊檔處理為必要格式且執行了標記化。您使用不到十個命令。現在所有必要的細節都已散列出來,您可以繼續微調模型。

步驟 3:使用超參數進行微調

正如在前面的步驟中所做的,您正在操作規範檔。更多相關資訊,請見建立實驗規範檔。如果要調整 FFT 視窗的大小,可以指定幾乎所有內容,從訓練特定參數(如優化器)到資料集特定參數,再到模型配置本身。

是否要更改學習速度和調度程式,還是在詞彙表中新增字元?無需打開程式碼庫並對其進行掃描,就能進行更改。您可以輕鬆進行各項自訂工作,且能跟整個團隊分享。此舉減少了在嘗試新想法和分享結果,以及模型配置方面的摩擦,進而提高了準確性。

以下是微調訓練器的方法:

trainer:
  max_epochs: 3   # This is low for demo purposes
tlt_checkpoint_interval: 1

change_vocabulary: true

以下是微調標記器的方法:

tokenizer:
  dir: /path/to/subword/vocabulary
  type: "bpe"   # Can be either bpe or wpe

以下是微調優化器的方法:

optim:
  name: novograd
  lr: 0.01
  betas: [0.8, 0.5]
  weight_decay: 0.001

  sched:
    name: CosineAnnealing
    warmup_steps: null
    warmup_ratio: null
    min_lr: 0.0
    last_epoch: -1

以下是微調資料集的方法:

# Fine-tuning settings: validation dataset
validation_ds:
  manifest_filepath: /path/to/manifest/file/
  sample_rate: 16000
  labels: [" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "'"]
  batch_size: 32
  shuffle: false

finetuning_ds:
  manifest_filepath: ???
  sample_rate: 160000
  labels: [" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "'"]
  batch_size: 32
  trim_silence: true
  max_duration: 16.7
  shuffle: true
  is_tarred: false
  tarred_audio_filepaths: null

最後要繼續進行的是按照需要修改規範檔,並運行以下命令。此命令使用先前下載的資料集來微調下載的模型。有關更多資訊,請見微調模型

tao speech_to_text_citrinet finetune \
     -e $SPECS_DIR/speech_to_text_citrinet/finetune.yaml \
     -g 1 \
     -k  \
     -m /speechtotext_english_citrinet_1024.tlt \
     -r $RESULTS_DIR/citrinet/finetune \
     finetuning_ds.manifest_filepath=$DATA_DIR/an4_converted/train_manifest.json \
     validation_ds.manifest_filepath=$DATA_DIR/an4_converted/test_manifest.json \
     trainer.max_epochs=1 \
     finetuning_ds.num_workers=1 \
     validation_ds.num_workers=1 \
     trainer.gpus=1 \
     tokenizer.dir=$DATA_DIR/an4/tokenizer_spe_unigram_v32

在微調或訓練模型後,自然會評估模型且評量是否需要進一步微調。NVIDIA 提供了評估模型執行推論的相關功能。

將微調好的模型匯出到 Riva

在實際環境中部署模型會帶來一系列挑戰。為此可使用 GPU 加速人工智慧語音 SDK NVIDIA Riva,以開發即時轉錄和虛擬助理等應用程式。

Riva 使用其他 NVIDIA 產品:

若您想要使用本演練中微調的模型,可使用以下命令將其匯出到 Riva。更多相關資訊,請見模型匯出

tao speech_to_text_citrinet export \
     -e /speech_to_text_citrinet/export.yaml \
     -g 1 \
     -k  \
     -m /citrinet/train/checkpoints/trained-model.tlt \
     -r /citrinet/riva \
     export_format=RIVA \
     export_to=asr-model.riva

接下來呢?

Citrinet for Speech Transcription 並非 NVIDIA 唯一提供的模型或應用場合。在對話式人工智慧和電腦視覺領域中,有多種應用場合及預先訓練的模型。更多相關資訊,請見 NVIDIA TAO 工具套件產品頁面。

我們在下一篇文章中將介紹如何安裝 NVIDIA Riva,以便在生產環境中部署這些模型,還有如何使用 NGC 目錄中的眾多模型之一。更多相關資訊,請見語音辨識:部署模型至生產環境