paint-brush
wav2vec2 の操作パート 2 - 微調整された ASR モデルでの推論の実行@pictureinthenoise
195 測定値

wav2vec2 の操作パート 2 - 微調整された ASR モデルでの推論の実行

Picture in the Noise11m2024/05/07
Read on Terminal Reader

長すぎる; 読むには

このコンパニオン ガイドでは、微調整された wav2vec2 XLS-R モデルで推論を実行する手順について説明します。これは、「wav2vec2 の操作 パート 1 - 自動音声認識用の XLS-R の微調整」ガイドを補完するものです。このガイドでは、推論の実行に使用できる Kaggle ノートブックを作成する手順を段階的に説明します。
featured image - wav2vec2 の操作パート 2 - 微調整された ASR モデルでの推論の実行
Picture in the Noise HackerNoon profile picture
0-item
1-item

導入

これは、「wav2vec2 の操作パート 1 - 自動音声認識のための XLS-R の微調整」 (「パート 1 ガイド」) の補足ガイドです。私は、Meta AI のwav2vec2 XLS-R (「XLS-R」)モデルをチリのスペイン語で微調整する方法についてパート 1 ガイドを書きました。このガイドを完了し、独自の微調整された XLS-R モデルを生成していることを前提としています。このガイドでは、 Kaggle Notebookを介して微調整された XLS-R モデルで推論を実行する手順について説明します。

前提条件と始める前に

ガイドを完了するには、次のものが必要です。


  • スペイン語用に微調整された XLS-R モデル。
  • 既存のKaggle アカウント
  • Python の中級レベルの知識。
  • Kaggle Notebooks の操作に関する中級レベルの知識。
  • ML 概念に関する中級レベルの知識。
  • ASR 概念に関する基本的な知識。

推論ノートブックの構築

ステップ 1 - Kaggle 環境の設定

ステップ 1.1 - 新しい Kaggle ノートブックを作成する

  1. Kaggleにログインします。
  2. 新しい Kaggle ノートブックを作成します。
  3. ノートブックの名前は必要に応じて変更できます。このガイドでは、ノートブック名としてspanish-asr-inferenceを使用します。

ステップ 1.2 - テストデータセットの追加

このガイドでは、テスト データのソースとしてペルーのスペイン語音声データセットを使用します。チリのスペイン語音声データセットと同様に、ペルー語話者のデータセットも 2 つのサブデータセット (男性ペルー語話者の録音 2,918 件と女性ペルー語話者の録音 2,529 件) で構成されています。


このデータセットは、2 つの異なるデータセットとして Kaggle にアップロードされています。


「入力の追加」をクリックして、これらのデータセットを両方とも Kaggle ノートブックに追加します。

ステップ 1.3 - 微調整されたモデルの追加

「wav2vec2 の使用パート 1 - 自動音声認識のための XLS-R の微調整」ガイドのステップ 4で、微調整したモデルをKaggle モデルとして保存しておく必要があります。


「入力の追加」をクリックして、微調整したモデルを Kaggle Notebook に追加します。

ステップ 2 - 推論ノートブックの構築

次の 16 のサブステップでは、推論ノートブックの 16 個のセルを順番に構築します。ここでは、パート 1 ガイドと同じユーティリティ メソッドの多くが使用されていることがわかります。

ステップ 2.1 - セル 1: パッケージのインストール

推論ノートブックの最初のセルは依存関係をインストールします。最初のセルを次のように設定します。


 ### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer

ステップ 2.2 - セル 2: Python パッケージのインポート

2 番目のセルは必要な Python パッケージをインポートします。2 番目のセルを次のように設定します。


 ### CELL 2: Import Python packages ### import re import math import random import pandas as pd import torchaudio from datasets import load_metric from transformers import pipeline

ステップ 2.3 - セル 3: WER メトリックの読み込み

3 番目のセルは、HuggingFace WER 評価メトリックをインポートします。3 番目のセルを次のように設定します。


 ### CELL 3: Load WER metric ### wer_metric = load_metric("wer")


  • WER は、テスト データ上で微調整されたモデルのパフォーマンスを測定するために使用されます。

ステップ 2.4 - セル 4: 定数の設定

4 番目のセルは、ノートブック全体で使用される定数を設定します。4 番目のセルを次のように設定します。


 ### CELL 4: Constants ### # Testing data TEST_DATA_PATH_MALE = "/kaggle/input/google-spanish-speakers-peru-male/" TEST_DATA_PATH_FEMALE = "/kaggle/input/google-spanish-speakers-peru-female/" EXT = ".wav" NUM_LOAD_FROM_EACH_SET = 3 # Special characters SPECIAL_CHARS = r"[\d\,\-\;\!\¡\?\¿\।\'\'\"\–\'\:\/\.\“\”\৷\…\‚\॥\\]" # Sampling rates ORIG_SAMPLING_RATE = 48000 TGT_SAMPLING_RATE = 16000

ステップ 2.5 - セル 5: インデックス ファイルの読み取り、テキストのクリーンアップ、語彙の作成のためのユーティリティ メソッド

5 番目のセルは、データセット インデックス ファイルの読み取り、転写テキストのクリーンアップ、テスト データからのランダムなサンプル セットの生成を行うユーティリティ メソッドを定義します。5 番目のセルを次のように設定します。


 ### CELL 5: Utility methods for reading index files, cleaning text, random indices generator ### def read_index_file_data(path: str, filename: str): data = [] with open(path + filename, "r", encoding = "utf8") as f: lines = f.readlines() for line in lines: file_and_text = line.split("\t") data.append([path + file_and_text[0] + EXT, file_and_text[1].replace("\n", "")]) return data def clean_text(text: str) -> str: cleaned_text = re.sub(SPECIAL_CHARS, "", text) cleaned_text = cleaned_text.lower() return cleaned_text def get_random_samples(dataset: list, num: int) -> list: used = [] samples = [] for i in range(num): a = -1 while a == -1 or a in used: a = math.floor(len(dataset) * random.random()) samples.append(dataset[a]) used.append(a) return samples


  • read_index_file_dataメソッドは、 line_index.tsvデータセット インデックス ファイルを読み取り、オーディオ ファイル名と転写データを含むリストのリストを生成します。例:


 [ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]


  • clean_textメソッドは、ステップ 2.4SPECIAL_CHARSに割り当てられた正規表現で指定された文字を各テキスト転写から削除するために使用されます。句読点を含むこれらの文字は、オーディオ機能とテキスト転写間のマッピングを学習するようにモデルをトレーニングするときに意味的な価値を提供しないため、削除できます。
  • get_random_samplesメソッドは、ステップ 2.4の定数NUM_LOAD_FROM_EACH_SETで設定された数量のランダム テスト サンプルのセットを返します。

ステップ 2.6 - セル 6: オーディオ データの読み込みと再サンプリングのためのユーティリティ メソッド

6 番目のセルは、 torchaudioを使用してオーディオ データを読み込み、再サンプリングするユーティリティ メソッドを定義します。6 番目のセルを次のように設定します。


 ### CELL 7: Utility methods for loading and resampling audio data ### def read_audio_data(file): speech_array, sampling_rate = torchaudio.load(file, normalize = True) return speech_array, sampling_rate def resample(waveform): transform = torchaudio.transforms.Resample(ORIG_SAMPLING_RATE, TGT_SAMPLING_RATE) waveform = transform(waveform) return waveform[0]


  • read_audio_dataメソッドは、指定されたオーディオ ファイルを読み込み、オーディオ データのtorch.Tensor多次元マトリックスとオーディオのサンプリング レートを返します。トレーニング データ内のすべてのオーディオ ファイルのサンプリング レートは48000 Hz です。この「元の」サンプリング レートは、ステップ 2.4の定数ORIG_SAMPLING_RATEによって取得されます。
  • resampleメソッドは、オーディオ データを48000のサンプリング レートから16000のターゲット サンプリング レートにダウンサンプリングするために使用されます。

ステップ 2.7 - セル 7: テスト データの読み取り

7 番目のセルは、ステップ 2.5で定義されたread_index_file_dataメソッドを使用して、男性話者の録音と女性話者の録音のテスト データ インデックス ファイルを読み取ります。7 番目のセルを次のように設定します。


 ### CELL 7: Read test data ### test_data_male = read_index_file_data(TEST_DATA_PATH_MALE, "line_index.tsv") test_data_female = read_index_file_data(TEST_DATA_PATH_FEMALE, "line_index.tsv")

ステップ 2.8 - セル 8: ランダム テスト サンプルのリストを生成する

8 番目のセルは、ステップ 2.5で定義されたget_random_samplesメソッドを使用してランダム テスト サンプルのセットを生成します。8 番目のセルを次のように設定します。


 ### CELL 8: Generate lists of random test samples ### random_test_samples_male = get_random_samples(test_data_male, NUM_LOAD_FROM_EACH_SET) random_test_samples_female = get_random_samples(test_data_female, NUM_LOAD_FROM_EACH_SET)

ステップ 2.9 - セル 9: テスト データの結合

9 番目のセルは、男性のテスト サンプルと女性のテスト サンプルを 1 つのリストに結合します。9 番目のセルを次のように設定します。


 ### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female

ステップ 2.10 - セル 10: クリーニング転写テスト

10 番目のセルは各テスト データ サンプルを反復処理し、ステップ 2.5で定義されたclean_textメソッドを使用して、関連付けられた転写テキストをクリーンアップします。10 番目のセルを次のように設定します。


 ### CELL 10: Clean text transcriptions ### for index in range(len(all_test_samples)): all_test_samples[index][1] = clean_text(all_test_samples[index][1])

ステップ 2.11 - セル 11: オーディオ データの読み込み

11 番目のセルは、 all_test_samplesリストで指定された各オーディオ ファイルを読み込みます。11 番目のセルを次のように設定します。


 ### CELL 11: Load audio data ### all_test_data = [] for index in range(len(all_test_samples)): speech_array, sampling_rate = read_audio_data(all_test_samples[index][0]) all_test_data.append({ "raw": speech_array, "sampling_rate": sampling_rate, "target_text": all_test_samples[index][1] })


  • オーディオ データはtorch.Tensorとして返され、辞書のリストとしてall_test_dataに保存されます。各辞書には、特定のサンプルのオーディオ データ、サンプリング レート、およびオーディオのテキスト転写が含まれています。

ステップ 2.12 - セル 12: オーディオ データの再サンプリング

12 番目のセルは、オーディオ データをターゲット サンプリング レート16000に再サンプリングします。12 番目のセルを次のように設定します。


 ### CELL 12: Resample audio data and cast to NumPy arrays ### all_test_data = [{"raw": resample(sample["raw"]).numpy(), "sampling_rate": TGT_SAMPLING_RATE, "target_text": sample["target_text"]} for sample in all_test_data]

ステップ 2.13 - セル 13: 自動音声認識パイプラインのインスタンスの初期化

13 番目のセルは、HuggingFace transformerライブラリpipelineクラスのインスタンスを初期化します。13 番目のセルを次のように設定します。


 ### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")


  • modelパラメータは、ステップ 1.3で Kaggle Notebook に追加された微調整済みモデルへのパスに設定する必要があります。例:


 transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")

ステップ 2.14 - セル 14: 予測の生成

14 番目のセルは、前の手順で初期化されたtranscriberテスト データに対して呼び出して、テキスト予測を生成します。14 番目のセルを次のように設定します。


 ### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)

ステップ 2.15 - セル 15: WER メトリックの計算

15 番目のセルは、各予測の WER スコアと、すべての予測の全体的な WER スコアを計算します。15 番目のセルを次のように設定します。


 ### CELL 15: Calculate WER metrics ### predictions = [transcription["text"] for transcription in transcriptions] references = [transcription["target_text"][0] for transcription in transcriptions] wers = [] for p in range(len(predictions)): wer = wer_metric.compute(predictions = [predictions[p]], references = [references[p]]) wers.append(wer) zipped = list(zip(predictions, references, wers)) df = pd.DataFrame(zipped, columns=["Prediction", "Reference", "WER"]) wer = wer_metric.compute(predictions = predictions, references = references)

ステップ 2.16 - セル 16: WER メトリックの印刷

16 番目の最後のセルは、前の手順の WER 計算を単純に出力します。16 番目のセルを次のように設定します。


 ### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)

WER分析

ノートブックはテスト データのランダム サンプルに基づいて予測を生成するため、ノートブックを実行するたびに出力は異なります。次の出力は、 NUM_LOAD_FROM_EACH_SET3に設定して合計 6 つのテスト サンプルでノートブックを実行したときに生成されました。


 Overall WER: 0.013888888888888888 Prediction \ 0 quiero que me reserves el mejor asiento del teatro 1 el llano en llamas es un clásico de juan rulfo 2 el cuadro de los alcatraces es una de las pinturas más famosas de diego rivera 3 hay tres cafés que están abiertos hasta las once de la noche 4 quiero que me recomiendes una dieta pero donde uno pueda comer algo no puras verduras 5 cuántos albergues se abrieron después del terremoto del diecinueve de setiembre Reference \ 0 quiero que me reserves el mejor asiento del teatro 1 el llano en llamas es un clásico de juan rulfo 2 el cuadro de los alcatraces es una de las pinturas más famosas de diego rivera 3 hay tres cafés que están abiertos hasta las once de la noche 4 quiero que me recomiendes una dieta pero donde uno pueda comer algo no puras verduras 5 cuántos albergues se abrieron después del terremoto del diecinueve de septiembre WER 0 0.000000 1 0.000000 2 0.000000 3 0.000000 4 0.000000 5 0.090909


ご覧のとおり、モデルは素晴らしい仕事をしました。6 番目のサンプル (インデックス5 ) でseptiembreという単語をsetiembreと誤って綴ったという 1 つのエラーのみがありました。もちろん、ノートブックを別のテスト サンプルで再度実行すると、そしてさらに重要なことに、より多くのテスト サンプルで実行すると、異なる、より有益な結果が得られます。それでも、この限られたデータは、モデルがスペイン語のさまざまな方言で優れたパフォーマンスを発揮できることを示唆しています。つまり、モデルはチリのスペイン語でトレーニングされましたが、ペルーのスペイン語でも優れたパフォーマンスを発揮するようです。

結論

wav2vec2 モデルの操作方法を学習している方は、 「wav2vec2 の操作パート 1 - 自動音声認識用の XLS-R の微調整」ガイドとこのガイドがお役に立てば幸いです。前述のように、パート 1 ガイドで生成された微調整モデルは最先端のものではありませんが、それでも多くのアプリケーションで役立つはずです。楽しい構築を!