딥러닝 모델은 음성 데이터를 직접 이해하지 못합니다. 따라서 음성은 숫자 배열, 즉 ‘텐서(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 모델에서 이 텐서가 어떻게 사용되는지 다뤄보겠습니다!
'Python' 카테고리의 다른 글
[Python] NumPy를 이용한 간단한 행렬 연산 및 TensorFlow로 선형 회귀 모델 구축 (0) | 2025.07.02 |
---|---|
[Python] tkinter으로 GUI 프로그램 만들기 : Todo 리스트 (1) | 2025.06.19 |
[Python] 파이썬으로 TTS(Text-to-Speech) 변환하기 - gTTS 활용 (0) | 2025.06.18 |
[Python] FastAPI 에서 HTTPS 설정하기 (0) | 2025.06.12 |
[Python] JSON 구조 데이터 전처리 하기 (필드 정리) (1) | 2025.06.11 |