[Demucs] 機械学習で音源分離・ボーカル抽出 [Python]

2022年7月17日日曜日

Artificial Intelligence

本記事では、機械学習手法Demucsを用いて音声ファイルから音源分離、ボーカル抽出を行う方法をご紹介します。

eye

Demucs

概要

DemucsはFacebookresearchによって発表された音源分離手法です。
Wave-U-NetをベースとしたU-Net CNNアーキテクチャで構成され2020年4月のv1リリースから改善を重ね、2021年12月にはv3がリリースされています。

spectrogramとwaveform domainの両方で機能するEnd to Endのhybrid source separation(ハイブリッドソース分離)であるDemucsは、SONY主催のMusic Demixing Challenge 2021で優勝した手法となっています。

arch

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、音声ファイルからボーカル抽出を行っていきます。

デモ(Colaboratory)

それでは、実際に動かしながらボーカル抽出を行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

また、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

はじめにライブラリをインストールします。

!pip install demucs
!pip install yt-dlp moviepy

最後にライブラリをインポートします。

from yt_dlp import YoutubeDL

from moviepy.video.fx.resize import resize
from moviepy.editor import VideoFileClip, AudioFileClip, ImageSequenceClip, CompositeAudioClip
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
import IPython.display as ipd

以上で環境セットアップは完了です。

音声ファイル取得

ボーカル音源を抽出したい動画をGoogle Colaboratoryにダウンロードしていきます。
YoutubeDLライブラリを使用してYoutubeから動画を取得します。

まずYoutubeのURLと切り抜き区間を設定します。

video_url = 'https://www.youtube.com/watch?v=Qd01-6xVSHk' #@param {type:"string"}

#@markdown 動画の切り抜き範囲(秒)を指定してください。\
#@markdown 30秒以上の場合OOM発生の可能性が高いため注意
start_sec =  180#@param {type:"integer"}
end_sec =  194#@param {type:"integer"}

(start_pt, end_pt) = (start_sec, end_sec)

動画をダウンロードします。

!mkdir -p /content/videos /content/audios

download_resolution = 360
full_video_path = '/content/videos/full_video.mp4'
input_clip_path = '/content/videos/input_clip.mp4'
input_audio_path = '/content/audios/input_clip.wav'

# 動画ダウンロード
ydl_opts = {'format': f'best[height<={download_resolution}]', 'overwrites': True, 'outtmpl': full_video_path}
with YoutubeDL(ydl_opts) as ydl:
    ydl.download([video_url])

指定した秒数の区間を切り抜いた動画を作成します。

# 指定区間切り抜き
with VideoFileClip(full_video_path) as video:
    subclip = video.subclip(start_pt, end_pt)
    subclip.write_videofile(input_clip_path)

切り抜いた動画から音声ファイルを取り出します。

# 音声抽出
clip = VideoFileClip(input_clip_path)
clip.audio.write_audiofile(input_audio_path, codec='pcm_s16le')

ipd.Audio(input_audio_path, rate=44100)

ボーカル抽出

それでは、取り出した音声ファイルからボーカルのみ抽出します。
Demucsライブラリを利用すればコマンド一つで実行可能です。

!python3 -m demucs --two-stems=vocals {input_audio_path}

抽出したボーカル音源を元動画に挿入し、ボーカルのみの動画を作成します。

vocal_wav = '/content/separated/mdx_extra_q/input_clip/vocals.wav'

vocal_video = '/content/vocal.mp4'

videoclip = VideoFileClip(input_clip_path)
audioclip = AudioFileClip(vocal_wav)

new_audioclip = CompositeAudioClip([audioclip])
videoclip.audio = new_audioclip
videoclip.write_videofile(vocal_video)

clip = VideoFileClip(vocal_video)
  
clip = resize(clip, height=420)
clip.ipython_display()

出力結果は以下の通りです。

ボーカルのみ綺麗に抽出された動画を作成することができています。

まとめ

本記事では、Demucsを用いてボーカル抽出を行う方法をご紹介しました。
moviepyと組み合わせて使用すると簡単にボーカルのみの動画を作成することができます。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Hybrid Spectrogram and Waveform Source Separation

2. GitHub - facebookresearch/demucs

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology