허깅페이스 트렌스포머 활용강좌, Wav2Vec2 자동 음성 인식 실행

오늘은 허깅페이스(Hugging Face)에서 제공하는 트렌스포머(Transformers) 라이브러리를 활용하여 Wav2Vec2 모델을 이용한 자동 음성 인식(ASR) 기능을 구현해보겠습니다. Wav2Vec2는 음성 인식 모델로, 연속 음성 인식에서 뛰어난 성능을 보이는 최신 딥러닝 모델 중 하나입니다. 우리는 이 모델을 사용하여 음성 데이터를 텍스트로 변환하는 과정을 자세히 알아보겠습니다.

1. Wav2Vec2 모델 이해하기

Wav2Vec2는 Facebook AI에서 개발한 음성 인식 모델입니다. 이 모델은 비지도 학습을 통해 음성 데이터를 이해하고, 자기지도 학습을 통해 성능을 크게 향상시킵니다. Wav2Vec2는 음성 신호를 입력으로 받아들이고, 이를 텍스트로 변환하는 과정을 수행합니다. 특히, 전통적인 음성 인식 방법에 비해 더 적은 양의 레이블이 있는 데이터로도 학습할 수 있는 장점이 있습니다.

1.1 Wav2Vec2의 구조

Wav2Vec2 모델은 두 가지 주요 구성 요소로 나뉩니다:

  • 인코더: 입력 음성 신호를 인코딩하여 고차원 표현을 생성합니다.
  • 디코더: 인코더에서 얻은 표현을 기반으로 텍스트를 생성합니다.

이 과정에서 모델은 많은 음성 샘플과 해당 텍스트 레이블로 학습됩니다.

2. 환경 설정

Wav2Vec2를 사용하기 위해서는 먼저 필요한 라이브러리를 설치해야 합니다. 다음 코드를 사용하여 transformers, torchaudio, torch 라이브러리를 설치합니다:

!pip install transformers torchaudio torch

3. Wav2Vec2 모델 불러오기

모델이 설치되었다면, 다음으로 Wav2Vec2 모델을 불러와야 합니다. 허깅페이스의 transformers 라이브러리를 사용하면 손쉽게 사용할 수 있습니다:

from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-large-960h")
tokenizer = Wav2Vec2Tokenizer.from_pretrained("facebook/wav2vec2-large-960h")

위 코드에서 우리는 facebook/wav2vec2-large-960h라는 사전 훈련된 모델을 가져옵니다. 이 모델은 960시간의 영어 음성을 학습한 데이터로 훈련되어 있습니다.

4. 음성 파일 준비하기

Wav2Vec2 모델을 사용하기 위해서는 음성 파일이 필요합니다. 지원되는 음성 형식으로는 WAV가 있습니다. 음성 파일을 읽어오기 위해 torchaudiolibrosa 같은 라이브러리를 사용할 수 있습니다. 다음은 torchaudio를 사용하여 음성 파일을 로드하는 코드입니다:

import torchaudio

# 음성 파일 경로
audio_file = "path_to_your_audio_file.wav"
# 음성 파일 로드
waveform, sample_rate = torchaudio.load(audio_file)

5. 음성 인식 수행하기

이제 Wav2Vec2 모델을 사용하여 음성 인식을 수행할 준비가 되었습니다. 우리는 로드한 음성 파일을 모델에 전달하여 텍스트로 변환할 수 있습니다. 모델에 입력하기 전에 오디오 샘플의 샘플레이트를 맞춰주어야 합니다:

# 샘플레이트 변경
waveform = waveform.squeeze().numpy()  # (채널, 시간) -> (시간,)
inputs = tokenizer(waveform, return_tensors="pt", padding="longest")

이제 모델을 통해 인식을 수행할 수 있습니다:

with torch.no_grad():
    logits = model(inputs["input_values"]).logits
    
# 가장 높은 확률을 가진 인덱스를 찾음
predicted_ids = torch.argmax(logits, dim=-1)
# 인덱스를 텍스트로 변환
transcription = tokenizer.batch_decode(predicted_ids)[0]

여기서 transcription 변수에는 음성의 텍스트 변환 결과가 저장됩니다.

6. 전체 코드 예제

위의 모든 단계를 하나의 코드 블록으로 통합하여 전체 음성 인식 과정을 정리해보겠습니다:

import torchaudio
import torch
from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer

# 모델과 토크나이저 불러오기
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-large-960h")
tokenizer = Wav2Vec2Tokenizer.from_pretrained("facebook/wav2vec2-large-960h")

# 음성 파일 경로
audio_file = "path_to_your_audio_file.wav"
# 음성 파일 로드
waveform, sample_rate = torchaudio.load(audio_file)

# 샘플레이트 변경
waveform = waveform.squeeze().numpy()  # (채널, 시간) -> (시간,)
inputs = tokenizer(waveform, return_tensors="pt", padding="longest")

# 인식 수행
with torch.no_grad():
    logits = model(inputs["input_values"]).logits
    predicted_ids = torch.argmax(logits, dim=-1)

# 텍스트로 변환
transcription = tokenizer.batch_decode(predicted_ids)[0]
print(transcription)

7. 결과 확인하기

위 코드를 실행하면 주어진 음성 파일에 대한 텍스트 결과를 출력합니다. 이는 Wav2Vec2 모델을 활용한 간단한 자동 음성 인식 시스템의 구현입니다. 음성 파일의 음질이나 길이에 따라서 결과의 정확도가 달라질 수 있습니다.

8. 마무리

허깅페이스 트렌스포머 라이브러리를 활용하여 Wav2Vec2 모델을 이용한 자동 음성 인식 시스템을 구현해보았습니다. 이번 예제를 통해 딥러닝 모델을 활용한 음성 인식의 기본적인 과정과 Wav2Vec2의 강력한 성능을 실험해볼 수 있었습니다. 음성 인식 기술은 다양한 분야에서 활용 가능성이 높기 때문에, 이 분야에 관심이 있는 분들은 더욱 깊이 있는 학습을 통해 전문성을 키우는 것이 좋습니다.

9. 추가 자료

더 많은 정보를 원하시는 분들은 다음의 자료를 참조하시기 바랍니다: