導入 これは (「パート 1 ガイド」) の補足ガイドです。私は、Meta AI の モデルをチリのスペイン語で微調整する方法についてパート 1 ガイドを書きました。このガイドを完了し、独自の微調整された XLS-R モデルを生成していることを前提としています。このガイドでは、 を介して微調整された XLS-R モデルで を実行する手順について説明します。 、「wav2vec2 の操作パート 1 - 自動音声認識のための XLS-R の微調整」 wav2vec2 XLS-R (「XLS-R」) Kaggle Notebook 推論 前提条件と始める前に ガイドを完了するには、次のものが必要です。 スペイン語用に微調整された XLS-R モデル。 既存の 。 Kaggle アカウント Python の中級レベルの知識。 Kaggle Notebooks の操作に関する中級レベルの知識。 ML 概念に関する中級レベルの知識。 ASR 概念に関する基本的な知識。 推論ノートブックの構築 ステップ 1 - Kaggle 環境の設定 ステップ 1.1 - 新しい Kaggle ノートブックを作成する Kaggleにログインします。 新しい Kaggle ノートブックを作成します。 ノートブックの名前は必要に応じて変更できます。このガイドでは、ノートブック名として を使用します。 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.4 SPECIAL_CHARS メソッドは、 の定数 で設定された数量のランダム テスト サンプルのセットを返します。 get_random_samples ステップ 2.4 NUM_LOAD_FROM_EACH_SET ステップ 2.6 - セル 6: オーディオ データの読み込みと再サンプリングのためのユーティリティ メソッド 6 番目のセルは、 を使用してオーディオ データを読み込み、再サンプリングするユーティリティ メソッドを定義します。6 番目のセルを次のように設定します。 torchaudio ### 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] メソッドは、指定されたオーディオ ファイルを読み込み、オーディオ データの 多次元マトリックスとオーディオのサンプリング レートを返します。トレーニング データ内のすべてのオーディオ ファイルのサンプリング レートは Hz です。この「元の」サンプリング レートは、 の定数 によって取得されます。 read_audio_data torch.Tensor 48000 ステップ 2.4 ORIG_SAMPLING_RATE メソッドは、オーディオ データを のサンプリング レートから のターゲット サンプリング レートにダウンサンプリングするために使用されます。 resample 48000 16000 ステップ 2.7 - セル 7: テスト データの読み取り 7 番目のセルは で定義された メソッドを使用して、男性話者の録音と女性話者の録音のテスト データ インデックス ファイルを読み取ります。7 番目のセルを次のように設定します。 、ステップ 2.5 read_index_file_data ### 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 番目のセルは で定義された メソッドを使用してランダム テスト サンプルのセットを生成します。8 番目のセルを次のように設定します。 、ステップ 2.5 get_random_samples ### 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 番目のセルは各テスト データ サンプルを反復処理し、 で定義された メソッドを使用して、関連付けられた転写テキストをクリーンアップします。10 番目のセルを次のように設定します。 ステップ 2.5 clean_text ### 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 番目のセルは、 リストで指定された各オーディオ ファイルを読み込みます。11 番目のセルを次のように設定します。 all_test_samples ### 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 番目のセルは、オーディオ データをターゲット サンプリング レート に再サンプリングします。12 番目のセルを次のように設定します。 16000 ### 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 ライブラリ クラスのインスタンスを初期化します。13 番目のセルを次のように設定します。 transformer pipeline ### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH") パラメータは、 で Kaggle Notebook に追加された微調整済み へのパスに設定する必要があります。例: model ステップ 1.3 モデル transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1") ステップ 2.14 - セル 14: 予測の生成 14 番目のセルは、前の手順で初期化された テスト データに対して呼び出して、テキスト予測を生成します。14 番目のセルを次のように設定します。 transcriber ### 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分析 ノートブックはテスト データのランダム サンプルに基づいて予測を生成するため、ノートブックを実行するたびに出力は異なります。次の出力は、 を に設定して合計 6 つのテスト サンプルでノートブックを実行したときに生成されました。 NUM_LOAD_FROM_EACH_SET 3 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 番目のサンプル (インデックス ) で という単語を と誤って綴ったという 1 つのエラーのみがありました。もちろん、ノートブックを別のテスト サンプルで再度実行すると、そしてさらに重要なことに、より多くのテスト サンプルで実行すると、異なる、より有益な結果が得られます。それでも、この限られたデータは、モデルがスペイン語のさまざまな方言で優れたパフォーマンスを発揮できることを示唆しています。つまり、モデルはチリのスペイン語でトレーニングされましたが、ペルーのスペイン語でも優れたパフォーマンスを発揮するようです。 5 septiembre setiembre 結論 wav2vec2 モデルの操作方法を学習している方は、 ガイドとこのガイドがお役に立てば幸いです。前述のように、パート 1 ガイドで生成された微調整モデルは最先端のものではありませんが、それでも多くのアプリケーションで役立つはずです。楽しい構築を! 「wav2vec2 の操作パート 1 - 自動音声認識用の XLS-R の微調整」