paint-brush
wav2vec2 작업 2부 - 미세 조정된 ASR 모델에서 추론 실행~에 의해@pictureinthenoise
195 판독값

wav2vec2 작업 2부 - 미세 조정된 ASR 모델에서 추론 실행

~에 의해 Picture in the Noise11m2024/05/07
Read on Terminal Reader

너무 오래; 읽다

이 동반 가이드에서는 미세 조정된 wav2vec2 XLS-R 모델에서 추론을 실행하는 단계를 설명합니다. 이는 "wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정" 가이드를 보완합니다. 이 가이드에서는 추론을 실행하는 데 사용할 수 있는 Kaggle Notebook을 만드는 방법에 대한 단계별 지침을 제공합니다.
featured image - wav2vec2 작업 2부 - 미세 조정된 ASR 모델에서 추론 실행
Picture in the Noise HackerNoon profile picture
0-item
1-item

소개

이것은 wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정 ("1부 가이드")에 대한 동반 가이드입니다. 저는 칠레 스페인어로 Meta AI의 wav2vec2 XLS-R("XLS-R") 모델을 미세 조정하는 방법에 대한 Part 1 가이드를 작성했습니다. 귀하가 해당 가이드를 완료하고 자체적으로 미세 조정된 XLS-R 모델을 생성했다고 가정합니다. 이 가이드에서는 Kaggle Notebook을 통해 미세 조정된 XLS-R 모델에서 추론을 실행하는 단계를 설명합니다.

전제 조건 및 시작하기 전

가이드를 완료하려면 다음이 필요합니다.


  • 스페인어용으로 미세 조정된 XLS-R 모델입니다.
  • 기존 Kaggle 계정 .
  • Python에 대한 중급 지식.
  • Kaggle Notebook 작업에 대한 중급 지식.
  • ML 개념에 대한 중급 지식.
  • ASR 개념에 대한 기본 지식.

추론 노트북 구축

1단계 - Kaggle 환경 설정

1.1단계 - 새로운 Kaggle 노트북 만들기

  1. 캐글에 로그인하세요.
  2. 새로운 캐글 노트북을 만듭니다.
  3. 노트북 이름은 원하는 대로 변경할 수 있습니다. 이 가이드에서는 노트북 이름 spanish-asr-inference 사용합니다.

1.2단계 - 테스트 데이터 세트 추가

이 가이드에서는 페루 스페인어 음성 데이터 세트를 테스트 데이터의 소스로 사용합니다. 칠레 스페인어 음성 데이터 세트 와 마찬가지로 페루 사용자 데이터세트도 2개의 하위 데이터세트로 구성됩니다. 즉, 페루 남성 사용자의 녹음 2,918개와 페루 여성 사용자의 녹음 2,529개입니다.


이 데이터 세트는 2개의 개별 데이터 세트로 Kaggle에 업로드되었습니다.


입력 추가 를 클릭하여 이 두 데이터세트를 Kaggle Notebook에 추가합니다.

1.3단계 - 미세 조정된 모델 추가

wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정 가이드의 4단계 에서 미세 조정된 모델을 Kaggle 모델 로 저장했어야 합니다.


입력 추가 를 클릭하여 미세 조정된 모델을 Kaggle Notebook에 추가하세요.

2단계 - 추론 노트북 구축

다음 16개 하위 단계는 추론 노트북의 16개 셀을 각각 순서대로 구축합니다. 여기에서는 파트 1 가이드의 동일한 유틸리티 방법이 많이 사용된다는 점을 알 수 있습니다.

2.1단계 - CELL 1: 패키지 설치

추론 노트북의 첫 번째 셀은 종속성을 설치합니다. 첫 번째 셀을 다음으로 설정합니다.


 ### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer

2.2단계 - CELL 2: Python 패키지 가져오기

두 번째 셀은 필수 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

2.3단계 - CELL 3: WER 측정항목 로드

세 번째 셀은 HuggingFace WER 평가 지표를 가져옵니다. 세 번째 셀을 다음과 같이 설정합니다.


 ### CELL 3: Load WER metric ### wer_metric = load_metric("wer")


  • WER은 테스트 데이터에 대한 미세 조정 모델의 성능을 측정하는 데 사용됩니다.

2.4단계 - CELL 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단계 - CELL 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단계 - CELL 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]


  • read_audio_data 메소드는 지정된 오디오 파일을 로드하고 오디오 샘플링 속도와 함께 오디오 데이터의 torch.Tensor 다차원 매트릭스를 반환합니다. 훈련 데이터의 모든 오디오 파일의 샘플링 속도는 48000 입니다. 이 "원래" 샘플링 속도는 2.4단계 의 상수 ORIG_SAMPLING_RATE 에 의해 캡처됩니다.
  • resample 방법은 오디오 데이터를 샘플링 레이트 48000 에서 목표 샘플링 레이트 16000 으로 다운샘플링하는 데 사용됩니다.

2.7단계 - CELL 7: 테스트 데이터 읽기

일곱 번째 셀은 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.8단계 - CELL 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단계 - CELL 9: 테스트 데이터 결합

9번째 셀은 남성 테스트 샘플과 여성 테스트 샘플을 단일 목록으로 결합합니다. 9번째 셀을 다음과 같이 설정합니다.


 ### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female

2.10단계 - CELL 10: 전사 테스트 청소

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])

2.11단계 - CELL 11: 오디오 데이터 로드

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 에 사전 목록으로 저장됩니다. 각 사전에는 특정 샘플에 대한 오디오 데이터, 샘플링 속도 및 오디오의 텍스트 전사가 포함되어 있습니다.

2.12단계 - CELL 12: 오디오 데이터 리샘플링

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]

2.13단계 - CELL 13: 자동 음성 인식 파이프라인 인스턴스 초기화

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")

2.14단계 - CELL 14: 예측 생성

14번째 셀은 테스트 데이터에 대해 이전 단계에서 초기화된 transcriber 호출하여 텍스트 예측을 생성합니다. 14번째 셀을 다음과 같이 설정합니다.


 ### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)

2.15단계 - CELL 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단계 - CELL 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


보시다시피 모델은 훌륭한 작업을 수행했습니다! 여섯 번째 샘플(인덱스 5 )에서는 septiembre 라는 단어를 setiembre 로 잘못 표기하는 오류가 한 번 있었습니다. 물론, 다양한 테스트 샘플, 더 중요한 것은 더 많은 수의 테스트 샘플을 사용하여 노트북을 다시 실행하면 더 다양하고 유익한 결과가 생성됩니다. 그럼에도 불구하고, 이 제한된 데이터는 모델이 다양한 스페인어 방언에서 잘 수행될 수 있음을 시사합니다. 즉, 칠레 스페인어로 훈련되었지만 페루 스페인어에서는 잘 수행되는 것으로 보입니다.

결론

wav2vec2 모델 작업 방법을 배우는 중이라면 wav2vec2 작업 1부 - 자동 음성 인식을 위한 XLS-R 미세 조정 가이드와 이 가이드가 도움이 되었기를 바랍니다. 언급한 바와 같이, 1부 가이드에서 생성된 미세 조정 모델은 최신 기술은 아니지만 여전히 많은 응용 프로그램에 유용할 것으로 입증되었습니다. 행복한 건물!