지난 포스트에서는 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_listwhisper모델에서는 음성 데이터의 샘플링 주기를 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)))이제 준비 된 데이터 셋을 훈련세트, 테스트세트, 검증 세트로 나눕니다.