HuBERT 소개 — 마스킹 예측 기반 자기지도 음성 학습
HuBERT 소개
음성 표현 학습을 자기지도로 하려면, 문장에 여러 소리 단위가 섞여 있고 사전학습 단계에 어휘(lexicon)가 없으며 소리 단위 길이가 제각각이라는 문제를 풀어야 해요. HuBERT는 이 세 가지 문제를 해결하기 위해 제안된 모델로, 오프라인 클러스터링 단계를 통해 정렬된 타깃 레이블을 만들고 BERT 식 예측 손실(prediction loss)을 마스킹된 영역에만 적용해요. 연속 입력 위에서 음향과 언어 모델을 함께 배우게 되는 구조예요.
출처: https://huggingface.co/docs/transformers/model_doc/hubert
Transformers에서 사용하기
파이프라인으로 바로 음성 인식(자동 전사)을 쓸 수 있어요.
from transformers import pipeline
pipeline = pipeline(
task="automatic-speech-recognition",
model="facebook/hubert-large-ls960-ft",
device=0
)
pipeline("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac")
원본 HuBERT 체크포인트는 HuBERT 컬렉션에서 볼 수 있어요. 이 모델은 2021-06-16에 Transformers에 기여됐어요.
양자화(Quantization)로 메모리 줄이기
큰 모델은 가중치를 낮은 정밀도로 표현해 메모리를 아낄 수 있어요. 아래 예제는 bitsandbytes로 8비트 양자화를 적용해요.
import torch
from datasets import load_dataset
from transformers import AutoModelForCTC, AutoProcessor, BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_8bit=True,
llm_int8_threshold=6.0
)
dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation").sort("id")
sampling_rate = dataset.features["audio"].sampling_rate
processor = AutoProcessor.from_pretrained("facebook/hubert-base-ls960")
model = AutoModelForCTC.from_pretrained("facebook/hubert-base-ls960", quantization_config=bnb_config, device_map="auto", attn_implementation="sdpa")
inputs = processor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt").to(model.device)
with torch.no_grad():
logits = model(**inputs).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = processor.batch_decode(predicted_ids)
print(transcription[0])
유의할 점
HuBERT 모델은 16kHz로 샘플링된 1D float 배열 형태의 원본 오디오를 입력으로 기대해요. 입력 샘플레이트를 16kHz에 맞추지 않으면 성능이 떨어질 수 있어요.