Python

[Python/파이썬] 목소리와 음악을 구분하자 - 1편(with Spleeter)

F12:) 2023. 7. 25. 19:44

오늘은 음성데이터에서 존재하는 음악과 목소리를 분류하는 작업을 진행하려 합니다.

 

이를 위해서 저는 두 가지 방법을 거쳐 진행하였습니다.

 

Spleeter를 통해서 음성 데이터의 mr을 진행했습니다.

     - 이러한 이유는, 음성 데이터에 존재하는 목소리만을 추출해야했기 때문입니다.

 

음성 데이터(제가 사용하는 라디오 음성 데이터 기준)는 크게 나누면 멘트, 광고, 노래 컨텐츠가 존재합니다. 이러한 컨텐츠는 각자 특징이 있고 저는 이 컨텐츠를 분리해야 했습니다.

 

가장 먼저 시도한 것은, 단순히 음성 데이터를 스펙트로그램으로 변환하여 제가 제작한 CNN 모델에 학습을 시켜 나중의 데이터에 대해서 예측하는 방법입니다.

 

스펙트로그램은 시간에 따라서 변하는 주파수를 시각화한 것이라고 이해하시면 편합니다. 

(주파수란, 일정 시간동안 갖는 주기를 나타내는 단위..? 정도라고 이해하셔도 무방합니다.)

 

이런 스펙트로그램을 만들어 CNN으로 예측을 한다는 것은 생각보다 성능이 좋지 못했습니다. 훈련의 정확도가 매우 높았음에도 불구하고, 결과값은 그러하지 못했습니다.

 

이 모델이 가장 어려워하는 문제는 BGM이 섞여 있는 멘트와 노래였습니다. 저는 이러한 문제점을 해결하고자, 멘트와 노래에 대한 차이점을 찾아보았습니다.

 

 

- 멘트는 높낮이가 없고 일정하며, 노래는 음의 높낮이가 존재한다.

 


이를 통해 저는 MR을 제거한 음성을 모델에게 학습시키면 조금 더 효율적이겠다! 라고 생각했습니다.

 

그래서 MR을 제거하는 기술을 찾아보던 중 Spleeter를 찾았습니다. 딥러닝 모델을 이용하여 음성데이터의 MR을 줄여주는 역할을 하였습니다. 노래와 배경음악을 분리하는 것뿐만 아니라, 피아노, 베이스, 드럼과 같은 악기소리도 뽑아낼 수 있다는 이점이 있었습니다.

 

Spleeter의 원문 및 깃헙 주소를 하단에 첨부하오니, 참고해주셔도 좋겠습니다!

 

저희는 이 Spleeter 모델을 이용해서 MR을 제거해보았습니다.

 

pip install spleeter를 이용해서 라이브러리를 설치한 후 진행해주셔야 합니다.

 

이후 아래와 같은 코드들로 MR 제거 음성을 추출할 수 있습니다.

from spleeter.separator import Separator

audio_path = '음성 파일 주소'
output_dir = '음성이 저장되는 장소'

separator = Separator('spleeter:2stems') # stems는 2부터 4까지 설정이 가능하다.
separator.separate_to_file(ment_audio, output_dir, duration=20000)

 

여기서  마지막 줄의 duration을 설정하지 않으면 음성이 최대 10분까지만 동작하므로, 원하는 음성의 길이에 맞게 설정해주시면 됩니다.

 

그럼 음성의 mr이 제거된 파일이 저장되게 됩니다.

 

다음 편에서는 mr이 제거된 음성에서 목소리 출현 구간을 찾아내고, 해당 목소리 출현 구간에서 목소리음악을 분류하는 법을 소개하겠습니다.

 


https://github.com/deezer/spleeter

 

GitHub - deezer/spleeter: Deezer source separation library including pretrained models.

Deezer source separation library including pretrained models. - GitHub - deezer/spleeter: Deezer source separation library including pretrained models.

github.com