저번 2024년 12월에 열린 AWS re:Invent 2024 참여 영상 중, Las Vegas 시내를 달리는 버스에서 찍은 동영상을 Youtube 올리고 싶은데, 버스 안에서 가이드 하시는 분이, 회사를 특정할 수 있는 안내 멘트가 들어가서 올리지 못하고 고민하고 있었습니다.
그러던 와중, 사람의 목소리는 특정 주파수 대가 있고, 주변과 다른 주파수 특성으로 인하여 분리가 가능하다는 생각이 들었습니다. 그리고, 요즘은 AI 툴들이 많이 있어서, 분리가 가능할 것 같았습니다. 생각은 이정도로 하고 도전.
1. Flow
전체 작업은 다음과 같은 흐름을 따르도록 합니다. 기준은 다음과 같습니다.
원본에서 비디오와 오디오 분리 > 오디오에서 사람 목소리를 제거한 음원 > 비디오와 합체
여기서 포인트는, Audio Only 에서 Non Vocal 을 뽑아 내는 것 입니다. 인터넷을 뒤져 보니, demucs 라는 어플이 AI 를 이용해서 사람 목소리 분리가 가능하다고 하네요. 영상에서 음원을 분리하는 부분은, 제가 자주 사용하는 FFmpeg 를 곁들여서 사용하면 될 것 같습니다.
* facebookresearch / demucs
역시 신호 처리에 있어서는 God Fourier Transform 입니다.
2. Python Environment
우선, demucs 가 기동하려면, Python 이 설치되어 있어야 합니다. 이번에 알게 되었지만, Python 은 자체 환경을 만들어서, 서로 충돌이 안생기게 구획을 만들 수 있더군요. 우선, 아래 명령어를 이용하여 환경을 조성해 줍니다.
우선 python 과 pip 가 잘 설치되어 있는지 확인합니다. 저는 어느사이에 homebrew 로 설치가 되어 있었네요.
console ~ % pip3 -V
pip 25.1.1 from /opt/homebrew/lib/python3.13/site-packages/pip (python 3.13)
console ~ % which python3
/opt/homebrew/bin/python3
이제, 이번 demucs 작업을 위한 환경 구획을 만들어 줍니다. 보통, 작업할 directory 에서 실행하면 됩니다. 환경 선언 해주고, activate 주면, console 앞에 환경 이름이 붙으며, 별도 python 환경에 들어왔음을 알게 됩니다. 참고로, deactivate 하면, 해당 환경에서 벗어나게 되고, console 앞부분에 붙어 있던 환경 명칭이 없어지게 됩니다.
console workspace % python3 -m venv .venv
console workspace % source .venv/bin/activate
(.venv) console workspace %
...
(.venv) console workspace % deactivate
console workspace %
Python 버전도 자동으로 확인해 주네요.
(.venv) console workspace % .venv/bin/python3
Python 3.13.5 (main, Jun 11 2025, 15:36:57) [Clang 17.0.0 (clang-1700.0.13.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit
PIP 를 이용해서 관련 package 를 설치할 때, PIP 버전이 낮다는 메시지가 떠서 PIP 도 업그레이드 해 줍니다.
[notice] A new release of pip is available: 25.1.1 -> 25.2
[notice] To update, run: pip install --upgrade pip
(.venv) console workspace % pip install --upgrade pip
이것으로 Python 관련 환경 준비는 완료 되었습니다.
3. Applications
제일 중요한 package 는 demucs 이나, 필요한 추가 package 들이 있습니다. 필수 package 들은 , demucs / torch / torchaudio / diffq / soundfile 입니다. 특히, soundfile 은 0.12.1 버전이 깔려야 합니다. 최신버전의 경우는 package 끼리의 연동에 문제가 있었습니다. 자동으로는 최신 버전이 깔려서, 버전을 특정지어서 다시 재설치 하는 장면도 담아 봅니다.
(.venv) console workspace % pip install demucs torch torchaudio
(.venv) console workspace % pip install diffq
(.venv) console workspace % pip install soundfile
Collecting soundfile
Downloading soundfile-0.13.1-py2.py3-none-macosx_11_0_arm64.whl.metadata (16 kB)
...
(.venv) console workspace % pip install soundfile==0.12.1
...
Installing collected packages: soundfile
Attempting uninstall: soundfile
Found existing installation: soundfile 0.13.1
Uninstalling soundfile-0.13.1:
Successfully uninstalled soundfile-0.13.1
Successfully installed soundfile-0.12.1
(.venv) console workspace %
이제, 모든 준비 완료 되었으니, 설치된 application 들을 이용하여 작업을 진행하면 되겠습니다. 가능한 루트를 찾는데 시간이 꽤나 걸렸네요. 역시 open-source 는, 이 맛으로 하는것 같습니다.
4. Command Line
우선 원본 동영상에서, 비디오와 분리한, 순수 오디오만 표현하는 WAV 파일을 추출해 냅니다. 참고로, 추출할 때 WAV 포맷과 M4A 를 선택할 수 있습니다. 두 가지 모두 해본 결과, WAV 파일로 demucs 돌려서 human voice 를 제거할 때, 더 정확하게 분리할 수 있습니다. 이유는, WAV 파일은 비압축 audio 파일 이고, M4A 는 압축된 audio 파일 입니다. 머릿속에서 이미지를 그려보면, 사람 목소리가 들어가는 구간과 마무리 되는 구간에서는, 목소리의 power 가 작으므로, 압축된 파일일 수록 그 진폭이 더 줄어 듭니다. 배경소리과 사람 목소리의 구분이 모호해 지는 것 입니다. 결국, 신호처리시 이 가장자리 부분에서 왜곡이 생기게 되는것 같습니다. 차이는 저 아래에서 비교해 놓았습니다.
일단, 아래 FFmpeg 프로그램으로 MOV 파일에서 WAV 음원 파일을 추출 합니다.
ffmpeg -i IMG_5307.MOV -vn IMG_5307_out.wav
그 다음으로, demucs 를 이용하여 vocal / non_vocal 파일로 분리합니다.
demucs -n mdx_extra_q --two-stems vocals IMG_5307_out.wav
처음 실행하면, deep learning 모델 4개를 다운로드 하여, 분석에 들어갑니다.
(.venv) console workspace % demucs -n mdx_extra_q --two-stems vocals IMG_5307_out.wav
Downloading: "https://dl.fbaipublicfiles.com/demucs/mdx_final/464b36d7-e5a9386e.th" to /Users/workplace/.cache/torch/hub/checkpoints/464b36d7-e5a9386e.th
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 37.1M/37.1M [00:01<00:00, 23.5MB/s]
Downloading: "https://dl.fbaipublicfiles.com/demucs/mdx_final/14fc6a69-a89dd0ee.th" to /Users/workplace/.cache/torch/hub/checkpoints/14fc6a69-a89dd0ee.th
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 36.7M/36.7M [00:01<00:00, 22.4MB/s]
Downloading: "https://dl.fbaipublicfiles.com/demucs/mdx_final/7fd6ef75-a905dd85.th" to /Users/workplace/.cache/torch/hub/checkpoints/7fd6ef75-a905dd85.th
100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 37.6M/37.6M [00:01<00:00, 22.7MB/s]
Selected model is a bag of 4 models. You will see that many progress bars per track.
Separated tracks will be stored in /Users/workplace/separated/mdx_extra_q
Separating track IMG_5307_out.wav
100%|████████████████████████████████████████████████████████████████████████| 660.0/660.0 [02:06<00:00, 5.20seconds/s]
100%|████████████████████████████████████████████████████████████████████████| 660.0/660.0 [02:05<00:00, 5.28seconds/s]
100%|████████████████████████████████████████████████████████████████████████| 660.0/660.0 [02:06<00:00, 5.21seconds/s]
100%|████████████████████████████████████████████████████████████████████████| 660.0/660.0 [02:09<00:00, 5.09seconds/s]
(.venv) console workspace %
그러면, 아래와 같이 소리에 포함된 음원들을 추출해 줍니다. 버스 안밖에서 들리는 음악으로 인하여 drums 나 bass 등이 들어갔는데, 우리가 볼껀, no_vocal.wav 파일 입니다.
이제, 사람 목소리가 제거된 no_vocal.wav 파일을 얻었으니, FFmpeg 로 합쳐 줍니다. 원본에서 video 만 가져오고, demucs 를 통해 얻은 no_vocal audio 를 붙이는 FFmpeg command 입니다. 그 외 옵션들은 MP4 에 특화된 색상과 codec 등을 정의한 것이니, '-map 0:v:0 -map 1:a:0' 이 부분만 주의하면 되겠습니다.
ffmpeg -i IMG_5307.MOV -i separated/mdx_extra_q/IMG_5307/no_vocals.wav -map 0:v:0 -map 1:a:0 -pix_fmt yuv420p -c:v libx264 -c:a aac -b:a 192k IMG_5307_no_vocals.mp4
이로써, 사람 목소리가 제거된 동영상이 완성 되었습니다.
5. WAV vs. M4A
자, 그러면, 앞서 이야기한, WAV 파일에서 no_vocal 을 한 것과, M4A 에서 no_vocal 한 내용의 비교 입니다. 비압축 audio 파일인 WAV 에서 좀더 깔끔하게 human voice 가 제거된 것을 알 수 있습니다. 각각 분리한 후, 다시 합하여서, 비교할 수 있도록 동일 구간만 따로 만들었습니다.
MOV > FFmpeg M4A (audio split) > demucs no_vocal (extract) > merge to MP4
MOV > FFmpeg WAV (audio split) > demucs no_vocal (extract) > merge to MP4
확연히 차이가 나죠?
5. Final
작업을 모두 마치고, 완성된 동영상을 Youtube 에 올렸습니다. 사람 음성 소거한 부분이 조금 부자연 스러운 것은 지금 수준에서는 어쩔 수 없을 듯 합니다. 그렇지만, 최종 결과물이 특정 회사나 인물을 확인할 수 없도록 만들어 졌으므로, 성공이라고 할 수 있겠습니다.
* Dec 5, 2024 – Las Vegas at 6 AM from Luxor Hotel to The Venetian
위의 모든 과정이 참고가 되었으면 좋겠습니다.
FIN




댓글
댓글 쓰기