ASR, Automatic Speech Recognition (260920)

WonTerry·2026년 9월 20일

Deep Learning

목록 보기
40/42

[Wav2Vec2 ASR 실행 코드 기능 명세서]

1. 모델 및 프로세서 구성 (Model & Processor)

  • Wav2Vec2ForCTC (Model):
    • 역할: 음성 특징을 분석하여 각 음소(Phoneme) 혹은 단어에 대한 확률값(Logits)을 계산하는 '두뇌' 역할.
    • 설정: facebook/wav2vec2-base-960h (Fine-tuned 모델 사용).
  • Wav2Vec2Processor (Processor):
    • 역할: 입력과 출력 사이의 '번역기' 역할.
    • 기능 1 (Input): 오디오 파형을 모델이 이해할 수 있는 숫자 형태(Tensor)로 변환.
    • 기능 2 (Output): 모델의 숫자 결과값을 사람이 읽을 수 있는 텍스트로 변환.

2. 오디오 전처리 (Preprocessing)

  • librosa.load(sr=16000, mono=True):
    • Resampling: Wav2Vec2 모델의 규격에 맞게 오디오를 16,000Hz로 변환.
    • Mono Conversion: 스테레오 오디오를 모델 입력에 적합한 단일 채널(Mono)로 통합.
  • inputs.input_values.to(device):
    • 전처리된 데이터를 연산 장치(Mac MPS)로 이동시켜 가속 수행.

3. 추론 단계 (Inference)

  • torch.no_grad():
    • 역할: 추론(Inference) 모드 활성화.
    • 기능: 역전파(Backpropagation)를 위한 기울기(Gradient) 계산을 비활성화하여 메모리 점유율을 낮추고 연산 속도를 최적화.
  • logits:
    • 모델의 출력값으로, 각 문자와의 매칭 확률이 담긴 행렬 데이터.

4. 후처리 단계 (Post-processing)

  • torch.argmax(logits, dim=-1):
    • 역할: 각 시점(Time step)에서 가장 확률이 높은 토큰(Token)의 인덱스를 추출.
  • processor.batch_decode():
    • 역할: 추출된 인덱스 번호들을 다시 실제 문자열(Text)로 복원.

[전체 데이터 흐름 요약]

[입력: .wav 파일] →\rightarrow [librosa: 16kHz/Mono 변환] →\rightarrow [Processor: Tensor 변환] →\rightarrow [Model: 확률값(Logits) 계산] →\rightarrow [Argmax: 최적 인덱스 추출] →\rightarrow [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)
profile
Hello, I'm Terry! 👋 Enjoy every moment of your life! 🌱 My current interests are Signal processing, Machine learning, Python, Database, LLM & RAG, MCP & ADK, Multi-Agents, Physical AI, ROS2...

0개의 댓글