BLOG

[AI Song Cover] Part4. so-vits-svc 5.0 (2)

[AI Song Cover] Part4. so-vits-svc 5.0 (2)

이제 출국이 얼마 안 남아서 에러와 싸우기도 하고.. 좀 미루기도 하다가.. 일단 현실과 타협했다. 어떻게든 돌려는 봐야지..

아래의 so-vits-svc 5.0 GitHub에 들어가보면, Readme를 열심히 써두셨는데 처음에는 모델 구조 설명과 같은 이론적인 부분이 있고 그 아래에 본격적으로 튜토리얼이 있다.

https://github.com/PlayVoice/so-vits-svc-5.0

튜토리얼은 Setup Environment, Data Preparation, Data Preprocessing, Train, Inference로 구성된다. Setup Environment는 저번 게시글에서 다 했고 이제 Data Preparation을 할 차례이다. 친절한 제작팀이 잘 적어두셨다. 파란색 단어 UVR과 slicer를 클릭하면 각각 다른 GitHub 링크로 연결되는데 둘 다 뭔가 설치하는 프로그램이다. 코드로 한번에 다 돌리고 싶지 프로그램을 설치해서 따로 돌리고 싶은 건 아니므로 일단 패스.

설명을 읽어보면, 'UVR을 이용하여 목소리와 반주를 분리하고, slicer를 이용하여 짧은 단위로 나누어서, 노이즈를 제거하고 소리의 크기를 잘 조절해서 아래와 같은 구조로 만들어라'고 한다. 그럼 굳이 저 링크에 있는 것들을 사용할 필요는 없어 보인다. 소리의 크기는 부차적인 느낌이니까, 일단 내가 할 일은 3가지이다.

목소리와 반주 분리

짧은 단위로 나누기

노이즈 제거

먼저 목소리와 반주 분리를 위해 노래 파일이 있어야 한다. 파일만 구하는 방법도 있겠지만 유튜브 링크를 통해 파일을 가져올 예정이다. 대강 input으로 유튜브 링크가 들어오면 거기서 음성을 가져와서 목소리와 반주를 분리하고, 짧은 단위로 나누고, 노이즈를 제거해서 output을 저런 구조로 출력하는 그림이다.

파일 구조를 보면 이 프로젝트에서는 가수가 여러명인 상황도 가정한 것 같은데, 나는 일단 가수가 한명인 경우로 도전. 가수가 한명이라면 반주를 분리했을 때 화음이 섞이는 경우에 대한 처리가 미흡할 것 같으니, 코러스라거나 화음이 섞이지 않은 노래 파일을 골라야 한다. 노래를 두개 찾아야 하는데, 하나는 목소리를 학습할 노래이고, 나머지 하나는 학습한 목소리로 부를 노래이다.

유튜브를 열심히 돌아다녀보니 '리무진서비스' 라는 재생목록에 좋은 자료들이 많다. 가수도 많고 대체로 반주 위에서 혼자 노래를 부르는 것 같다. 클립으로 노래만 따로 잘린 영상들도 검색하면 많으니 아래 링크를 참고하자. 한 곡으로 훈련이 잘 될지는 모르겠지만.. 나는 학습할 노래로 츄의 Say you love me를 골랐다. 노래를 참 잘 부르신다. 학습한 목소리로 부를 노래를 천천히 생각해보자..

https://www.youtube.com/playlist?list=PLglOEKjPpXkn9jTaTo93xcEnkglDsUkuV

방향성을 세우고 데이터도 골랐으니 이제 코드를 짜야한다. 다행히 요즘 세상에는 좋은 모듈과 이미 코드를 짜두신 멋진 분들이 가득하다. 나는 아래 링크를 참고했다. 비록 주피터 노트북이긴 하지만 아주 멋진 코드다. so-vits-svc 4.0을 돌리기 위한 코드인데 Dataset Preparation 부분은 4.0이나 5.0이나 그대로 쓰는 모양이다.

https://github.com/reshalfahsi/AI-Cover-Song/blob/master/AICoverSong.ipynb

코드는 아래와 같은 흐름으로 구성되어 있다.

Prerequisite

Download Youtube WAV

Seperate Vocal and Instrunment/Noise using Demucs

Split The Audio Dataset (Speaker) into Smaller Duration Before Training

Automatic Processing

Copy configs file

Train

Inference

Combine Vocal and Instrunment (Song Cover)

여기서 Data Preparation에 해당되는 부분은 Download Youtube WAV부터 Split The Audio Dataset (Speaker) into Smaller Duration Before Training까지이다. 그리고 흐름을 보면 알 수 있지만, MR과 Vocal을 분리해서 Vocal을 열심히 학습시킨 후에 MR을 다시 합치는 느낌이다.

원래 계획은 이 코드를 잘 따서 SSH 서버에서 돌리기였는데.. 계속 ffmpeg 모듈을 인식하지 못한다. 이것저것 시도해보다가 일단 코랩으로 돌렸다.

코드를 열심히 따라서 돌리면 중간중간 숨어있는 mkdir 명령어로 폴더들이 만들어지고, 또 어느새 그 안에 파일들이 만들어진다. Split The Audio Dataset (Speaker) into Smaller Duration Before Training까지 돌리면 아래와 같은 파일 구조가 만들어진다.

dataset_raw 폴더를 열어보면 위에서 본 사진과 같은 구조가 잘 만들어졌다. 아래 보이는 json 파일은 열어보니 나누어진 각각의 wav 파일의 시작 위치와 종료 위치를 나타내고 있었다.

코드를 보면 이해할 수 있는데 하나하나 다 만들려면 시간이 꽤 필요할 듯 하다. MR과 Vocal의 분리는 Demucs라는 모듈이 자동으로 해주는 것 같고, Vocal을 split하는 것은 amplitude를 바탕으로 소리가 나오지 않는 시간을 정의해서 수행하는 것 같다. Demucs는 하이브리드 트랜스포머를 이용하는 Music Source Seperation 분야의 SOTA 모델이라고 한다. 보컬, 드럼, 베이스를 다른 반주로부터 분리할 수 있는 모양이다. 더 이상 유지보수하지 않는 프로젝트라고 하는데.. 궁금한 사람은 아래 링크를 참고하자. 코드를 잘 돌렸으면 Data Preparation은 끝이긴 한데.. 이걸 SSH 서버로 어떻게 옮기냐.. scp? 그냥 코드가 돌아가면 좋겠는데 ㅠㅠ

https://github.com/facebookresearch/demucs

SCP라도 해보려고 SSH 서버를 켰더니 아래와 같은 문제가 발생했다. 하하. 트래픽이 많으면 생길 수 있는 문제라는데 대체 이 시간에 왜 사람들이 몰리냐! 과연 일본 가기 전에 돌릴 수 있을까?