이것은 wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정 ("1부 가이드")에 대한 동반 가이드입니다. 저는 칠레 스페인어로 Meta AI의 wav2vec2 XLS-R("XLS-R") 모델을 미세 조정하는 방법에 대한 Part 1 가이드를 작성했습니다. 귀하가 해당 가이드를 완료하고 자체적으로 미세 조정된 XLS-R 모델을 생성했다고 가정합니다. 이 가이드에서는 Kaggle Notebook을 통해 미세 조정된 XLS-R 모델에서 추론을 실행하는 단계를 설명합니다.
가이드를 완료하려면 다음이 필요합니다.
spanish-asr-inference
사용합니다.이 가이드에서는 페루 스페인어 음성 데이터 세트를 테스트 데이터의 소스로 사용합니다. 칠레 스페인어 음성 데이터 세트 와 마찬가지로 페루 사용자 데이터세트도 2개의 하위 데이터세트로 구성됩니다. 즉, 페루 남성 사용자의 녹음 2,918개와 페루 여성 사용자의 녹음 2,529개입니다.
이 데이터 세트는 2개의 개별 데이터 세트로 Kaggle에 업로드되었습니다.
입력 추가 를 클릭하여 이 두 데이터세트를 Kaggle Notebook에 추가합니다.
wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정 가이드의 4단계 에서 미세 조정된 모델을 Kaggle 모델 로 저장했어야 합니다.
입력 추가 를 클릭하여 미세 조정된 모델을 Kaggle Notebook에 추가하세요.
다음 16개 하위 단계는 추론 노트북의 16개 셀을 각각 순서대로 구축합니다. 여기에서는 파트 1 가이드의 동일한 유틸리티 방법이 많이 사용된다는 점을 알 수 있습니다.
추론 노트북의 첫 번째 셀은 종속성을 설치합니다. 첫 번째 셀을 다음으로 설정합니다.
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
두 번째 셀은 필수 Python 패키지를 가져옵니다. 두 번째 셀을 다음과 같이 설정합니다.
### 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
세 번째 셀은 HuggingFace WER 평가 지표를 가져옵니다. 세 번째 셀을 다음과 같이 설정합니다.
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
네 번째 셀은 노트북 전체에서 사용될 상수를 설정합니다. 네 번째 셀을 다음과 같이 설정합니다.
### 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
다섯 번째 셀은 데이터 세트 인덱스 파일을 읽고, 전사 텍스트를 정리하고, 테스트 데이터에서 무작위 샘플 세트를 생성하기 위한 유틸리티 방법을 정의합니다. 다섯 번째 셀을 다음과 같이 설정합니다.
### 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
에 의해 설정된 수량으로 무작위 테스트 샘플 세트를 반환합니다. 여섯 번째 셀은 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]
read_audio_data
메소드는 지정된 오디오 파일을 로드하고 오디오 샘플링 속도와 함께 오디오 데이터의 torch.Tensor
다차원 매트릭스를 반환합니다. 훈련 데이터의 모든 오디오 파일의 샘플링 속도는 48000
입니다. 이 "원래" 샘플링 속도는 2.4단계 의 상수 ORIG_SAMPLING_RATE
에 의해 캡처됩니다.resample
방법은 오디오 데이터를 샘플링 레이트 48000
에서 목표 샘플링 레이트 16000
으로 다운샘플링하는 데 사용됩니다. 일곱 번째 셀은 Step 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.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)
9번째 셀은 남성 테스트 샘플과 여성 테스트 샘플을 단일 목록으로 결합합니다. 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)
노트북은 테스트 데이터의 무작위 샘플에 대한 예측을 생성하므로 노트북이 실행될 때마다 출력이 달라집니다. 총 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
보시다시피 모델은 훌륭한 작업을 수행했습니다! 여섯 번째 샘플(인덱스 5
)에서는 septiembre
라는 단어를 setiembre
로 잘못 표기하는 오류가 한 번 있었습니다. 물론, 다양한 테스트 샘플, 더 중요한 것은 더 많은 수의 테스트 샘플을 사용하여 노트북을 다시 실행하면 더 다양하고 유익한 결과가 생성됩니다. 그럼에도 불구하고, 이 제한된 데이터는 모델이 다양한 스페인어 방언에서 잘 수행될 수 있음을 시사합니다. 즉, 칠레 스페인어로 훈련되었지만 페루 스페인어에서는 잘 수행되는 것으로 보입니다.
wav2vec2 모델 작업 방법을 배우는 중이라면 wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정 가이드와 이 가이드가 도움이 되었기를 바랍니다. 언급한 바와 같이, 1부 가이드에서 생성된 미세 조정 모델은 최신 기술은 아니지만 여전히 많은 응용 프로그램에 유용할 것으로 입증되었습니다. 행복한 건물!