Hugging Face Audio Course: Pipeline으로 Audio Application 쉽게 만들기

반응형

 


 

 

이전 Hugging Face Audio Course의 첫 번째 파트에서, 우리는 HuggingFace의 DatasetsTransformers 라이브러리를 활용하여 오디오 데이터셋을 어떻게 다루는지 배웠습니다. 이제 오디오 데이터셋을 활용한 다양한 오디오 태스크에 대해 알아보겠습니다. 오디오 데이터를 활용할 수 있는 방법은 무척 다양한데요, 그 중 몇 가지를 소개하겠습니다.

 

Audio Classification

이 태스크는 다양한 오디오 클립들을 서로 다른 카테고리로 분류하는 과정입니다. 예를 들어, 클립이 고양이의 소리인지, 강아지의 소리인지, 혹은 어떤 장르의 음악인지 구분하는 것이 이 태스크의 목표입니다.

Automatic Speech Recognition(ASR)

이 태스크는 오디오 클립을 전사하여 텍스트로 변환하는 과정입니다. 보통 음성을 텍스트로(Speech-to-Text, STT) 변환한다고 말합니다.

Speaker Diarization

이 태스크는 오디오 클립에서 어떤 시점에 누가 말하는지를 구분하는 과정입니다. 예를 들면, 대화하는 두 사람의 오디오 클립에서 각자의 발화 내용을 분리하게 됩니다.

Text-to-Speech(TTS)

이 태스크는 텍스트를 오디오 버전으로 만드는 과정으로, 오디오북 제작이나 NPC에 음성을 제공하는 데 사용됩니다.

 

 

이러한 과제들을 위해 사전 학습된(pre-trained) 모델들은 Transformers의 pipeline() 기능을 통해 쉽게 활용할 수 있습니다. 이번 포스트에서는 오디오 분류(Audio classification)자동 음성 인식 모델(Automatic Speech Recognition)에 대해 더 자세히 알아보도록 하겠습니다. 이 두 태스크를 통해 어떻게 오디오 데이터를 활용할 수 있는지 실제로 살펴보게 될 것입니다.

 

 


 

1. Audio Classification

오디오 분류(Audio Classification)는 특정 오디오 녹음에 하나 이상의 레이블을 부여하는 프로세스를 말합니다. 이 레이블은 대분류인 음악, 음성 뿐만 아니라, 더 특정한 범주로서 새의 노래나 자동차 엔진 소리와 같은 것들을 포함할 수 있습니다.

Transformer는 오디오 분류 작업에 사용할 수 있는 사전 학습된 모델(Pretrained Model)을 제공합니다. 먼저, 이전에 사용했던 MINDS-14 데이터셋 을 불러옵니다. MINDS-14 데이터셋은 각 녹음에 대한 통화 의도를 나타내는 'intent_class'라는 레이블을 보유하고 있습니다. 'en-AU' 부분만을 로드 후, 오디오 데이터를 16kHz 샘플링 비율로 업샘플링하게 되는데, 이 샘플링 비율은 음성 모델에서 요구하는 표준입니다.

from datasets import load_dataset
from datasets import Audio

minds = load_dataset("PolyAI/minds14", name="en-AU", split="train")
minds = minds.cast_column("audio", Audio(sampling_rate=16_000))

 

Transformers의 파이프라인(pipeline) 기능을 사용하여 오디오 분류를 위한 파인튜닝 모델을 불러옵니다.

from transformers import pipeline

classifier = pipeline(
    "audio-classification",
    model="anton-l/xtreme_s_xlsr_300m_minds14",
)

 

파이프라인은 오디오 데이터가 NumPy 배열(array)이길 원합니다. Raw Audio Data에 대한 전처리는 파이프라인 안에서 처리될 수 있습니다. Raw Audio Data는 [”audio”][”array”]안에 Numpy 배열로 저장되어 있습니다. 해당 데이터를 classifier에 전달합니다.

 

파이프라인은 오디오 데이터를 NumPy 배열 형태로 처리합니다. Raw audio data는 ['audio']['array'] 안에 NumPy 배열로 저장되어 있습니다. 이러한 형태로 저장된 데이터는 그대로 classifier에 전달될 수 있습니다.

example = minds[0]
classifier(example["audio"]["array"])

 

Output:

[
    {"score": 0.9631525278091431, "label": "pay_bill"},
    {"score": 0.02819698303937912, "label": "freeze"},
    {"score": 0.0032787492964416742, "label": "card_issues"},
    {"score": 0.0019414445850998163, "label": "abroad"},
    {"score": 0.0008378693601116538, "label": "high_value_payment"},
]

 

첫번째 줄의 score이 0.96 정도로 가장 높습니다. 모델은 해당 오디오 데이터가 “pay_bill”이라고 확신하고 있습니다. 그럼 이제 정답 라벨을 확인해봅니다.

id2label = minds.features["intent_class"].int2str
id2label(example["intent_class"])

# Output
"pay_bill"

 

데이터셋에 저장된 해당 오디오 데이터의 라벨 역시 “pay_bill”로 모델의 예측이 맞았다는 것을 확인할 수 있습니다. 분류 작업을 할 때, 많은 경우 사전 훈련된 모델의 클래스 집합이 모델이 구별해야 할 클래스와 정확히 일치하지 않습니다. 이런 경우 사전 훈련된 모델을 파인튜닝하여 정확한 클래스 레이블 집합에 맞게 "calibrate(보정)"할 수 있습니다.

 

 


 

2. Automatic Speech Recognition

Automatic Speech Recognition은 음성 녹음을 텍스트로 전사하는 작업입니다. 유튜브의 하단에 있는 자동 자막 생성부터 시리 혹은 알렉사에게 목소리로 음성 명령을 활성화하는 것과 같이 다양한 응용분야가 존재합니다.

 

Transformers에서는 automatic-speech-recognition pipeline을 통해 MIND-14 dataset의 오디오 데이터를 transcribe 할 수 있습니다.

from transformers import pipeline

asr = pipeline("automatic-speech-recognition")

 

dataset에서 데이터 하나를 뽑아 asr 파이프라인에 넣겠습니다.

example = minds[0]
asr(example["audio"]["array"])

 

Output:

{"text": "I WOULD LIKE TO PAY MY ELECTRICITY BILL USING MY COD CAN YOU PLEASE ASSIST"}

 

데이터셋의 원본 transcription과 결과물을 비교해보겠습니다.

example["english_transcription"]

# Output:
"I would like to pay my electricity bill using my card can you please assist"

 

원본 text와 비교했을 때 “card”라는 단어만 틀렸는데, “r” 발음을 거의 하지 않는 호주 화자라는 것을 감안했을 때 결과물이 충분히 납득할 만합니다. HuggingFace에서는 다양한 언어로 훈련된 ASR model이 존재하기 때문에 asr pipeline에 해당 언어로 훈련된 음향 모델을 넣어 사용할 수 있습니다.

 

 

 


 

 

참고:

https://huggingface.co/learn/audio-course/chapter2/introduction

반응형