본문 바로가기
Python

[Python] 음성 데이터를 Mel 스펙트로그램과 PyTorch 텐서로 변환해보기

by teamnova 2025. 6. 25.
728x90

딥러닝 모델은 음성 데이터를 직접 이해하지 못합니다. 따라서 음성은 숫자 배열, 즉 ‘텐서(Tensor)’ 형태로 변환되어야 합니다.

이 글에서는 음성 파일을 불러와 Mel 스펙트로그램을 추출하고, 이를 PyTorch 텐서로 변환하는 전처리 과정을 실습해봅니다.

 

 

 

1. 라이브러리 설치 

pip install librosa torch matplotlib

Librosa 는 오디오 데이터를 분석하고 처리할 수 있게 해주는 라이브러리입니다. 

특히 음성이나 음악을 딥러닝에 넣기 전에 전처리하는 데에 최적화 되어 있습니다. 

 

앞서 언급했듯이 TTS 에서 "음성 파일(wav)" 을 바로 모델에 넣을 수 없기 떄문에 사람의 말소리를 "배열"로 바꾸는 전처리 단계가 필요합니다. Librosa 라이브러리에는 오디오 파일 불러오기, 멜 스펙트로그램 변환, 단시간 푸리에 변환(주파수 분석), dB 스케일 변환, 사운드 재생, 시각화 등 음성 데이터를 다루는 다양한 기능들이 포함되어 있습니다. 

 

 

 

2. 전체 코드 

import librosa
import librosa.display
import torch
import numpy as np
import matplotlib.pyplot as plt

# 1. 오디오 파일 로드
wav_path = "OSR_us_000_0010_8k.wav"  # 예: 16kHz, mono
y, sr = librosa.load(wav_path, sr=16000)

print("Waveform shape:", y.shape)  # 1D NumPy array

# 2. 멜 스펙트로그램 생성
mel_spec = librosa.feature.melspectrogram(
    y=y,
    sr=sr,
    n_fft=1024,
    hop_length=256,
    n_mels=80
)

# 3. 로그 스케일로 변환 (딥러닝에서 학습 잘 되도록)
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)

print("Mel Spectrogram shape:", mel_spec_db.shape)  # (n_mels, time)

# 4. PyTorch Tensor로 변환
mel_tensor = torch.tensor(mel_spec_db).unsqueeze(0)  # shape: [1, n_mels, time]
print("PyTorch Tensor shape:", mel_tensor.shape)

# 5. 시각화
plt.figure(figsize=(10, 4))
librosa.display.specshow(mel_spec_db, sr=sr, hop_length=256, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram (dB)')
plt.tight_layout()
plt.show()

- 음성 샘플은 LibriSpeech 샘플 (여자 목소리, 영어) 을 사용하였습니다. 

https://www.voiptroubleshooter.com/open_speech/american/OSR_us_000_0010_8k.wav 

사용법: 위 링크 클릭 -> 마우스 우클릭 -> 다른 이름으로 저장 -> wav 형식 파일 저장됩니다. 바로 예제 사용해보실 수 있습니다. 

 

 

3. 실행 

코드를 실행하면

 

위 음성 파일을 기반으로 생성된 멜스펙트로그램 이미지가 출력됩니다. 

 

이어서 멜스펙트로그램의 정보를 숫자 배열로 압축한 텐서가 출력됩니다. ([1, 80, 2102])

 

 

4. PyTorch Tensor shape: [1, 80, 2102] 

사람 목소리가 담긴 wav 파일 즉, 음성 데이터는 수십만개의 숫자로 이뤄져있습니다. 

이는 너무 복잡하고 필요 없는 정보까지 (예: 잡음 등) 전부 포함하고 있으므로 

말소리의 특징만을 뽑아서 정리한게 Mel Spectrogram 입니다. 

이 멜스펙트로그램에 나타난 소리의 크기를 데시벨 (dB) 단위로 바꾼 후, 딥러닝 모델이 받아들일 수 있도록 숫자 배열 형태(Tensor) 로 정리하면 아래와 같은 3차원 Tensor 구조가 됩니다. 

 

따라서 위 텐서 값은 아래와 같은 정보를 담고 있습니다. 

 

  • 1: 말소리 하나 → 데이터 한 개
  • 80: 각 시간(초)마다 80개의 주파수 특징을 봄
  • 2102: 총 2102개의 시간 구간으로 나눠져 있음

 

이처럼 음성 데이터를 Mel 스펙트로그램으로 변환하고, PyTorch 텐서로 정리하는 과정은 TTS 모델 개발에서 가장 중요한 첫 단계입니다. 모델이 이해할 수 있는 형태로 데이터를 가공하는 것만으로도, 전체 구조의 반은 이해한 셈입니다. 

 

다음 시간에는 FastSpeech2와 같은 실제 TTS 모델에서 이 텐서가 어떻게 사용되는지 다뤄보겠습니다!