02
01

대학교 자유 연구 때 다루던 Spleeter에 관한 내용이 생각나서 작성

기본적으로 음원을 분리해주는 툴이라고 생각하며 좋다.

2stems로 분리한다는 설정을 주면, 음원을 vocals.wavaccompaniment.wav로 분리해준다.

엄청 깔끔하게 분리되는 편은 아니지만 나름 들을만 한 정도이다. (포스트 하단에 결과 첨부)

로컬에서 Spleeter로 음원 분리 환경 구현

python 환경에서 작동하며, 조금 검색을 해 보면 Google Colab에서도 사용할 수 있도록 마련된 환경이 보이는데, 어째서인지 런타임이 강제로 종료되는 등 잘 작동하지 않아 로컬 환경에서 구현하였다.

선행하여 해 주어야 할 것이 두 가지 있다.

  1. pip install spleeter를 통한 spleeter 패키지의 설치
  2. FFmpeg의 설치. 공식 FFmpeg 웹사이트에서 운영체제에 맞는 설치 지침을 확인 할 수 있다.
    • Windows의 경우, FFmpeg의 바이너리(zip) 파일을 다운로드하고, 압축을 해제한 후, ffmpeg.exe가 포함된 디렉토리를 시스템의 환경 변수 Path에 추가한다.
    • 설치가 완료된 후, 터미널이나 커맨드 프롬프트에서 ffmpeg -version 명령어를 실행하여 FFmpeg가 올바르게 설치되었는지 확인할 수 있다.

위 내용이 선행되었다면, 아래와 같은 내용의 Python 파일을 작성하여 실행한다.

여러가지 옵션을 줄 수 있지만, 일단은 아래와 같이 작성하여 잘 작동하는지 확인한다.

from spleeter.separator import Separator

def main():
    # 오디오 파일 분리 설정
    separator = Separator('spleeter:2stems')

    # 분리할 오디오 파일 경로
    audio_path = './song.mp3'

    # 결과물을 저장할 디렉토리
    output_path = 'output/'

    # 오디오 파일 분리 실행
    separator.separate_to_file(audio_path, output_path)

    # 결과 확인 등의 추가 코드

if __name__ == '__main__':
    main()

if __name__ == '__main__':의 형식을 사용하지 않는다면 Python의 multiprocessing 모듈을 사용할 때 발생하는 문제를 겪게 된다.

Windows 환경에서 multiprocessing을 사용할 때, 스크립트의 메인 블록이 올바르게 보호되지 않기 때문이라고 한다.

다른 변수가 없다면, main.pysong.mp3 이외에 아래와 같은 파일구조가 만들어졌을 것이다.

output/음원이름/ 위치에 결과물이 위치한다

음원소스는 다음의 유튜브 동영상을 사용하였다.

グッバイ宣言 / 百鬼あやめ cover

song.mp3와 이로부터 생성된 vocals.wav(보컬), accompaniment.wav(반주)는 아래와 같다.

성능을 보여주기 위해 첨부하는데, 출력된 파일 크기가 각각 20메가를 넘어, 부득이하게 크기를 줄여 첨부하였다.

song.mp3
2.64MB
vocals_out.mp3
6.57MB
accompaniment_out.mp3
6.57MB

사용한다면 vocal쪽보다 반주쪽이 더 사용하기에 자연스러울 것 같다.

 

Colab 에서 Spleeter로 음원 분리 환경 시도

더하여, Colab에서 시도했던 내용은 아래와 같다.(공유)

더보기

# 스플리터와 ffmpeg 설치

# 필요한 패키지들 설치
!apt install ffmpeg
!pip install spleeter

# Spleeter 사용하여 음원 분리

# 파일 업로드
from google.colab import files
uploaded = files.upload()

# 업로드한 파일 목록 중 첫 번째 파일의 이름을 가져옵니다.
file_name = next(iter(uploaded))

# spleeter를 사용하여 파일 분리
!spleeter separate -o output/ "$file_name"

from IPython.display import Audio, display

# 보컬 파일 재생
vocals_path = 'output/song/vocals.wav'  # spleeter가 저장한 보컬 파일 경로
display(Audio(vocals_path))

# # 반주 파일 재생
# accompaniment_path = 'output/song/accompaniment.wav'  # spleeter가 저장한 반주 파일 경로
# display(Audio(accompaniment_path))

마지막 블럭을 실행하면, 런타임 연결이 끊겨 실행할 수가 없게 된다. 아무래도 Colab 유료 플랜을 사용하고 있지 않은것이 문제라고 예상된다.

반응형
COMMENT