[파이썬] 음성 데이터의 시간-주파수 변환 (STFT)

음성 데이터는 시간 도메인에서 샘플링된 신호로 표현됩니다. 하지만 음성 데이터를 분석하거나 처리하기 위해서는 주파수 도메인에서의 특성을 확인할 필요가 있습니다. 이를 위해 주파수 도메인으로 음성 데이터를 변환하는 기법 중 하나가 시간-주파수 변환(STFT, Short-Time Fourier Transform)입니다.

STFT는 음성 데이터를 작은 시간 윈도우로 분할한 뒤 각 윈도우에 대해 Fourier Transform을 수행하는 과정입니다. 이렇게 분석된 주파수 정보는 음성의 주파수 특성을 확인하거나, 특정 주파수 영역의 성분을 추출하는 데 유용합니다.

STFT의 원리

STFT는 일련의 시간 윈도우를 사용하여 음성 데이터를 분석하는 방식입니다. 먼저 입력 데이터를 작은 시간 구간으로 나누어 줍니다. 이후 각 시간 구간에 대해 Fourier Transform을 수행합니다.

STFT는 주파수-시간 변환을 수행하기 때문에 신호의 시간 및 주파수 특성을 동시에 분석할 수 있습니다. 이를 통해 시간에 따른 주파수의 변화를 추적하거나, 특정 주파수 성분을 탐지할 수 있습니다.

Python을 이용한 STFT 구현

Python에서는 사이파이(SciPy) 라이브러리를 사용하여 STFT를 구현할 수 있습니다. 필요한 라이브러리를 설치한 뒤, 다음과 같은 코드로 STFT를 수행할 수 있습니다.

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# 음성 데이터 불러오기
data, sample_rate = librosa.load('audio.wav')

# STFT 수행
frequencies, times, stft = signal.stft(data, sample_rate)

# STFT 결과 시각화
plt.pcolormesh(times, frequencies, np.abs(stft), shading='auto')
plt.title('STFT 결과')
plt.xlabel('시간 (초)')
plt.ylabel('주파수 (Hz)')
plt.colorbar(label='진폭')
plt.show()

이 코드는 ‘audio.wav’ 파일로부터 음성 데이터를 불러오고, signal.stft 함수를 통해 STFT를 수행합니다. 그리고 결과를 시각화합니다.

결과 분석

위 코드를 실행하면 STFT의 결과를 시각화한 그래프를 확인할 수 있습니다. x축은 시간을, y축은 주파수를 나타냅니다. 그리고 색상의 진폭은 해당 주파수 성분의 강도를 표현합니다.

STFT 결과를 통해 음성 데이터의 주파수 특성을 확인할 수 있습니다. 예를 들어, 음성의 높낮이 변화나 특정 주파수 대역의 강도 변화 등을 확인할 수 있습니다.

결론

STFT는 음성 데이터의 주파수 특성을 분석하기 위한 중요한 도구입니다. Python의 사이파이 라이브러리를 활용하면 손쉽게 STFT를 구현하고, 결과를 시각화할 수 있습니다. STFT를 통해 음성 데이터의 주파수 변화를 분석하여 음성 처리 및 인식 등의 응용에 활용할 수 있습니다.