[파이썬] 음성 데이터 전처리 기술

음성 데이터는 많은 응용 프로그램 및 기계 학습 모델에 사용되는 중요한 형태의 데이터입니다. 그러나 실제 음성 데이터는 종종 노이즈, 잡음, 감쇠 등의 문제가 발생하기 때문에 이를 해결하기 위해 전처리가 필요합니다. 이 글에서는 Python을 사용하여 음성 데이터를 전처리하는 기술에 대해 알아보겠습니다.

1. Wave 파일 로딩

Wave 파일은 일반적으로 음성 데이터를 저장하는 방식 중 하나입니다. Wave 파일을 로딩하는 것은 음성 데이터를 분석하고 전처리하는 첫 번째 단계입니다. Python에서는 wave 모듈을 사용하여 Wave 파일을 로딩할 수 있습니다.

import wave

def load_wave_file(file_path):
    try:
        with wave.open(file_path, 'rb') as wave_file:
            # Wave 파일의 샘플링 레이트, 채널 수, 샘플링 데이터 등을 가져옴
            sample_rate = wave_file.getframerate()
            channel_count = wave_file.getnchannels()
            samples = wave_file.readframes(wave_file.getnframes())
            
            return sample_rate, channel_count, samples
    except FileNotFoundError:
        print(f"Wave 파일 '{file_path}'을 찾을 수 없습니다.")
        return None, None, None

위의 코드에서 load_wave_file() 함수는 Wave 파일의 경로를 인자로 받아 해당 Wave 파일을 로딩합니다. Wave 파일의 샘플링 레이트(sample rate), 채널 수(channel count) 및 샘플링 데이터(samples)를 반환합니다.

2. 노이즈 제거

노이즈는 음성 데이터에서 실제 음성 신호를 분리하기 어렵게 만드는 주요 요인 중 하나입니다. 간단한 노이즈 제거 방법 중 하나는 Moving Average 필터를 사용하는 것입니다.

import numpy as np

def remove_noise(samples, window_size=11):
    # Window size에 따라 Moving Average 필터를 적용하여 노이즈 제거
    window = np.ones(window_size) / window_size
    return np.convolve(samples, window, mode='same')

위의 코드에서 remove_noise() 함수는 Moving Average 필터를 사용하여 노이즈를 제거하는 함수입니다. samples는 로딩한 Wave 파일의 샘플링 데이터를 입력으로 받습니다. window_size는 이동 평균 필터의 윈도우 크기입니다.

3. 산맥 탐지

음성 데이터에서 신호와 배경 소음을 구분하는 것은 중요한 작업입니다. 음성 신호는 보통 높은 주파수를 가진 많은 산맥을 포함하고 있습니다. 이러한 산맥을 탐지하여 음성 신호를 추출하는 방법을 알아보겠습니다.

import librosa
from scipy.signal import find_peaks

def detect_peaks(samples, threshold=0.2, distance=1000):
    # 음성 신호의 산맥 탐지
    peaks, _ = find_peaks(samples, threshold=threshold, distance=distance)
    return peaks

def extract_voiced_signal(samples, peaks, window_size=1000):
    # 산맥 주변의 신호 추출
    voiced_signal = []
    for peak in peaks:
        start = peak - window_size // 2
        end = peak + window_size // 2
        if start >= 0 and end < len(samples):
            voiced_signal.append(samples[start:end])
    return voiced_signal

위의 코드에서 detect_peaks() 함수는 입력 음성 데이터에서 산맥을 탐지합니다. threshold는 산맥을 구분하기 위한 임계값이며, distance는 산맥 간의 최소 간격입니다. 산맥을 탐지한 결과는 peaks로 반환됩니다.

extract_voiced_signal() 함수는 산맥 주변의 신호를 추출합니다. samples는 입력 음성 데이터, peaksdetect_peaks() 함수에서 얻은 산맥의 위치 배열입니다. window_size는 탐지한 산맥 주위에서 추출할 신호의 윈도우 크기입니다.

마무리

이 글에서는 Python을 사용하여 음성 데이터를 전처리하는 기술에 대해 알아보았습니다. Wave 파일 로딩, 노이즈 제거, 산맥 탐지 등의 기술을 적용하여 음성 데이터를 처리할 수 있습니다. 이러한 전처리 기술은 음성 인식, 음성 합성 등과 같은 다양한 음성 기술에 적용될 수 있습니다.