paint-brush
Arbeiten mit wav2vec2 Teil 2 - Ausführen von Inferenzen auf fein abgestimmten ASR-Modellenvon@pictureinthenoise
279 Lesungen

Arbeiten mit wav2vec2 Teil 2 - Ausführen von Inferenzen auf fein abgestimmten ASR-Modellen

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

Zu lang; Lesen

In diesem Begleithandbuch werden die Schritte zum Ausführen von Inferenzen auf einem fein abgestimmten wav2vec2 XLS-R-Modell erläutert. Es ergänzt das Handbuch „Arbeiten mit wav2vec2, Teil 1 – Feinabstimmung von XLS-R für automatische Spracherkennung“. Das Handbuch enthält schrittweise Anweisungen zum Erstellen eines Kaggle-Notebooks, das zum Ausführen von Inferenzen verwendet werden kann.
featured image - Arbeiten mit wav2vec2 Teil 2 - Ausführen von Inferenzen auf fein abgestimmten ASR-Modellen
Picture in the Noise HackerNoon profile picture
0-item
1-item

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

  1. Melden Sie sich bei Kaggle an.
  2. Erstellen Sie ein neues Kaggle-Notebook.
  3. 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 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"] ... ]


  • Die Methode 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.
  • Die Methode 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.

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 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.
  • Mit der resample Methode werden Audiodaten von einer Samplingrate von 48000 auf die Ziel-Samplingrate von 16000 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 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.

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!