Whisper모델을 파인튜닝하여 커스텀 ASR만들기(스텝-원)

지난 포스트에서는 whisper모델을 활용하여 간단한 한국어 STT기능을 구현했었습니다.

이번 포스트 부터는 whisper모델을 파인튜닝하여 사투리 또는 음성품질이 떨어지는 사운드 데이터에서도 정확한 텍스트 추출이 가능한 모델로 커스터마이징을 해 보려고 합니다.

이 작업은 크게 3단계로 진행 되게 됩니다.

  • 스텝-원 : 트레인용 데이터 준비

  • 스텝-투 : 데이터 전처리 및 트레이너 세팅

  • 스텝-스리 : 트레이너에 의한 파인튜닝 진행 및 결과 평가

오늘 첫번째 포스트에서는 파인튜닝에 사용할 데이터의 준비과정을 먼저 보기로 하겠습니다.

데이터로서는 AI-Hub에서 제공해 주는 “저음질 전화음성 데이터“를 이용하도록 하겠습니다.

해당 데이터는 음성파일과 라벨링 된 텍스트파일, 그리고 추가정보의 json파일들로 구성 되어 있는데 우리의 경우는 음성 및 텍스트데이터만 필요 하므로 json은 무시하도록 하겠습니다.

다음은 오디오 및 텍스트 파일을 로딩하여 파일명 순으로 정돈하는 코드입니다.

import glob

raw_data_list = glob.glob(root_path)
raw_data_list = sorted(raw_data_list)

labeled_data_list = glob.glob(root_path)
# 레이블 데이터에는 json 데이터가 폴더별로 하나씩 있으므로 txt 파일만을 골라낸다.
labeled_data_list = sorted([file for file in labeled_data_list if file.endswith(".txt")])

텍스트 파일을 읽어서 첫 행에 있는 라벨링 된 텍스트와 음성 데이터를 페어링 해서 데이터프레임으로 정돈합니다.

transcript_list = []
for labeled_data in tqdm(labeled_data_list):
    with open(labeled_data, 'r', encoding='UTF8') as f:
        line = f.readline()
        transcript_list.append(line)

df = pd.DataFrame(data=transcript_list, columns=["transcript"])

# 텍스트 데이터로 만든 데이터프레임에 음성 파일 경로 컬럼을 추가
df["raw_data"] = raw_data_list

whisper모델에서는 음성 데이터의 샘플링 주기를 16khz로 제한 하므로 데이터 변환 처리를 합니다.

변환 된 데이터는 허깅페이스의 트레이너에서 사용할 수 있도록 Dataset형식으로 변환합니다.


# 오디오 파일 경로를 dict의 "audio" 키의 value로 넣고 이를 데이터셋으로 변환
# 이때, Whisper가 요구하는 사양대로 Sampling rate는 16,000으로 설정한다.
ds = (Dataset.from_dict({"audio": [path for path in df["raw_data"]],
                         "transcripts": [transcript for transcript in df["transcript"]]}).cast_column("audio", Audio(sampling_rate=16000)))

이제 준비 된 데이터 셋을 훈련세트, 테스트세트, 검증 세트로 나눕니다.

# 데이터셋을 훈련 데이터와 테스트 데이터, 밸리데이션 데이터로 분할
train_testvalid = ds.train_test_split(test_size=0.2)
test_valid = train_testvalid["test"].train_test_split(test_size=0.5)
datasets = DatasetDict({
    "train": train_testvalid["train"],
    "test": test_valid["test"],
    "valid": test_valid["train"]})

일단 지금까지의 과정에서 파인 튜닝에 사용할 데이터의 로드와 분할을 진행했습니다.


여기서 참고로 허깅페이스에서는 데이터 처리와 저장을 지원하기 위하여 전처리중의 데이터를 허깅페이스에 임시 저장햇다가 다시 불러서 사용할 수 있는 기능도 제공해 주므로 데이터 관리에 활용할 수 있습니다.

from datasets import load_dataset

# 작성한 데이터셋을 허깅페이스에 업로드
datasets.push_to_hub("업로드할 허깅페이스 주소 입력")
# 데이터셋을 업로드할 때 접근을 제한하거나 비공개로 설정한 경우 허깅페이스 로그인이 필요하다.
low_call_voices = load_dataset("다운받을 데이터셋의 주소 입력")

그럼 다음 포스트에서는 준비 된 데이터를 전처리하는 과정과 트레이닝을 위한 트레이너 세팅 과정을 보도록 하겠습니다.

이번 포스팅의 내용은 기본적으로 파이선 기본지식만으로도 확인 해 볼 수 있는 내용들이고 허깅페이스에서 지원해 주는 많은 기능들은 다음 포스팅에서부터 본격적으로 활용해 보게 됩니다.


#11기HuggingFace

3
2개의 답글

👉 이 게시글도 읽어보세요