Dies ist ein Begleithandbuch zum Arbeiten mit wav2vec2 Teil 1 – Feinabstimmung von XLS-R für automatische Spracherkennung (das „Handbuch Teil 1“). Ich habe das Handbuch Teil 1 zum Feinabstimmen des wav2vec2 XLS-R-Modells („XLS-R“) von Meta AI auf chilenisches Spanisch geschrieben. Es wird davon ausgegangen, dass Sie dieses Handbuch abgeschlossen und Ihr eigenes feinabgestimmtes XLS-R-Modell erstellt haben. Dieses Handbuch erklärt die Schritte zum Ausführen von Inferenzen auf Ihrem feinabgestimmten XLS-R-Modell über ein Kaggle-Notebook .
Zum Ausfüllen des Handbuchs benötigen Sie:
spanish-asr-inference
verwendet.Dieses Handbuch verwendet den peruanischen spanischen Sprachdatensatz als Quelle für Testdaten. Wie der chilenische spanische Sprachdatensatz besteht auch der peruanische Sprecherdatensatz aus zwei Unterdatensätzen: 2.918 Aufnahmen männlicher peruanischer Sprecher und 2.529 Aufnahmen weiblicher peruanischer Sprecher.
Dieser Datensatz wurde als zwei unterschiedliche Datensätze auf Kaggle hochgeladen:
Fügen Sie beide Datensätze zu Ihrem Kaggle-Notebook hinzu, indem Sie auf „Eingabe hinzufügen“ klicken.
Sie sollten Ihr feinabgestimmtes Modell in Schritt 4 des Leitfadens „Arbeiten mit wav2vec2, Teil 1 – Feinabstimmung von XLS-R für die automatische Spracherkennung“ als Kaggle-Modell gespeichert haben.
Fügen Sie Ihr fein abgestimmtes Modell Ihrem Kaggle-Notebook hinzu, indem Sie auf „Eingabe hinzufügen“ klicken.
Die folgenden 16 Unterschritte bauen der Reihe nach jede der 16 Zellen des Inferenznotizbuchs auf. Sie werden feststellen, dass hier viele der gleichen Hilfsmethoden wie im Handbuch Teil 1 verwendet werden.
Die erste Zelle des Inferenznotizbuchs installiert Abhängigkeiten. Legen Sie die erste Zelle fest auf:
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
Die zweite Zelle importiert erforderliche Python-Pakete. Legen Sie die zweite Zelle fest auf:
### 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
Die dritte Zelle importiert die HuggingFace WER-Auswertungsmetrik. Legen Sie die dritte Zelle fest auf:
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
In der vierten Zelle werden Konstanten festgelegt, die im gesamten Notebook verwendet werden. Legen Sie die vierte Zelle wie folgt fest:
### 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
Die fünfte Zelle definiert Hilfsmethoden zum Lesen der Indexdateien des Datensatzes sowie zum Bereinigen des Transkriptionstexts und zum Generieren eines zufälligen Satzes von Beispielen aus Testdaten. Legen Sie die fünfte Zelle wie folgt fest:
### 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
Die Methode read_index_file_data
liest eine Indexdatei des Datensatzes line_index.tsv
und erstellt eine Liste von Listen mit Audiodateinamen und Transkriptionsdaten, z. B.:
[ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]
clean_text
wird verwendet, um aus jeder Texttranskription die Zeichen zu entfernen, die durch den regulären Ausdruck angegeben wurden, der SPECIAL_CHARS
in Schritt 2.4 zugewiesen wurde. Diese Zeichen, einschließlich der Satzzeichen, können eliminiert werden, da sie beim Trainieren des Modells zum Erlernen von Zuordnungen zwischen Audiomerkmalen und Texttranskriptionen keinen semantischen Wert bieten.get_random_samples
gibt einen Satz zufälliger Teststichproben zurück, deren Menge durch die Konstante NUM_LOAD_FROM_EACH_SET
in Schritt 2.4 festgelegt wurde. Die sechste Zelle definiert Hilfsmethoden, torchaudio
verwenden, um Audiodaten zu laden und neu abzutasten. Legen Sie die sechste Zelle wie folgt fest:
### 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
lädt eine angegebene Audiodatei und gibt eine mehrdimensionale torch.Tensor
-Matrix der Audiodaten zusammen mit der Abtastrate des Audios zurück. Alle Audiodateien in den Trainingsdaten haben eine Abtastrate von 48000
Hz. Diese „ursprüngliche“ Abtastrate wird durch die Konstante ORIG_SAMPLING_RATE
in Schritt 2.4 erfasst.resample
Methode werden Audiodaten von einer Samplingrate von 48000
auf die Ziel-Samplingrate von 16000
heruntergesampelt. Die siebte Zelle liest die Testdatenindexdateien für die Aufnahmen männlicher Sprecher und die Aufnahmen weiblicher Sprecher mithilfe der in Schritt 2.5 definierten Methode read_index_file_data
. Stellen Sie die siebte Zelle auf:
### 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")
Die achte Zelle generiert Sätze zufälliger Teststichproben mithilfe der in Schritt 2.5 definierten Methode get_random_samples
. Legen Sie die achte Zelle wie folgt fest:
### 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)
Die neunte Zelle kombiniert die männlichen und weiblichen Testproben in einer einzigen Liste. Stellen Sie die neunte Zelle wie folgt ein:
### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female
Die zehnte Zelle iteriert über jede Testdatenprobe und bereinigt den zugehörigen Transkriptionstext mit der in Schritt 2.5 definierten Methode clean_text
. Stellen Sie die zehnte Zelle auf:
### 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])
Die elfte Zelle lädt jede Audiodatei, die in der Liste all_test_samples
angegeben ist. Stellen Sie die elfte Zelle auf:
### 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
zurückgegeben und in all_test_data
als Liste von Wörterbüchern gespeichert. Jedes Wörterbuch enthält die Audiodaten für eine bestimmte Probe, die Abtastrate und die Texttranskription des Audios. Die zwölfte Zelle tastet Audiodaten auf die Zielabtastrate von 16000
ab. Stellen Sie die zwölfte Zelle auf:
### 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]
Die dreizehnte Zelle initialisiert eine Instanz der pipeline
Klasse transformer
-Bibliothek HuggingFace. Setzen Sie die dreizehnte Zelle auf:
### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")
Der model
muss auf den Pfad zu Ihrem fein abgestimmten Modell eingestellt werden, das in Schritt 1.3 zum Kaggle-Notebook hinzugefügt wurde, z. B.:
transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")
Die vierzehnte Zelle ruft den im vorherigen Schritt auf den Testdaten initialisierten transcriber
auf, um Textvorhersagen zu generieren. Stellen Sie die vierzehnte Zelle auf:
### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)
Die fünfzehnte Zelle berechnet WER-Werte für jede Vorhersage sowie einen Gesamt-WER-Wert für alle Vorhersagen. Stellen Sie die fünfzehnte Zelle wie folgt ein:
### 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)
Die sechzehnte und letzte Zelle druckt einfach die WER-Berechnungen aus dem vorherigen Schritt. Stellen Sie die sechzehnte Zelle auf:
### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)
Da das Notebook Vorhersagen anhand von zufälligen Testdatenstichproben generiert, variiert die Ausgabe bei jedem Ausführen des Notebooks. Die folgende Ausgabe wurde bei einem Ausführen des Notebooks mit NUM_LOAD_FROM_EACH_SET
auf 3
für insgesamt 6 Teststichproben generiert:
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
Wie man sehen kann, hat das Modell hervorragende Arbeit geleistet! Es machte nur einen Fehler bei der sechsten Probe (Index 5
), bei der das Wort septiembre
falsch als setiembre
geschrieben wurde. Natürlich werden andere und informativere Ergebnisse erzielt, wenn man das Notebook erneut mit anderen Testproben und, was noch wichtiger ist, einer größeren Anzahl von Testproben ausführt. Trotzdem deuten diese begrenzten Daten darauf hin, dass das Modell bei verschiedenen spanischen Dialekten gute Ergebnisse erzielen kann – d. h. es wurde mit chilenischem Spanisch trainiert, scheint aber bei peruanischem Spanisch gute Ergebnisse zu erzielen.
Wenn Sie gerade erst lernen, mit wav2vec2-Modellen zu arbeiten, hoffe ich, dass die Anleitung „Arbeiten mit wav2vec2 Teil 1 – Feinabstimmung von XLS-R für automatische Spracherkennung“ und diese Anleitung für Sie hilfreich waren. Wie bereits erwähnt, ist das im Handbuch Teil 1 erstellte feinabgestimmte Modell nicht ganz auf dem neuesten Stand der Technik, sollte sich aber dennoch für viele Anwendungen als nützlich erweisen. Viel Spaß beim Bauen!