これは、「wav2vec2 の操作パート 1 - 自動音声認識のための XLS-R の微調整」 (「パート 1 ガイド」) の補足ガイドです。私は、Meta AI のwav2vec2 XLS-R (「XLS-R」)モデルをチリのスペイン語で微調整する方法についてパート 1 ガイドを書きました。このガイドを完了し、独自の微調整された XLS-R モデルを生成していることを前提としています。このガイドでは、 Kaggle Notebookを介して微調整された XLS-R モデルで推論を実行する手順について説明します。
ガイドを完了するには、次のものが必要です。
spanish-asr-inference
を使用します。このガイドでは、テスト データのソースとしてペルーのスペイン語音声データセットを使用します。チリのスペイン語音声データセットと同様に、ペルー語話者のデータセットも 2 つのサブデータセット (男性ペルー語話者の録音 2,918 件と女性ペルー語話者の録音 2,529 件) で構成されています。
このデータセットは、2 つの異なるデータセットとして Kaggle にアップロードされています。
「入力の追加」をクリックして、これらのデータセットを両方とも Kaggle ノートブックに追加します。
「wav2vec2 の使用パート 1 - 自動音声認識のための XLS-R の微調整」ガイドのステップ 4で、微調整したモデルをKaggle モデルとして保存しておく必要があります。
「入力の追加」をクリックして、微調整したモデルを Kaggle Notebook に追加します。
次の 16 のサブステップでは、推論ノートブックの 16 個のセルを順番に構築します。ここでは、パート 1 ガイドと同じユーティリティ メソッドの多くが使用されていることがわかります。
推論ノートブックの最初のセルは依存関係をインストールします。最初のセルを次のように設定します。
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
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
3 番目のセルは、HuggingFace WER 評価メトリックをインポートします。3 番目のセルを次のように設定します。
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
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
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.4でSPECIAL_CHARS
に割り当てられた正規表現で指定された文字を各テキスト転写から削除するために使用されます。句読点を含むこれらの文字は、オーディオ機能とテキスト転写間のマッピングを学習するようにモデルをトレーニングするときに意味的な価値を提供しないため、削除できます。get_random_samples
メソッドは、ステップ 2.4の定数NUM_LOAD_FROM_EACH_SET
で設定された数量のランダム テスト サンプルのセットを返します。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
のターゲット サンプリング レートにダウンサンプリングするために使用されます。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")
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)
9 番目のセルは、男性のテスト サンプルと女性のテスト サンプルを 1 つのリストに結合します。9 番目のセルを次のように設定します。
### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female
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])
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
に保存されます。各辞書には、特定のサンプルのオーディオ データ、サンプリング レート、およびオーディオのテキスト転写が含まれています。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]
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")
14 番目のセルは、前の手順で初期化されたtranscriber
テスト データに対して呼び出して、テキスト予測を生成します。14 番目のセルを次のように設定します。
### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)
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)
16 番目の最後のセルは、前の手順の WER 計算を単純に出力します。16 番目のセルを次のように設定します。
### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)
ノートブックはテスト データのランダム サンプルに基づいて予測を生成するため、ノートブックを実行するたびに出力は異なります。次の出力は、 NUM_LOAD_FROM_EACH_SET
を3
に設定して合計 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 ガイドで生成された微調整モデルは最先端のものではありませんが、それでも多くのアプリケーションで役立つはずです。楽しい構築を!