Wav2Vec2ForCTC (Model): facebook/wav2vec2-base-960h (Fine-tuned 모델 사용).Wav2Vec2Processor (Processor): librosa.load(sr=16000, mono=True):inputs.input_values.to(device):torch.no_grad():logits:torch.argmax(logits, dim=-1):processor.batch_decode():[입력: .wav 파일] [librosa: 16kHz/Mono 변환] [Processor: Tensor 변환] [Model: 확률값(Logits) 계산] [Argmax: 최적 인덱스 추출] [Processor: 최종 텍스트 출력]
import torch
import librosa
import numpy as np
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC
def run_xlsr_manual_control(audio_file_path):
# 1. 장치 설정 (Mac MPS)
if torch.backends.mps.is_available():
device = torch.device("mps")
print("Using MPS (Metal Performance Shaders) for acceleration")
else:
device = torch.device("cpu")
print("Using CPU")
# 2. 모델 및 프로세서 로드
# 프로세서는 오디오를 숫자(Tensor)로 변환하고, 모델의 결과를 글자로 바꾸는 역할을 합니다.
model_id = "facebook/wav2vec2-base-960h"
print(f"Loading model: {model_id}...")
try:
processor = Wav2Vec2Processor.from_pretrained(model_id)
model = Wav2Vec2ForCTC.from_pretrained(model_id).to(device)
# 3. 오디오 로드 (librosa 사용)
print(f"Loading audio: {audio_file_path}")
audio_array, _ = librosa.load(audio_file_path, sr=16000, mono=True)
# 4. [핵심] 수동 전처리 및 추론
print("Processing...")
# 오디오 데이터를 모델이 먹을 수 있는 텐서(Tensor)로 변환
inputs = processor(audio_array, sampling_rate=16000, return_tensors="pt", padding=True)
# 데이터를 모델이 있는 장치(MPS)로 이동
input_values = inputs.input_values.to(device)
# 모델 추론 (Forward Pass)
with torch.no_grad():
logits = model(input_values).logits
# 5. 결과 후처리 (Logits -> Text)
# 가장 확률이 높은 단어(Token)의 인덱스를 뽑아냄
predicted_ids = torch.argmax(logits, dim=-1)
# 인덱스를 실제 글자로 변환
transcription = processor.batch_decode(predicted_ids)[0]
print("\n--- Result ---")
print(f"Transcribed Text: {transcription.upper()}") # 문장 내용이 대문자로 출력
print("--------------")
except Exception as e:
print(f"Error during processing: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
PATH_TO_AUDIO = "sample_english.wav" # 본인의 파일명으로 변경
run_xlsr_manual_control(PATH_TO_AUDIO)