기존에는 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 를 설치하는 방법 순서는 우분투 기준으로 아래와 같다.
- git clone 해오기
git clone https://github.com/Anjok07/ultimatevocalremovergui.git
- 우분투 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
- 파이썬 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를 설치하는 방법 순서는 우분투 기준으로 아래와 같다.
- git clone 하기
git clone https://github.com/karaokenerds/python-audio-separator.git
- Conda 환경 생성
conda create -n uvr python=3.11 conda activate uvr
- 파이썬 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
커뮤니티에 음원 분리를 하는 포스팅이 많다. 이들을 잘 살펴보고, 여러 모델을 비교해보면서 최종적인 모델과 사용법을 정립할 필요성이 있는 것 같다.
'서비스 제작' 카테고리의 다른 글
[기획자 구인 과정] AI 커버곡 제작 웹 서비스 기획자 구하기 (0) | 2024.05.24 |
---|---|
[디자이너 구인 과정] 내 목소리로 AI 커버곡 제작 웹 서비스 디자이너 구하기 (5) | 2024.05.19 |
[RVC 코드 분석] 화자 목소리 모델과 가수 목소리 음원을 합성하여 화자 목소리로 부른 음원을 생성 (0) | 2024.04.17 |
[RVC 코드 분석] 화자의 목소리를 받아서 화자 목소리 모델을 생성 (0) | 2024.04.17 |
[RVC 코드 분석] 노래에서 가수 목소리 음원과 MR 음원으로 분리 (0) | 2024.04.17 |