[파이썬] 음성 데이터의 음성 합성을 위한 음성 변환 제어

음성 변환(Voice Conversion)은 한 사람의 음성을 다른 사람의 음성으로 변환하는 기술입니다. 이 기술은 음성 합성(Voice Synthesis) 애플리케이션, 오디오 편집 소프트웨어, 음악 분석 등 다양한 분야에서 사용됩니다. 이번 블로그 포스트에서는 파이썬을 사용하여 음성 변환 제어를 하는 방법을 알아보겠습니다.

음성 변환을 위한 데이터 수집

음성 변환 모델을 구축하기 위해서는 변환하고자 하는 두 사람의 음성 데이터가 필요합니다. 데이터 수집을 위해서는 두 사람이 동일한 문장을 별도의 오디오 파일로 녹음해야 합니다.

import sounddevice as sd
import soundfile as sf

def record_audio(filename, duration):
    # 오디오 입력 장치 선택
    device_info = sd.query_devices(None, 'input')
    device_id = device_info[0]['default_samplerate']
    
    # 오디오 녹음 시작
    print("녹음을 시작합니다. {}초 동안 녹음됩니다.".format(duration))
    audio = sd.rec(int(duration * device_id), samplerate=device_id, channels=1)
    sd.wait()
    
    # 오디오 파일로 저장
    sf.write(filename, audio, device_id)

# 첫 번째 사람의 음성 녹음
record_audio("person1.wav", 5)

# 두 번째 사람의 음성 녹음
record_audio("person2.wav", 5)

위의 코드는 sounddevicesoundfile 라이브러리를 사용하여 오디오 입력 장치로부터 음성을 녹음하는 기능을 구현한 예시입니다. record_audio 함수는 필요한 녹음 시간(duration)을 입력으로 받고, 해당 시간 동안 음성을 녹음한 뒤 파일로 저장합니다.

음성 변환 모델 학습

음성 변환 모델을 학습하기 위해서는 녹음한 음성 데이터를 사용해야 합니다. 일반적으로 딥러닝 기반의 음성 변환 모델을 구축하며, 이를 위해서는 데이터 전처리와 모델 훈련 등의 작업이 필요합니다. 하지만 이번 블로그 포스트에서는 모델 학습 단계까지 다루지 않고, 간단한 음성 변환 예제를 통해 제어 방법을 알아보겠습니다.

import librosa
import numpy as np

# 음성 변환 함수
def voice_conversion(input_audio, target_audio):
    # 입력 오디오 로드
    input, input_sr = librosa.load(input_audio, sr=None)
    
    # 대상 오디오 로드
    target, target_sr = librosa.load(target_audio, sr=None)
    
    # 입력 오디오와 대상 오디오의 길이 일치시키기
    min_length = min(len(input), len(target))
    input = input[:min_length]
    target = target[:min_length]
    
    # 음성 변환 수행
    converted_audio = np.mean(target) + (input - np.mean(input))
    
    return converted_audio

# 음성 변환 실행
input_audio = "person1.wav"
target_audio = "person2.wav"
converted_audio = voice_conversion(input_audio, target_audio)

# 변환된 음성 파일 저장
sf.write("converted_audio.wav", converted_audio, input_sr)

위의 코드는 librosa 라이브러리를 사용하여 음성 파일을 로드하고, 간단한 음성 변환을 수행하는 예시입니다. voice_conversion 함수는 입력 오디오(input_audio)와 대상 오디오(target_audio)를 입력으로 받아, 변환된 오디오를 반환합니다. 이 예제에서는 입력 오디오의 평균값과 대상 오디오의 평균값을 맞춘 뒤, 변환을 수행하는 방법을 사용했습니다.

음성 변환 제어

음성 변환 모델을 제어하여 원하는 전달 강도나 음색 등을 조절할 수 있습니다. 이를 위해서는 변환에 사용되는 파라미터를 조정하면 됩니다. 다음은 음성 변환 제어를 위한 예시 코드입니다.

# 음성 변환 함수 (제어 가능)
def voice_conversion(input_audio, target_audio, control_parameter):
    # 입력 오디오 로드
    input, input_sr = librosa.load(input_audio, sr=None)
    
    # 대상 오디오 로드
    target, target_sr = librosa.load(target_audio, sr=None)
    
    # 입력 오디오와 대상 오디오의 길이 일치시키기
    min_length = min(len(input), len(target))
    input = input[:min_length]
    target = target[:min_length]
    
    # 음성 변환 수행
    converted_audio = control_parameter * target + (1 - control_parameter) * input
    
    return converted_audio

# 음성 변환 실행 (제어 파라미터 = 0.8)
control_parameter = 0.8
converted_audio = voice_conversion(input_audio, target_audio, control_parameter)

# 변환된 음성 파일 저장
sf.write("converted_audio.wav", converted_audio, input_sr)

위의 코드는 이전의 음성 변환 함수에 추가하여 제어 파라미터(control_parameter)를 입력으로 받고, 이를 이용하여 변환에 사용되는 오디오 파라미터를 조정하는 예시입니다. 제어 파라미터가 0일 경우, 변환 결과는 입력 오디오가 됩니다. 제어 파라미터가 1일 경우, 변환 결과는 대상 오디오가 됩니다. 이 외의 값들은 입력 오디오와 대상 오디오의 비율에 따라 변환되는 결과가 결정됩니다.

음성 변환을 통해 한 사람의 음성을 다른 사람의 음성으로 변환하는 기술은 다양한 분야에서 활용되고 있습니다. 이를 제어하여 원하는 음색이나 강도를 조절할 수 있으면 음악, 영화 등 다양한 창작물에 적용할 수 있습니다. 파이썬을 활용한 음성 변환 제어 기술은 음성 합성 분야에 많은 혁신을 가져다줄 것입니다.