Einführung
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 .
Voraussetzungen und bevor Sie beginnen
Zum Ausfüllen des Handbuchs benötigen Sie:
- Ein fein abgestimmtes XLS-R-Modell für die spanische Sprache.
- Ein bestehendes Kaggle-Konto .
- Mittlere Kenntnisse in Python.
- Mittlere Kenntnisse in der Arbeit mit Kaggle Notebooks.
- Mittlere Kenntnisse von ML-Konzepten.
- Grundkenntnisse der ASR-Konzepte.
Erstellen des Inferenz-Notizbuchs
Schritt 1 – Einrichten Ihrer Kaggle-Umgebung
Schritt 1.1 – Erstellen eines neuen Kaggle-Notebooks
- Melden Sie sich bei Kaggle an.
- Erstellen Sie ein neues Kaggle-Notebook.
- Der Name des Notebooks kann beliebig geändert werden. In dieser Anleitung wird der Notebookname
spanish-asr-inference
verwendet.
Schritt 1.2 - Hinzufügen der Testdatensätze
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.
Schritt 1.3 - Hinzufügen des fein abgestimmten Modells
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.
Schritt 2 - Erstellen des Inferenz-Notizbuchs
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.
Schritt 2.1 – ZELLE 1: Pakete installieren
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
Schritt 2.2 – ZELLE 2: Python-Pakete importieren
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
Schritt 2.3 – ZELLE 3: WER-Metrik laden
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")
- WER wird verwendet, um die Leistung des fein abgestimmten Modells anhand von Testdaten zu messen.
Schritt 2.4 - ZELLE 4: Konstanten festlegen
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
Schritt 2.5 - ZELLE 5: Hilfsmethoden zum Lesen von Indexdateien, Bereinigen von Text und Erstellen von Vokabular
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 Datensatzesline_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"] ... ]
- Die Methode
clean_text
wird verwendet, um aus jeder Texttranskription die Zeichen zu entfernen, die durch den regulären Ausdruck angegeben wurden, derSPECIAL_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. - Die Methode
get_random_samples
gibt einen Satz zufälliger Teststichproben zurück, deren Menge durch die KonstanteNUM_LOAD_FROM_EACH_SET
in Schritt 2.4 festgelegt wurde.
Schritt 2.6 - ZELLE 6: Hilfsmethoden zum Laden und erneuten Abtasten von Audiodaten
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]
- Die Methode
read_audio_data
lädt eine angegebene Audiodatei und gibt eine mehrdimensionaletorch.Tensor
-Matrix der Audiodaten zusammen mit der Abtastrate des Audios zurück. Alle Audiodateien in den Trainingsdaten haben eine Abtastrate von48000
Hz. Diese „ursprüngliche“ Abtastrate wird durch die KonstanteORIG_SAMPLING_RATE
in Schritt 2.4 erfasst. - Mit der
resample
Methode werden Audiodaten von einer Samplingrate von48000
auf die Ziel-Samplingrate von16000
heruntergesampelt.
Schritt 2.7 – ZELLE 7: Testdaten lesen
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")
Schritt 2.8 - ZELLE 8: Erstellen von Listen mit zufälligen Teststichproben
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)
Schritt 2.9 – ZELLE 9: Testdaten kombinieren
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
Schritt 2.10 – ZELLE 10: Transkriptionstest bereinigen
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])
Schritt 2.11 - ZELLE 11: Audiodaten laden
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] })
- Audiodaten werden als
torch.Tensor
zurückgegeben und inall_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.
Schritt 2.12 - ZELLE 12: Audiodaten neu abtasten
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]
Schritt 2.13 – ZELLE 13: Initialisieren der Instanz der automatischen Spracherkennungspipeline
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")
Schritt 2.14 - ZELLE 14: Vorhersagen generieren
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)
Schritt 2.15 – ZELLE 15: Berechnen der WER-Metriken
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)
Schritt 2.16 - ZELLE 16: Drucken von WER-Metriken
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)
WER-Analyse
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.
Abschluss
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!