피처 추출기

피처 추출기 (Feature extractors)

피처 추출기(feature extractor)는 오디오 데이터를 주어진 모델에 맞는 올바른 형식으로 전처리해요. 원시 오디오 신호를 받아 모델에 넣을 수 있는 텐서로 변환해요. 텐서 모양은 모델에 따라 다르지만, 사용하는 모델이 주어지면 피처 추출기가 오디오 데이터를 올바르게 전처리해 줘요. 피처 추출기는 패딩(padding), 트렁케이션(truncation), 리샘플링(resampling) 메서드도 포함해요.

from_pretrained()을 호출해서 Hugging Face Hub 또는 로컬 디렉토리에서 피처 추출기와 그 전처리기(preprocessor) 구성을 로드해요. 피처 추출기와 전처리기 구성은 preprocessor_config.json 파일에 저장돼요.

보통 array에 저장된 오디오 신호를 피처 추출기에 전달하고, sampling_rate 파라미터를 사전 학습된 오디오 모델의 샘플링 레이트로 설정해요. 오디오 데이터의 샘플링 레이트가 사전 학습된 오디오 모델이 학습된 데이터의 샘플링 레이트와 일치하는 것이 중요해요.

from transformers import AutoFeatureExtractor

feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")
dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
processed_sample = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=16000)
processed_sample
{'input_values': [array([ 9.4472744e-05,  3.0777880e-03, -2.8888427e-03, ...,
       -2.8888427e-03,  9.4472744e-05,  9.4472744e-05], dtype=float32)]}

피처 추출기는 모델이 소비할 준비가 된 입력 input_values를 반환해요.

이 가이드는 피처 추출기 클래스와 오디오 데이터를 전처리하는 방법을 안내해요.

출처: 문서

본문

피처 추출기 클래스

Transformers 피처 추출기는 FeatureExtractionMixin을 서브클래싱하는 기본 SequenceFeatureExtractor 클래스를 상속받아요.

피처 추출기를 로드하는 방법은 두 가지가 있어요: AutoFeatureExtractor와 모델별 피처 추출기 클래스.

AutoClass API는 주어진 모델에 대해 올바른 피처 추출기를 자동으로 로드해요.

from_pretrained()을 사용해서 피처 추출기를 로드해요.

from transformers import AutoFeatureExtractor

feature_extractor = AutoFeatureExtractor.from_pretrained("openai/whisper-tiny")

모든 사전 학습된 오디오 모델에는 오디오 데이터를 올바르게 처리하기 위한 특정 피처 추출기가 연관돼 있어요. 피처 추출기를 로드하면 preprocessor_config.json에서 피처 추출기의 구성(피처 크기, 청크 길이 등)을 가져와요.

피처 추출기는 모델별 클래스에서 직접 로드할 수도 있어요.

from transformers import WhisperFeatureExtractor

feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-tiny")

전처리 (Preprocess)

피처 추출기는 입력이 특정 모양의 PyTorch 텐서일 것으로 기대해요. 정확한 입력 모양은 사용하는 오디오 모델에 따라 달라질 수 있어요.

예를 들어 Whisper는 input_features가 (batch_size, feature_size, sequence_length) 모양의 텐서일 것을 기대하지만, Wav2Vec2는 input_values가 (batch_size, sequence_length) 모양의 텐서일 것을 기대해요.

피처 추출기는 사용하는 오디오 모델에 맞는 올바른 입력 모양을 생성해요.

피처 추출기는 오디오 파일의 샘플링 레이트(초당 취하는 오디오 신호 값의 수)도 설정해요. 오디오 데이터의 샘플링 레이트는 사전 학습된 모델이 학습된 데이터셋의 샘플링 레이트와 일치해야 해요. 이 값은 보통 모델 카드에 나와 있어요.

from_pretrained()으로 데이터셋과 피처 추출기를 로드해요.

from datasets import load_dataset, Audio
from transformers import AutoFeatureExtractor

dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")

데이터셋의 첫 번째 예시를 살펴보고, 원시 오디오 신호인 array를 담고 있는 audio 컬럼에 접근해요.

dataset[0]["audio"]["array"]
array([ 0.        ,  0.00024414, -0.00024414, ..., -0.00024414,
        0.        ,  0.        ])

피처 추출기는 array를 주어진 오디오 모델에 대한 기대 입력 형식으로 전처리해요. sampling_rate 파라미터를 사용해서 적절한 샘플링 레이트를 설정해요.

processed_dataset = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=16000)
processed_dataset
{'input_values': [array([ 9.4472744e-05,  3.0777880e-03, -2.8888427e-03, ...,
       -2.8888427e-03,  9.4472744e-05,  9.4472744e-05], dtype=float32)]}

패딩 (Padding)

Transformers는 모든 시퀀스가 동일한 길이여야 배칭(batching)할 수 있기 때문에, 서로 다른 오디오 시퀀스 길이는 문제가 돼요. 불균일한 시퀀스 길이는 배칭할 수 없어요.

dataset[0]["audio"]["array"].shape
(86699,)

dataset[1]["audio"]["array"].shape
(53248,)

패딩은 모든 시퀀스가 동일한 길이를 갖도록 특별한 padding token을 추가해요. 피처 추출기는 array에 0(침묵으로 해석)을 추가해서 패딩해요. padding=True로 설정하면 시퀀스를 배치에서 가장 긴 시퀀스 길이로 패딩해요.

def preprocess_function(examples):
    audio_arrays = [x["array"] for x in examples["audio"]]
    inputs = feature_extractor(
        audio_arrays,
        sampling_rate=16000,
        padding=True,
    )
    return inputs

processed_dataset = preprocess_function(dataset[:5])
processed_dataset["input_values"][0].shape
(86699,)

processed_dataset["input_values"][1].shape
(86699,)

트렁케이션 (Truncation)

모델은 크래시하기 전까지 특정 길이까지만 시퀀스를 처리할 수 있어요.

트렁케이션은 시퀀스가 최대 길이를 초과하지 않도록 시퀀스에서 초과 토큰을 제거하는 전략이에요. truncation=True로 설정하면 시퀀스를 max_length 파라미터의 길이로 트렁케이션해요.

def preprocess_function(examples):
    audio_arrays = [x["array"] for x in examples["audio"]]
    inputs = feature_extractor(
        audio_arrays,
        sampling_rate=16000,
        max_length=50000,
        truncation=True,
    )
    return inputs

processed_dataset = preprocess_function(dataset[:5])
processed_dataset["input_values"][0].shape
(50000,)

processed_dataset["input_values"][1].shape
(50000,)

리샘플링 (Resampling)

Datasets 라이브러리도 오디오 데이터를 오디오 모델의 기대 샘플링 레이트에 맞게 리샘플링할 수 있어요. 이 메서드는 데이터가 로드될 때 그때그때(on the fly) 오디오 데이터를 리샘플링하는데, 전체 데이터셋을 제자리에서 리샘플링하는 것보다 더 빠를 수 있어요.

지금까지 작업한 오디오 데이터셋의 샘플링 레이트는 8kHz이고, 사전 학습된 모델은 16kHz를 기대해요.

dataset[0]["audio"]
{'path': '/root/.cache/huggingface/datasets/downloads/extracted/f507fdca7f475d961f5bb7093bcc9d544f16f8cab8608e772a2ed4fbeb4d6f50/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
 'array': array([ 0.        ,  0.00024414, -0.00024414, ..., -0.00024414,
         0.        ,  0.        ]),
 'sampling_rate': 8000}

audio 컬럼에 cast_column을 호출해서 샘플링 레이트를 16kHz로 업샘플링해요.

dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))

데이터셋 샘플을 로드하면 이제 16kHz로 리샘플링돼 있어요.

dataset[0]["audio"]
{'path': '/root/.cache/huggingface/datasets/downloads/extracted/f507fdca7f475d961f5bb7093bcc9d544f16f8cab8608e772a2ed4fbeb4d6f50/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav',
 'array': array([ 1.70562416e-05,  2.18727451e-04,  2.28099874e-04, ...,
         3.43842403e-05, -5.96364771e-06, -1.76846661e-05]),
 'sampling_rate': 16000}

더 알아보기 (Learn more)

  • 다양한 자동 클래스와 사용법은 AutoClass 문서를 확인해 보세요.
  • 오디오 모델별 피처 추출기 사용법은 각 모델 문서를 참고해 주세요.