본문 바로가기

서비스 제작

[UVR 음원 분리] 음원 분리 잡음 해결

기존에는 https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI 의 music separation 모듈을 사용했다. 하지만 이 경우에는 분리된 MR에서 고음이나 소리가 큰 부분의 경우에는 찢어지는 소리가 들리는 문제가 있었다. 이를 해결할 필요가 있었다. (이 오픈소스에서도 아래의 UVR 모듈을 사용했다. 아마 사용한 모델이 약간 불안정한 모델이어서 찢어지는 소리가 생성된 듯 하다.)

ultimatevocalremovergui

이 때문에 현재 보컬 분리 오픈소스 중 가장 좋다고 하는 https://github.com/Anjok07/ultimatevocalremovergui 를 사용해서 보컬과 MR을 분리하는 모듈을 갈아끼우려고 한다.

ultimatevocalremovergui 설치법

https://github.com/Anjok07/ultimatevocalremovergui 를 설치하는 방법 순서는 우분투 기준으로 아래와 같다.


  1. git clone 해오기
    git clone https://github.com/Anjok07/ultimatevocalremovergui.git

  1. 우분투 Dependency 설치하기
    sudo apt update && sudo apt upgrade
    sudo apt-get update
    sudo apt install ffmpeg
    sudo apt install python3-pip
    sudo apt-get -y install python3-tk
    sudo apt-get install cmake

  1. 파이썬 Dependency 설치하기
    requirements.txt를 사용해서 설치하기도 했으나 이 과정에서 어떤 설치 라이브러리의 오류가 발생하여 requirements.txt를 사용하는 대신 라이브러리를 하나하나 설치했다.
    pip install audioread
    pip install librosa
    pip install psutil
    pip install psutil
    pip install pyglet
    pip install pyperclip
    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
    pip install wget
    pip install matchering
    pip install cryptography
    pip install screeninfo
    pip install kthread
    pip install tqdm
    pip install julius
    pip install omegaconf
    pip install diffq
    pip install onnx
    pip install onnxruntime-gpu
    pip install pydub
    pip install pytorch-lightning
    pip install onnx2pytorch
    pip install playsound
    pip install ml-collections
    pip install Pillow==9.3.0

설정 후 ultimatevocalremovergui 사용법은 아래 링크를 따라서 했다. 해당 링크에서 보컬 분리는 MDX-NET VOC FT 모델을 사용했다. 그래서 나도 이 모델을 사용했다.

너도 할 수 있다! AI로 담당돌 노래 커버하기 (RVC 튜토리얼) - 밀리시타 마이너 갤러리

ultimatevocalremover CLI 버전 사용

나는 이것을 내 서비스에 사용하기 위해 GUI를 코드 상으로 옮길 필요가 있다. 즉, GUI 버전은 바로 사용할 수 없다. 그래서 CLI 버전을 찾다보니 https://github.com/karaokenerds/python-audio-separator 라는 오픈소스가 있었다. 이 오픈소스의 contributor에 GUI 버전을 만든 사람이 있었고, 내가 원하는 모델도 있어서 이 오픈소스를 사용하려고 한다.


python-audio-separator 설치법

python-audio-separator를 설치하는 방법 순서는 우분투 기준으로 아래와 같다.


  1. git clone 하기
    git clone https://github.com/karaokenerds/python-audio-separator.git

  1. Conda 환경 생성
    conda create -n uvr python=3.11
    conda activate uvr

  1. 파이썬 dependency 설치하기
    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
    pip install onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
    pip install numpy
    pip install librosa
    pip install requests
    pip install six
    pip install tqdm
    pip install pydub
    pip install chardet

여기서는 중간에 한 번 문제가 발생했었다. pip install onnxruntime-gpu로 설치했을 때 onnxruntime-gpu 라이브러리가 아직 cuda 12.1버전을 지원하지 않는것이었다. 이 때문에 아래 코드로 onnxruntime-gpu를 설치했어야했다.

pip install onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/

python-audio-separator 사용법

사용 parameter는 아래를 확인한다.

사용법: audio-separator [-h] [-v] [-d] [-e] [-l] [--log_level LOG_LEVEL] [-m MODEL_FILENAME] [--output_format OUTPUT_FORMAT] [--output_dir OUTPUT_DIR] [--model_file_dir MODEL_FILE_DIR] [--invert_spect]
                       [--normalization NORMALIZATION] [--single_stem SINGLE_STEM] [--sample_rate SAMPLE_RATE] [--mdx_segment_size MDX_SEGMENT_SIZE] [--mdx_overlap MDX_OVERLAP] [--mdx_batch_size MDX_BATCH_SIZE]
                       [--mdx_hop_length MDX_HOP_LENGTH] [--mdx_enable_denoise] [--vr_batch_size VR_BATCH_SIZE] [--vr_window_size VR_WINDOW_SIZE] [--vr_aggression VR_AGGRESSION] [--vr_enable_tta]
                       [--vr_high_end_process] [--vr_enable_post_process] [--vr_post_process_threshold VR_POST_PROCESS_THRESHOLD] [--demucs_segment_size DEMUCS_SEGMENT_SIZE] [--demucs_shifts DEMUCS_SHIFTS]
                       [--demucs_overlap DEMUCS_OVERLAP] [--demucs_segments_enabled DEMUCS_SEGMENTS_ENABLED] [--mdxc_segment_size MDXC_SEGMENT_SIZE] [--mdxc_use_model_segment_size] [--mdxc_overlap MDXC_OVERLAP]
                       [--mdxc_batch_size MDXC_BATCH_SIZE] [--mdxc_pitch_shift MDXC_PITCH_SHIFT]
                       [audio_file]

오디오 파일을 다양한 스템으로 분리합니다.

위치 인자:
  audio_file                                             분리할 오디오 파일의 경로 (일반적인 형식 모두 가능).

옵션:
  -h, --help                                             도움말 메시지를 표시하고 종료합니다.

정보 및 디버깅:
  -v, --version                                          프로그램의 버전 정보를 표시하고 종료합니다.
  -d, --debug                                            디버그 로깅을 활성화합니다 (동일: --log_level=debug).
  -e, --env_info                                         환경 정보를 출력하고 종료합니다.
  -l, --list_models                                      지원되는 모든 모델을 나열하고 종료합니다.
  --log_level LOG_LEVEL                                  로그 레벨 (기본값: info). 예: --log_level=debug

분리 입출력 매개변수:
  -m MODEL_FILENAME, --model_filename MODEL_FILENAME     사용할 분리 모델 (기본값: UVR-MDX-NET-Inst_HQ_3.onnx). 예: -m 2_HP-UVR.pth
  --output_format OUTPUT_FORMAT                          분리된 파일의 출력 형식 (기본값: FLAC). 예: --output_format=MP3
  --output_dir OUTPUT_DIR                                출력 파일을 저장할 디렉토리 (기본값: 현재 디렉토리). 예: --output_dir=/app/separated
  --model_file_dir MODEL_FILE_DIR                        모델 파일 디렉토리 (기본값: /tmp/audio-separator-models/). 예: --model_file_dir=/app/models

일반 분리 매개변수:
  --invert_spect                                         스펙트로그램을 사용하여 보조 스템을 반전시킵니다 (기본값: False). 예: --invert_spect
  --normalization NORMALIZATION                          입력 및 출력 오디오의 최대 피크 진폭 (기본값: 0.9). 예: --normalization=0.7
  --single_stem SINGLE_STEM                              단일 스템만 출력합니다 (예: Instrumental, Vocals, Drums, Bass, Guitar, Piano, Other). 예: --single_stem=Instrumental
  --sample_rate SAMPLE_RATE                              출력 오디오의 샘플 속도 (기본값: 44100). 예: --sample_rate=44100

MDX 아키텍처 매개변수:
  --mdx_segment_size MDX_SEGMENT_SIZE                    세그먼트 크기, 클수록 더 많은 자원을 소모하지만 결과가 더 좋을 수 있음 (기본값: 256). 예: --mdx_segment_size=256
  --mdx_overlap MDX_OVERLAP                              예측 창 사이의 중첩 비율, 0.001-0.999 (기본값: 0.25). 예: --mdx_overlap=0.25
  --mdx_batch_size MDX_BATCH_SIZE                        배치 크기, 클수록 RAM을 더 많이 사용하지만 처리 속도가 빨라질 수 있음 (기본값: 1). 예: --mdx_batch_size=4
  --mdx_hop_length MDX_HOP_LENGTH                        신경망의 스트라이드, 알지 못하면 변경하지 마세요 (기본값: 1024). 예: --mdx_hop_length=1024
  --mdx_enable_denoise                                   분리 중 노이즈 제거를 활성화합니다 (기본값: False). 예: --mdx_enable_denoise

VR 아키텍처 매개변수:
  --vr_batch_size VR_BATCH_SIZE                          한 번에 처리할 배치 수, 클수록 더 많은 RAM을 사용하지만 처리 속도가 약간 빨라짐 (기본값: 4). 예: --vr_batch_size=16
  --vr_window_size VR_WINDOW_SIZE                        품질과 속도의 균형. 1024 = 빠르지만 낮은 품질, 320 = 느리지만 높은 품질 (기본값: 512). 예: --vr_window_size=320
  --vr_aggression VR_AGGRESSION                          주요 스템 추출 강도, -100 - 100 (기본값: 5). 예: --vr_aggression=2
  --vr_enable_tta                                        테스트 시간 증강을 활성화합니다; 느리지만 품질 향상 (기본값: False). 예: --vr_enable_tta
  --vr_high_end_process                                  출력의 누락된 주파수 범위를 반영합니다 (기본값: False). 예: --vr_high_end_process
  --vr_enable_post_process                               보컬 출력 내 남은 아티팩트를 식별합니다; 일부 노래의 분리를 개선할 수 있음 (기본값: False). 예: --vr_enable_post_process
  --vr_post_process_threshold VR_POST_PROCESS_THRESHOLD  후처리 기능의 임계값: 0.1-0.3 (기본값: 0.2). 예: --vr_post_process_threshold=0.1

Demucs 아키텍처 매개변수:
  --demucs_segment_size DEMUCS_SEGMENT_SIZE              오디오를 분할하는 세그먼트 크기, 1-100. 클수록 느리지만 품질 향상 (기본값: 기본값). 예: --demucs_segment_size=256
  --demucs_shifts DEMUCS_SHIFTS                          임의의 이동을 포함한 예측 횟수, 클수록 느리지만 품질 향상 (기본값: 2). 예: --demucs_shifts=4
  --demucs_overlap DEMUCS_OVERLAP                        예측 창 사이의 중첩 비율, 0.001-0.999 (기본값: 0.25). 예: --demucs_overlap=0.25
  --demucs_segments_enabled DEMUCS_SEGMENTS_ENABLED      세그먼트별 처리를 활성화합니다 (기본값: True). 예: --demucs_segments_enabled=False

MDXC 아키텍처 매개변수:
  --mdxc_segment_size MDXC_SEGMENT_SIZE                  세그먼트 크기, 클수록 더 많은 자원을 소모하지만 결과가 더 좋을 수 있음 (기본값: 256). 예: --mdxc_segment_size=256
  --mdxc_use_model_segment_size                          구성 파일의 값 대신 모델 기본 세그먼트 크기를 사용합니다. 예: --mdxc_use_model_segment_size
  --mdxc_overlap MDXC_OVERLAP                            예측 창 사이의 중첩 비율, 2-50 (기본값: 8). 예: --mdxc_overlap=8
  --mdxc_batch_size MDXC_BATCH_SIZE                      배치 크기, 클수록 RAM을 더 많이 사용하지만 처리 속도가 약간 빨라질 수 있음 (기본값: 1). 예: --mdxc_batch_size=4
  --mdxc_pitch_shift MDXC_PITCH_SHIFT                    처리 중 오디오 피치를 세미톤 단위로 이동시킵니다. 깊은/높은 보컬에 대해 출력을 향상시킬 수 있음 (기본값: 0). 예: --mdxc_pitch_shift=2

아래 코드를 실행하면 모델 리스트를 볼 수 있다.

audio-separator -l

모델 리스트는 아래와 같다. 여기 MDX에 사용하고자 하는 “UVR-MDX-NET-Voc_FT.onnx”가 있는 것을 확인할 수 있다.

{
    "Demucs": {
        "Demucs v4: hdemucs_mmi": {
            "75fc33f5-1941ce65.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/75fc33f5-1941ce65.th",
            "hdemucs_mmi.yaml": "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/hdemucs_mmi.yaml"
        },
        "Demucs v4: htdemucs": {
            "955717e8-8726e21a.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/955717e8-8726e21a.th",
            "htdemucs.yaml": "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/htdemucs.yaml"
        },
        "Demucs v4: htdemucs_6s": {
            "5c90dfd2-34c22ccb.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/5c90dfd2-34c22ccb.th",
            "htdemucs_6s.yaml": "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/htdemucs_6s.yaml"
        },
        "Demucs v4: htdemucs_ft": {
            "04573f0d-f3cf25b2.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/04573f0d-f3cf25b2.th",
            "92cfc3b6-ef3bcb9c.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/92cfc3b6-ef3bcb9c.th",
            "d12395a8-e57c48e6.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/d12395a8-e57c48e6.th",
            "f7e0c4bc-ba3fe64a.th": "https://dl.fbaipublicfiles.com/demucs/hybrid_transformer/f7e0c4bc-ba3fe64a.th",
            "htdemucs_ft.yaml": "https://github.com/TRvlvr/model_repo/releases/download/all_public_uvr_models/htdemucs_ft.yaml"
        }
    },
    "MDX": {
        "MDX-Net Model VIP: UVR-MDX-NET-Inst_full_292": "UVR-MDX-NET-Inst_full_292.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Inst_187_beta": "UVR-MDX-NET_Inst_187_beta.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Inst_82_beta": "UVR-MDX-NET_Inst_82_beta.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Inst_90_beta": "UVR-MDX-NET_Inst_90_beta.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Main_340": "UVR-MDX-NET_Main_340.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Main_390": "UVR-MDX-NET_Main_390.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Main_406": "UVR-MDX-NET_Main_406.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Main_427": "UVR-MDX-NET_Main_427.onnx",
        "MDX-Net Model VIP: UVR-MDX-NET_Main_438": "UVR-MDX-NET_Main_438.onnx",
        "MDX-Net Model: Kim Inst": "Kim_Inst.onnx",
        "MDX-Net Model: Kim Vocal 1": "Kim_Vocal_1.onnx",
        "MDX-Net Model: Kim Vocal 2": "Kim_Vocal_2.onnx",
        "MDX-Net Model: Reverb HQ By FoxJoy": "Reverb_HQ_By_FoxJoy.onnx",
        "MDX-Net Model: UVR-MDX-NET 1": "UVR_MDXNET_1_9703.onnx",
        "MDX-Net Model: UVR-MDX-NET 2": "UVR_MDXNET_2_9682.onnx",
        "MDX-Net Model: UVR-MDX-NET 3": "UVR_MDXNET_3_9662.onnx",
        "MDX-Net Model: UVR-MDX-NET Crowd HQ 1 By Aufr33": "UVR-MDX-NET_Crowd_HQ_1.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst 1": "UVR-MDX-NET-Inst_1.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst 2": "UVR-MDX-NET-Inst_2.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst 3": "UVR-MDX-NET-Inst_3.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst HQ 1": "UVR-MDX-NET-Inst_HQ_1.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst HQ 2": "UVR-MDX-NET-Inst_HQ_2.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst HQ 3": "UVR-MDX-NET-Inst_HQ_3.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst HQ 4": "UVR-MDX-NET-Inst_HQ_4.onnx",
        "MDX-Net Model: UVR-MDX-NET Inst Main": "UVR-MDX-NET-Inst_Main.onnx",
        "MDX-Net Model: UVR-MDX-NET Karaoke": "UVR_MDXNET_KARA.onnx",
        "MDX-Net Model: UVR-MDX-NET Karaoke 2": "UVR_MDXNET_KARA_2.onnx",
        "MDX-Net Model: UVR-MDX-NET Main": "UVR_MDXNET_Main.onnx",
        "MDX-Net Model: UVR-MDX-NET Voc FT": "UVR-MDX-NET-Voc_FT.onnx",
        "MDX-Net Model: UVR_MDXNET_9482": "UVR_MDXNET_9482.onnx",
        "MDX-Net Model: kuielab_a_bass": "kuielab_a_bass.onnx",
        "MDX-Net Model: kuielab_a_drums": "kuielab_a_drums.onnx",
        "MDX-Net Model: kuielab_a_other": "kuielab_a_other.onnx",
        "MDX-Net Model: kuielab_a_vocals": "kuielab_a_vocals.onnx",
        "MDX-Net Model: kuielab_b_bass": "kuielab_b_bass.onnx",
        "MDX-Net Model: kuielab_b_drums": "kuielab_b_drums.onnx",
        "MDX-Net Model: kuielab_b_other": "kuielab_b_other.onnx",
        "MDX-Net Model: kuielab_b_vocals": "kuielab_b_vocals.onnx"
    },
    "MDXC": {
        "MDX23C Model VIP: MDX23C-InstVoc HQ 2": {
            "MDX23C-8KFFT-InstVoc_HQ_2.ckpt": "model_2_stem_full_band_8k.yaml"
        },
        "MDX23C Model VIP: MDX23C_D1581": {
            "MDX23C_D1581.ckpt": "model_2_stem_061321.yaml"
        },
        "MDX23C Model: MDX23C-InstVoc HQ": {
            "MDX23C-8KFFT-InstVoc_HQ.ckpt": "model_2_stem_full_band_8k.yaml"
        }
    },
    "VR": {
        "VR Arch Single Model v4: MGM_HIGHEND_v4": "MGM_HIGHEND_v4.pth",
        "VR Arch Single Model v4: MGM_LOWEND_A_v4": "MGM_LOWEND_A_v4.pth",
        "VR Arch Single Model v4: MGM_LOWEND_B_v4": "MGM_LOWEND_B_v4.pth",
        "VR Arch Single Model v4: MGM_MAIN_v4": "MGM_MAIN_v4.pth",
        "VR Arch Single Model v5: 10_SP-UVR-2B-32000-1": "10_SP-UVR-2B-32000-1.pth",
        "VR Arch Single Model v5: 11_SP-UVR-2B-32000-2": "11_SP-UVR-2B-32000-2.pth",
        "VR Arch Single Model v5: 12_SP-UVR-3B-44100": "12_SP-UVR-3B-44100.pth",
        "VR Arch Single Model v5: 13_SP-UVR-4B-44100-1": "13_SP-UVR-4B-44100-1.pth",
        "VR Arch Single Model v5: 14_SP-UVR-4B-44100-2": "14_SP-UVR-4B-44100-2.pth",
        "VR Arch Single Model v5: 15_SP-UVR-MID-44100-1": "15_SP-UVR-MID-44100-1.pth",
        "VR Arch Single Model v5: 16_SP-UVR-MID-44100-2": "16_SP-UVR-MID-44100-2.pth",
        "VR Arch Single Model v5: 17_HP-Wind_Inst-UVR": "17_HP-Wind_Inst-UVR.pth",
        "VR Arch Single Model v5: 1_HP-UVR": "1_HP-UVR.pth",
        "VR Arch Single Model v5: 2_HP-UVR": "2_HP-UVR.pth",
        "VR Arch Single Model v5: 3_HP-Vocal-UVR": "3_HP-Vocal-UVR.pth",
        "VR Arch Single Model v5: 4_HP-Vocal-UVR": "4_HP-Vocal-UVR.pth",
        "VR Arch Single Model v5: 5_HP-Karaoke-UVR": "5_HP-Karaoke-UVR.pth",
        "VR Arch Single Model v5: 6_HP-Karaoke-UVR": "6_HP-Karaoke-UVR.pth",
        "VR Arch Single Model v5: 7_HP2-UVR": "7_HP2-UVR.pth",
        "VR Arch Single Model v5: 8_HP2-UVR": "8_HP2-UVR.pth",
        "VR Arch Single Model v5: 9_HP2-UVR": "9_HP2-UVR.pth",
        "VR Arch Single Model v5: UVR-BVE-4B_SN-44100-1": "UVR-BVE-4B_SN-44100-1.pth",
        "VR Arch Single Model v5: UVR-De-Echo-Aggressive by FoxJoy": "UVR-De-Echo-Aggressive.pth",
        "VR Arch Single Model v5: UVR-De-Echo-Normal by FoxJoy": "UVR-De-Echo-Normal.pth",
        "VR Arch Single Model v5: UVR-DeEcho-DeReverb by FoxJoy": "UVR-DeEcho-DeReverb.pth",
        "VR Arch Single Model v5: UVR-DeNoise by FoxJoy": "UVR-DeNoise.pth",
        "VR Arch Single Model v5: UVR-DeNoise-Lite by FoxJoy": "UVR-DeNoise-Lite.pth"
    }
}

아래 코드를 사용하면 해당 폴더에 있는 downloaded_music.wav라는 음악 파일을 UVR-MDX-NET-Voc_FT.onnx을 사용하여 음원 분리를 하고, wav포맷으로 최종 파일을 저장한다. 최종적으로 downloaded_music_(Instrumental)UVR-MDX-NET-Voc_FT.wav라는 MR 파일과 downloaded_music(Vocals)_UVR-MDX-NET-Voc_FT.wav라는 보컬 파일이 저장된다.

audio-separator downloaded_music.wav -m UVR-MDX-NET-Voc_FT.onnx --output_format=wav

커뮤니티에 음원 분리를 하는 포스팅이 많다. 이들을 잘 살펴보고, 여러 모델을 비교해보면서 최종적인 모델과 사용법을 정립할 필요성이 있는 것 같다.