Post

VTrace:Phase-Driven Vocal Tuner

License: MIT Python

VTrace 0.6.0 (Dev)

VTrace는 Demucs AI 보컬 분리 모델과 함께 사용하도록 특별히 설계된 후처리 도구로, 보컬 볼륨 조절 및 자연스러운 보컬 감쇠 기능을 제공합니다.

이 파이프라인은 Demucs의 출력 구조(separated/demucs_model_name 폴더 안의 vocals.wavno_vocals.wav)를 기준으로 구축되어 있어, 위상 일관성이 유지된 보컬 추출을 완전 자동화할 수 있습니다.

주의: VTrace는 VR Arch, MDX-Net, Spleeter와 같은 다른 모델과는 직접적으로 호환되지 않습니다. 이러한 모델을 사용하려면 오디오를 수동으로 vocalsno_vocals 파일로 분리하고, 해당 구조에 맞게 폴더에 배치해야 합니다.



개발 배경

AI 보컬 제거 모델은 좋은 성능을 제공하지만

  • 보컬을 완전히 제거하면 배경 악기(저음역대, 리버브, 공간계 악기)까지 손실될 수 있습니다.

  • 보컬 추출 결과는 너무 건조하여, 실제 음원에서 들리는 자연스러운 공간감이 사라집니다.


AI 모델의 출력에 부드러운 감쇠를 적용함으로써, VTrace는 다음을 가능하게 합니다:

AI 모델 출력에 부드러운 감쇠 처리를 추가해,

  • 보컬 볼륨을 자연스럽게 줄이고,
  • 배경 악기를 최대한 보존하며,
  • 부드러운 보컬 추출까지 가능합니다.



기능

  • 보컬 감쇠 (Vocal Attenuation)
    보컬 볼륨을 완전히 제거하지 않고 사용자가 원하는 만큼 감쇠할 수 있습니다.

  • 자연스러운 보컬 추출 (Smooth Extraction)
    AI 모델의 결과물보다 자연스럽게 약간의 공간감과 함께 보컬을 추출합니다.

  • 악기 보존 (Instrumental Preservation)
    AI 모델에서 발생할 수 있는 배경 악기 손실을 최소화합니다.

  • 학습 데이터 생성
    보컬 감쇠 처리 과정에서 생성된 Residual Vocal은 새로운 AI 학습 데이터로 재활용할 수 있습니다.



핵심 특징

기존 AI 모델VTrace 추가 시
보컬 완전 제거보컬 볼륨 조절 (부드럽게 줄이기)
배경 손실 있음배경 악기 보존
깨짐/뭉개짐 가능성 있음깨지지 않고 자연스러운 보컬 추출





동작 원리

VTrace는 AI 모델로 분리된 무보컬(instrumental) 음원과 원본(original) 음원을 혼합(blend)하여, 보컬을 완전히 제거하지 않고 볼륨을 조절(attenuation)하는 후처리 방식입니다. 또한, Residual Subtraction 및 Phase Cancel 기법을 통해 보컬 추출과 배경 복원까지 지원합니다.



핵심 아이디어

  • AI 분리 모델로 얻은 Instrumental 음원은 보컬이 제거되어 있으나, 일부 음질 손실(저음역대, 공간계 악기 등)이 발생할 수 있습니다.
  • 따라서 원본 음원의 보컬 성분을 감쇠(attenuate)하여 자연스러운 믹스를 만들어냅니다.
  • 동시에 Residual Subtraction을 통해 보컬 성분만 추출하고, 이를 활용해 Phase Cancel 방식으로 배경 복원도 수행합니다.



수식 표현

보컬 감쇠 (Blend)

감쇠된 출력 음원 $B(t)$는 다음과 같이 계산됩니다:

\[B(t) = \alpha \cdot O(t) + (1 - \alpha) \cdot I(t)\]
  • $O(t)$: 원본(original) 신호
  • $I(t)$: AI 모델에서 추출된 무보컬(instrumental) 신호
  • $\alpha$: 보컬 감쇠 비율 (0.0 ~ 1.0)
\[\text{즉, } \alpha = 0.0 \text{이면 보컬 제거, } \alpha = 1.0 \text{이면 원본 유지}\]


Residual Subtraction (보컬 추출)

Residual Vocal은 다음과 같이 계산됩니다:

\[V_{\text{residual}}(t) = O(t) - I(t)\]

즉, 원본에서 무보컬을 빼면 보컬 성분만 남게 됩니다.


Phase Cancel (배경 복원)

Residual Vocal을 원본에서 다시 빼면 배경(Instrumental)이 복원됩니다:

\[I_{\text{phase-cancel}}(t) = O(t) - V_{\text{residual}}(t)\]



Blend Mode (가중치 계산 방식)

  • Linear 모드: $w = \alpha$
  • Exp 모드: $w = e^{-\alpha}$
  • Log 모드: $w = \log(1 + \alpha)$
  • Power 모드: $w = \alpha^{\gamma}$ (기본 $\gamma = 2$)

다양한 가중치 계산 방식으로 감쇠 곡선을 유연하게 조절할 수 있습니다.



처리 흐름

  1. 원본과 무보컬 음원의 샘플레이트채널 수를 일치시킴
  2. 선택한 Blend 모드에 따라 가중치 계산
  3. 두 음원을 합성
\[blended = (original \times w_{\text{orig}}) + (instrumental \times w_{\text{inst}})\]
  1. 클리핑 방지를 위해 Amplitude Scaling
  2. Residual Vocal 추출
\[residual = original - instrumental\]
  1. Phase Cancel (배경 복원)
\[instrumental_{\text{phase-cancel}} = original - residual\]
  1. 최종 출력은 .wav로 저장 (Normalize 처리 포함)


처리 단계 요약

처리 단계역할출력 파일 예시
Blend (보컬 감쇠)보컬 볼륨 조절 및 믹스 생성*_blended.wav
Residual Subtraction보컬 성분 추출*_vocal_residual.wav
Phase Cancel배경 복원 (보컬 제거)*_phase_cancel.wav



사용 시나리오

  • 보컬 볼륨을 줄여서 배경과 어우러지는 믹스 제작

  • 보컬의 존재감은 살리되, 원곡의 배경 악기와 자연스럽게 섞이도록 처리

  • 깨지지 않고 부드러운 보컬 추출 (감정, 발음 유지)

  • Residual Vocal을 활용한 데이터셋 구축 및 AI 모델 학습에 활용



샘플 결과 (alpha별 보컬 감쇠 및 추출 예시)

VTrace 샘플 결과 각 곡에 대해 alpha(보컬 감쇠 파라미터)를 다르게 설정하여, 보컬 음량과 보컬 추출 결과를 측정한 결과.


Song A: alpha별 보컬 감쇠 결과

버전미리 듣기
Original
alpha=0.5
alpha=0.25
alpha=0.1
alpha=0.1 phase cancel vocal extract


Song B: alpha별 보컬 감쇠 결과

버전미리 듣기
Original
alpha=0.5
alpha=0.25
alpha=0.1
alpha=0.1 phase cancel vocal extract


Song C: alpha별 보컬 감쇠 결과

버전미리 듣기
Original
alpha=0.5
alpha=0.25
alpha=0.1
alpha=0.1 phase cancel vocal extract


Song D: alpha별 보컬 감쇠 결과

버전미리 듣기
Original
alpha=0.5
alpha=0.25
alpha=0.1
alpha=0.1 phase cancel vocal extract





설치 방법

VTrace는 Conda 환경으로 제공됩니다. Anaconda, Miniconda

1
conda env create -f VTrace.yaml

설치가 완료되면, 다음 명령어로 환경을 활성화합니다:

1
conda activate vtrace

참고: VTrace.yaml은 이 프로젝트의 최상위 디렉토리에 포함되어 있습니다. 필요한 Python 버전 및 라이브러리 (numpy, librosa, soundfile, demucs 등)도 함께 설치됩니다.



실행 방법

기본 실행 명령어

1
python main.py -i <입력 폴더/파일 경로> [옵션들...]

또는 유튜브 링크를 입력하여 다운로드 + 처리:

1
python main.py -l <유튜브 링크> [옵션들...]



주요 옵션

옵션설명기본값 / 예시
-i, --input입력 파일 또는 폴더 경로input/ 또는 song.wav
-l, --link유튜브 링크 (MP3로 다운로드 후 자동 처리)https://www.youtube.com/watch?v=xxxx
-o, --output출력 폴더 경로 (생략 시 입력 폴더 하위에 생성됨)results/
-ba, --blend_alpha최종 출력용 Blend 비율 (0.0 ~ 1.0). 값이 낮을수록 보컬이 더 줄고 반주가 강조됩니다.
값이 너무 낮으면 음질이 저하될 수 있습니다.
0.1 (기본값)
-va, --voice_alpha보컬 추출용 Blend 비율 (0.0 ~ 3.0). 값이 낮을수록 보컬이 강조됩니다.
값이 너무 낮으면 왜곡이 발생할 수 있습니다.
1.0 (권장값)
--blend-mode블렌드 방식 (linear, exp, log, power)linear (기본값: linear)
--demucs-modelDemucs 모델명 (예: htdemucs_ft)htdemucs_ft (기본값: htdemucs_ft)
--device연산 장치 선택 (cpu, cuda, mps)시스템에 따라 자동 선택
-T, -t, --thread여러 곡을 병렬 처리할 프로세스 수1 (기본값: 1)
--cleanupDemucs 출력 폴더 삭제 여부True 설정 시 삭제
--eval복원 품질 평가 실행 여부 (MSE, Cosine, STOI)True 설정 시 실행
--convert_to_mp3결과 파일을 MP3로 변환할지 여부True 설정 시 변환



실행 예시

폴더 전체 처리 (보컬 감쇠 70%, 로그 블렌드 모드):

1
python main.py -i songs/ -a 0.3 --blend-mode log

유튜브 링크 다운로드 후 처리 (보컬 감쇠 85%):

1
python main.py -l https://www.youtube.com/watch?v=xxxx -a 0.15

폴더 전체 처리 및 mp3 변환 + 평가 실행:

1
python main.py -i songs/ --convert_to_mp3 --eval

Apple Silicon(M1/M2)에서 MPS GPU 가속을 활용하여, 다음 명령어는 전체 폴더의 모든 곡을 8개의 병렬 프로세스로 처리하며, 다음 옵션들이 활성화됩니다:

  • 사용자 지정 블렌드 설정 (blend_alpha, voice_alpha)
  • 복원 품질 평가 (MSE, Cosine, STOI)
  • MP3 포맷으로 변환
  • Demucs 분리 후 임시 파일 정리
1
python main.py -i songs/ -o output/ -t 8 -ba 0.1 -va 1 --cleanup --convert_mp3 --eval --device mps

📌 위 명령어는 songs/ 폴더 내 모든 오디오 파일에 대해 보컬 감쇠 및 배경음 보존 처리를 수행하며, output/ 폴더에 결과를 저장합니다.



기본 설정 (config.yaml)

별도의 config.yaml에서 기본값(알파, 블렌드 모드 등)을 설정 가능. 명령줄 옵션이 우선 적용됩니다.



요구사항

  • Python >= 3.10
  • 필요한 패키지: numpy, librosa, soundfile, demucs, ffmpeg, yt-dlp 등 (Conda 환경 파일 VTrace.yaml 제공)



파일 구조

VTrace/
├── main.py                       # VTrace 실행 메인 엔트리포인트 (CLI)
├── config_loader.py              # config.yaml 로드 및 파라미터 관리
├── logger.py                     # 로그 설정 및 출력 관리
├── VTrace.yaml                   # Conda 환경 설정 파일 (의존성 관리)
├── config.yaml                   # VTrace 기본 설정 (alpha, blend_mode, model 등)
├── README.md                     # 프로젝트 설명서
├── logs/                         # 로그 파일 저장 디렉토리
│
├── processors/                   # VTrace 핵심 처리 모듈
│   ├── vtrace_core.py            # VTrace 핵심 기능 (Residual Vocal, Phase Cancel, Blend)
│
├── separated/                    # Demucs 분리 결과 저장 디렉토리 (vocals.wav, no_vocals.wav)
│
├── audio_utils/                  # 오디오 유틸리티 함수 모음
│   ├── alignment.py              # 오디오 위상 및 채널 정렬 함수 (align_audio, align_signals)
│   ├── audio_conversion.py       # WAV → MP3 변환 함수 (convert_wav_to_mp3)
│   ├── experimental.py           # 테스트/실험용 함수 (실험 중인 코드 모음)
│   ├── filters.py                # 노이즈 게이트, 필터 처리 (테스트 코드 포함)
│   ├── loudness.py               # Gain 조정 관련 함수 (테스트 코드 포함)
│
├── utils/                        # 일반 유틸리티 함수 및 평가 모듈
│   ├── evaluate_metrics.py       # MSE, Cosine, STOI 평가 메트릭 계산
│   ├── evaluation.py             # 평가 파이프라인 관리 (결과 비교, 분석)
│   ├── file_utils.py             # 파일/경로 처리 유틸리티 (파일 이름, 경로 등)
│   ├── youtube.py                # 유튜브 다운로드 처리 모듈 (yt_dlp 연동)



버전

VTrace 0.6.0 (Dev)



결과물

  • 보컬 감쇠 오디오 파일 (*_blended.wav, *_instrumental_phase_cancel)
  • 추출된 Residual Vocal (*_vocal_residual.wav)
  • (선택) 평가 결과: MSE, Cosine, STOI



향후 계획

  • Residual Vocal 품질 향상을 위한 후처리 기능 추가
    (타이밍 보정 등)

  • 일반 사용자용 웹기반 GUI 툴킷 제공(테스트용)
    Gradio 또는 Streamlit을 사용한 경량 웹 인터페이스 제공

  • Noise Gate 및 Smoothstep 기반 감쇠 모드 추가
    더욱 세밀한 감쇠 효과 구현



🔒 라이선스

MIT License © 2025 JUNHEE LEE

라이브러리/모델라이선스출처
DemucsMIThttps://github.com/facebookresearch/demucs

This post is licensed under CC BY 4.0 by the author.